package games.strategy.triplea.ai.fastAI; import java.util.Collection; import java.util.List; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Unit; import games.strategy.engine.data.UnitType; import games.strategy.triplea.delegate.BattleCalculator; import games.strategy.triplea.oddsCalculator.ta.AggregateResults; import games.strategy.util.IntegerMap; import games.strategy.util.Tuple; public class AggregateEstimate extends AggregateResults { private static final long serialVersionUID = -3139949663921560523L; private final int battleRoundsFought; private final double winPercentage; private final List<Unit> remainingAttackingUnits; private final List<Unit> remainingDefendingUnits; public AggregateEstimate(final int battleRoundsFought, final double winPercentage, final List<Unit> remainingAttackingUnits, final List<Unit> remainingDefendingUnits) { super(1); this.battleRoundsFought = battleRoundsFought; this.winPercentage = winPercentage; this.remainingAttackingUnits = remainingAttackingUnits; this.remainingDefendingUnits = remainingDefendingUnits; } @Override public List<Unit> getAverageAttackingUnitsRemaining() { return remainingAttackingUnits; } @Override public List<Unit> getAverageDefendingUnitsRemaining() { return remainingDefendingUnits; } @Override public Tuple<Double, Double> getAverageTUVofUnitsLeftOver(final IntegerMap<UnitType> attackerCostsForTUV, final IntegerMap<UnitType> defenderCostsForTUV) { final double attackerTUV = BattleCalculator.getTUV(remainingAttackingUnits, attackerCostsForTUV); final double defenderTUV = BattleCalculator.getTUV(remainingDefendingUnits, defenderCostsForTUV); return Tuple.of(attackerTUV, defenderTUV); } @Override public double getAverageTUVswing(final PlayerID attacker, final Collection<Unit> attackers, final PlayerID defender, final Collection<Unit> defenders, final GameData data) { final IntegerMap<UnitType> attackerCostsForTUV = BattleCalculator.getCostsForTUV(attacker, data); final IntegerMap<UnitType> defenderCostsForTUV = BattleCalculator.getCostsForTUV(defender, data); final int attackerTotalTUV = BattleCalculator.getTUV(attackers, attackerCostsForTUV); final int defenderTotalTUV = BattleCalculator.getTUV(defenders, defenderCostsForTUV); final Tuple<Double, Double> average = getAverageTUVofUnitsLeftOver(attackerCostsForTUV, defenderCostsForTUV); final double attackerLost = attackerTotalTUV - average.getFirst(); final double defenderLost = defenderTotalTUV - average.getSecond(); return defenderLost - attackerLost; } @Override public double getAttackerWinPercent() { return winPercentage; } @Override public double getAverageBattleRoundsFought() { return battleRoundsFought; } }