Ways to represent factors that affect outcome of simulated battle between two armies?

Hi, I’m currently working on a system that manages multiple factions that make their own decisions and react to other faction actions. One of the main parts of this system is managing control points (or territory), where factions can conquer or lose control points throughout the map. I have a lot of it set up where factions can send troops to the control point they wish to attack/defend depending on several factors etc, however I’m struggling with coming up with ways to make the simulated battles more interesting.

At the moment it’s very basic; I track how many defenders are at control point X and how many attackers have been sent to try and conquer it. I then simulate the winner by comparing soldier counts/adjusting soldier strength based on the faction’s traits. As you can probably guess a lot of the time the faction that has the largest amount of soldiers just steamrolls everyone else (which i guess kind of makes sense) but it becomes too easy for one faction who had a lucky start for recruiting soldiers to dominate everything.

Here’s where my question comes in I guess, I’ve thought of ways to potentially even the playing field for smaller factions depending on other factors such terrain, defensive advantages, even weather, but am completely at a loss at how to represent this in a way where I can use it in the battle simulation.

Does anyone have any resources that I could look into for this sort of thing or any suggestions on where I could start? It’d be greatly appreciated!