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; }