miniaicups
miniaicups copied to clipboard
😱 Расчет времени на выполнение стратегий.
На данный момент в ЛР нет проверки что стратегия потратила все время на вычисления доступное ей, но в нем есть TCPClient где это функция реализованная. Если этот клиент используется на серврах для работы с докерами, то существует проблема. Как заметил Иван Дашкевич сначала происходит отсылка состояний мира (после чего стратегии уже могут начать считать свой ход) а только потом в отдельном цикле идет запрос на получение ответа. Если мы правильно трактуем код, то время выполнения 2-го игрока начнет тикать только после получения ответа от первого, что дает преимущество.
Предложение на рассмотрение: стартовать отсчет времени внутри клиента после отсылки именно ему состояния мира, либо делать оба действия одновременно: отослать, стартануть счетчик, получить ответ, посчитать время выполнения.
Вызовы get_command идут последовательно для каждого player-а, это не зависит от реализации клиента. Второй player начинает считать одновременно с первым, а его время бежит только с момента окончания get_command для первого. Это уже не небольшое преимущество, а даже очень большое. Если на сервере используется та же реализация Game, то какой бы там ни был клиент - баг сохранится.
смежный вопрос: а если какойто бот занимает весь CPU ? они же параллельнро все 6 выполняют просчеты. Не будет ли проблем и с расчетом времени (у всех будет долгое), даже если считать начинать в один момент. Тогда логичней последовательно запускать так: string jsonToBots = GenerateInputJsonForBots(); string[] jsonOutputsFromBots = string[6]; for (int botIndex = 0; botIndex < 6; botIndex++) { long timeStart = DateTime.Now SendInputToBot(botIndex , jsonToBots); jsonOutputsFromBots[botIndex] = WaitOutputFromBot(botIndex ); long timeElapsed = DateTime.Now - timeStart ; ValidateTimeElapsedForBot(timeElapsed, botIndex); } ProcessAllOutputsSimultaneously(jsonOutputsFromBots); UpdateMap();
смежный вопрос: а если какойто бот занимает весь CPU ? они же параллельнро все 6 выполняют просчеты. Не будет ли проблем и с расчетом времени (у всех будет долгое), даже если считать начинать в один момент. Тогда логичней последовательно запускать так: string jsonToBots = GenerateInputJsonForBots(); string[] jsonOutputsFromBots = string[6]; for (int botIndex = 0; botIndex < 6; botIndex++) { long timeStart = DateTime.Now SendInputToBot(botIndex , jsonToBots); jsonOutputsFromBots[botIndex] = WaitOutputFromBot(botIndex ); long timeElapsed = DateTime.Now - timeStart ; ValidateTimeElapsedForBot(timeElapsed, botIndex); } ProcessAllOutputsSimultaneously(jsonOutputsFromBots); UpdateMap();
Такой проблемы реально нет - на сервере они в контейнерах запускаются независимо.
Такой проблемы реально нет - на сервере они в контейнерах запускаются независимо.
Гипотеза: имеем 1 ядерный CPU, имеем 6 ботов, если конкуренция за ресурс - есть проблема не верного учета, потому что время будет идти за всех 6, а виноват может быть кто-то один. Там точно много ядер? И с какими характеристиками?
Если там 6 ядерный CPU - это другая гипотеза, и даже там может быть проблема, потому что никто не гарантирует на bind process to CPU core. Или гарантирует?
И даже если bind AI-1 to CORE-1 .. AI-6 to CORE-6.. что до самого питона, там вызывается async-await, и не известная махинация с процессами под копотом, хотя этим уже можно и пренебречь думаю.
И где вообще спецификации железа? Как юзеры могут например расчитывать что их AI будет исполняться на чем-то конкретном, да к тому же постоянно на одном и том же? Никак :) Ну т.е тестили на одном, раунд на другом, а финал на третьем. А может ктото избранный на сильном железе, а ктото неудачник - на слабом железе, и просядет по таймингу, который в МС измеряется.