miniaicups icon indicating copy to clipboard operation
miniaicups copied to clipboard

😱 Расчет времени на выполнение стратегий.

Open mortido opened this issue 5 years ago • 4 comments

На данный момент в ЛР нет проверки что стратегия потратила все время на вычисления доступное ей, но в нем есть TCPClient где это функция реализованная. Если этот клиент используется на серврах для работы с докерами, то существует проблема. Как заметил Иван Дашкевич сначала происходит отсылка состояний мира (после чего стратегии уже могут начать считать свой ход) а только потом в отдельном цикле идет запрос на получение ответа. Если мы правильно трактуем код, то время выполнения 2-го игрока начнет тикать только после получения ответа от первого, что дает преимущество.

Предложение на рассмотрение: стартовать отсчет времени внутри клиента после отсылки именно ему состояния мира, либо делать оба действия одновременно: отослать, стартануть счетчик, получить ответ, посчитать время выполнения.

mortido avatar Jul 20 '19 12:07 mortido

Вызовы get_command идут последовательно для каждого player-а, это не зависит от реализации клиента. Второй player начинает считать одновременно с первым, а его время бежит только с момента окончания get_command для первого. Это уже не небольшое преимущество, а даже очень большое. Если на сервере используется та же реализация Game, то какой бы там ни был клиент - баг сохранится.

spaceorc avatar Jul 20 '19 12:07 spaceorc

смежный вопрос: а если какойто бот занимает весь 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();

Pro100AlexHell avatar Jul 20 '19 16:07 Pro100AlexHell

смежный вопрос: а если какойто бот занимает весь 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();

Такой проблемы реально нет - на сервере они в контейнерах запускаются независимо.

spaceorc avatar Jul 21 '19 09:07 spaceorc

Такой проблемы реально нет - на сервере они в контейнерах запускаются независимо.

Гипотеза: имеем 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 будет исполняться на чем-то конкретном, да к тому же постоянно на одном и том же? Никак :) Ну т.е тестили на одном, раунд на другом, а финал на третьем. А может ктото избранный на сильном железе, а ктото неудачник - на слабом железе, и просядет по таймингу, который в МС измеряется.

Pro100AlexHell avatar Jul 24 '19 02:07 Pro100AlexHell