BuildOrder Tools::GetOptimizedNaiveBuildOrder(const GameState & state, const BuildOrderSearchGoal & goal) { BuildOrder bestBuildOrder = GetNaiveBuildOrderAddWorkers(state, goal, 4); FrameCountType minCompletionTime = bestBuildOrder.getCompletionTime(state); UnitCountType bestNumWorkers = bestBuildOrder.getTypeCount(ActionTypes::GetWorker(state.getRace())); for (UnitCountType numWorkers(8); numWorkers < 27; ++numWorkers) { BuildOrder buildOrder = Tools::GetNaiveBuildOrderAddWorkers(state, goal, numWorkers); FrameCountType completionTime = buildOrder.getCompletionTime(state); UnitCountType workers = buildOrder.getTypeCount(ActionTypes::GetWorker(state.getRace())); if (completionTime <= minCompletionTime + ((workers-bestNumWorkers)*24)) { minCompletionTime = completionTime; bestBuildOrder = buildOrder; } } FrameCountType bestCompletionTime = bestBuildOrder.getCompletionTime(state); BuildOrder testBuildOrder; //std::cout << "Found a better build order that takes " << bestCompletionTime << " frames\n"; while (true) { const static ActionType gateway = ActionTypes::GetActionType("Protoss_Gateway"); InsertActionIntoBuildOrder(testBuildOrder, bestBuildOrder, state, gateway); FrameCountType completionTime = testBuildOrder.getCompletionTime(state); if (completionTime < bestCompletionTime) { //std::cout << "Found a better build order that takes " << completionTime << " frames\n"; bestCompletionTime = completionTime; bestBuildOrder = testBuildOrder; } else { break; } } return bestBuildOrder; }
void Tools::InsertActionIntoBuildOrder(BuildOrder & result, const BuildOrder & buildOrder, const GameState & initialState, const ActionType & action) { int bestInsertIndex = -1; BuildOrder runningBuildOrder; GameState runningState(initialState); FrameCountType minCompletionTime = buildOrder.getCompletionTime(initialState); BuildOrder testBuildOrder = buildOrder; for (size_t insertIndex(0); insertIndex < buildOrder.size(); ++insertIndex) { // if we can test the action here, do it if (runningState.isLegal(action)) { // figure out the build time of build order with action inserted here GameState tempState(runningState); tempState.doAction(action); for (size_t a(insertIndex); a < buildOrder.size(); ++a) { tempState.doAction(buildOrder[a]); } FrameCountType completionTime = tempState.getLastActionFinishTime(); if (completionTime < minCompletionTime) { minCompletionTime = completionTime; bestInsertIndex = insertIndex; } } BOSS_ASSERT(runningState.isLegal(buildOrder[insertIndex]), "We have made the next action illegal somehow"); runningBuildOrder.add(buildOrder[insertIndex]); runningState.doAction(buildOrder[insertIndex]); } result.clear(); for (size_t a(0); a<buildOrder.size(); ++a) { if (bestInsertIndex == a) { result.add(action); } result.add(buildOrder[a]); } }