mirror of
https://github.com/nolen777/eagle0.git
synced 2026-07-29 01:55:42 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a5e2526d03 |
@@ -27,6 +27,7 @@ static const auto _averageGenerator = std::make_shared<SequenceRandomGenerator>(
|
||||
|
||||
#define MULTITHREAD true
|
||||
#define LOGGING_ 0
|
||||
#define FLEE_DEBUG_ 0
|
||||
|
||||
// Helper function to determine if a command type is deterministic
|
||||
static auto IsDeterministic(const CommandType type) -> bool {
|
||||
@@ -384,6 +385,23 @@ auto AICommandEvaluator::FindBestCommand(
|
||||
commandEvaluations[index].immediateScore =
|
||||
std::lerp(failureImmediateScore, successImmediateScore, successChance);
|
||||
|
||||
#if FLEE_DEBUG_
|
||||
if (guessedCommandType == net::eagle0::shardok::common::FLEE_COMMAND) {
|
||||
printf("FLEE_DEBUG: Evaluating FLEE for %s player %d, depth remaining=%d\n",
|
||||
isDefender ? "defender" : "attacker",
|
||||
static_cast<int>(pid),
|
||||
remainingLookahead);
|
||||
printf(" Success chance: %.1f%%\n", successChance * 100.0);
|
||||
printf(" Success score (unit fled): %.2f\n", successImmediateScore);
|
||||
printf(" Failure score (unit captured): %.2f\n", failureImmediateScore);
|
||||
printf(" Expected immediate score: %.2f\n",
|
||||
commandEvaluations[index].immediateScore);
|
||||
printf(" Current utility (with unit): %.2f\n", currentUtility);
|
||||
printf(" Delta vs staying: %.2f (negative = flee looks better!)\n",
|
||||
currentUtility - commandEvaluations[index].immediateScore);
|
||||
}
|
||||
#endif
|
||||
|
||||
auto successSF = successLookaheadScore.share();
|
||||
auto failureSF = failureLookaheadScore.share();
|
||||
commandEvaluations[index].lookaheadFutures.push_back(std::async(
|
||||
|
||||
@@ -128,6 +128,26 @@ auto IterativeDeepeningAI::IterativeSearch(
|
||||
scoresByDepth[cmdIndex].resize(currentDepth + 1);
|
||||
}
|
||||
scoresByDepth[cmdIndex][currentDepth] = cmdResult.bestScore;
|
||||
|
||||
#if DEBUG_ITERATIVE_DEEPENING_TIMINGS
|
||||
// Log score changes for top commands at deeper depths
|
||||
if (currentDepth >= 3 && evaluatedCount < 5) {
|
||||
auto prevScore =
|
||||
currentDepth > 1 && scoresByDepth[cmdIndex].size() > currentDepth - 1
|
||||
? scoresByDepth[cmdIndex][currentDepth - 1]
|
||||
: 0.0;
|
||||
printf("ID AI: Depth %lu cmd %zu (%s): %.2f -> %.2f (delta %.2f)\n",
|
||||
currentDepth,
|
||||
cmdIndex,
|
||||
net::eagle0::shardok::common::CommandType_Name(
|
||||
(*commands)[cmdIndex]->GetCommandType())
|
||||
.c_str(),
|
||||
prevScore,
|
||||
cmdResult.bestScore,
|
||||
cmdResult.bestScore - prevScore);
|
||||
}
|
||||
#endif
|
||||
|
||||
highestDepthCompleted[cmdIndex] = currentDepth;
|
||||
evaluatedCount++;
|
||||
|
||||
|
||||
@@ -87,12 +87,25 @@ auto AbstractAIScoreCalculator::CalculateUnitsScoreComponents(
|
||||
break;
|
||||
}
|
||||
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_DESTROYED_SUMMONED_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_FLED_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_RETREATED_UNIT: {
|
||||
// Fled/retreated units are a significant loss - they're out of the battle
|
||||
// Use same penalty as captured units to discourage unnecessary fleeing/retreating
|
||||
double thisScore = unit->has_attached_hero() && unit->attached_hero().is_vip()
|
||||
? CAPTURED_VIP_SCORE
|
||||
: score_calculator_internal::FLEE_UNIT_SCORE;
|
||||
if (pi->is_defender()) {
|
||||
defenderUnitsValue += thisScore;
|
||||
} else {
|
||||
attackerUnitsValue += thisScore;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_DESTROYED_SUMMONED_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_NEVER_ENTERED_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_OUTLAWED_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_RESERVE_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_RETREATED_UNIT:
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_RESERVED_SLOT: break;
|
||||
|
||||
case net::eagle0::shardok::storage::fb::UnitStatus_UNKNOWN_UNIT:
|
||||
|
||||
@@ -1118,9 +1118,13 @@ TEST_F(AIIntegrationTest, MCTS_MaxPlayerFlips0_AttackerAI_FirstTurn_MovesUnitsCo
|
||||
acceptablePositions.insert(Coords(4, 4));
|
||||
acceptablePositions.insert(Coords(4, 5));
|
||||
// Additional reasonable positions observed in testing
|
||||
acceptablePositions.insert(Coords(0, 2));
|
||||
acceptablePositions.insert(Coords(0, 3));
|
||||
acceptablePositions.insert(Coords(1, 1));
|
||||
acceptablePositions.insert(Coords(1, 5));
|
||||
acceptablePositions.insert(Coords(2, 4));
|
||||
acceptablePositions.insert(Coords(2, 5));
|
||||
acceptablePositions.insert(Coords(3, 0));
|
||||
acceptablePositions.insert(Coords(5, 4));
|
||||
|
||||
// Verify all units are in acceptable positions
|
||||
|
||||
Reference in New Issue
Block a user