Университет Ватерлоо при поддержке Google организовал состязание по спортивному программированию ботов для игры стратегии реального времени Galcon. С виду игра очень простая — есть планеты и корабли (на планетах или в полёте) надо захватить или преобладать на всей карте. Бот можно написать на большинстве популярных языков — C#, Java, Python, C++, Scala, PHP — для этого надо скачать «starter package», запустить у себя из консоли эмулятор и тренироваться покуда не будет Совершенство которое можно залить на сайт.
Стратегии которые можно реализовать — большая ценность и в то же время без кода они ничто. Я не буду рассматривать варианты с генетическим программированием, поскольку для этого надо хранить хромосомы, по несколько сотен раз запускать одну и ту же карту что-бы получить стабильный вид.. и в конце концов бот будет с зашитыми матрицами поведения которые нельзя поменять против других противников.
Итак некоторые общие стратегии
- Начинайте максимальным полным захватом планет — это даст максимальный прирост продуктивности особенно необходимой вначале игры. Внутренние состояния игры можно помещать в глобальные переменные вне doTurn()
- Атаковать планеты со смешанной сортировкой — пропорционально их продуктивности и обратно пропорционально защите и расстоянию до неё
- Высылать подмогу своим планетам которые атакованы или имеют наибольшую пропорцию в продуктивности к защите — это равноценно распределяет силы по своим планетам
- Прогнозировать исход битвы учитывая все входящие корабли и продуктивность планеты
- Учитывать начальную позицию и общую топологию региона — некоторые карты заранее проигрышные(карты симметричны)
- Менять агрессивность в зависимости от прогноза будущего получаемого от сравнивания себя с противником через размер всего флота + X ходов вперёд * продуктивность планет
Тактика
Я пару раз видел столкновение идентичных ботов и отличались они долгим противостоянием. Частные случаи поведения разнообразят поведение..
- «Сдерживание» — атаковать нейтральные планеты которые атакует противник так, что-бы сразу сразу после захвата планета перешла нам. Работает правда только при одиночных ударах — при постоянном потоке потребуется больше затрат
- «Фронтовик» — высылать подмогу планетам которые ближе к врагу
- «С мира по нитке» — не высылать большие группы кораблей, а атаковать одиночными пачками в зависимости от продуктивности планеты
- «Превентивный удар» — отбивать планеты которые ближе всего. Это повысит прогнозируемость, поскольку противник будет дольше лететь
- «Отступление» — сдавать планету если заведомо известна её потеря (невозможность подмоги) + плохой прогноз на будущее + есть рядом нейтральная планета, захватив которую можно получить прирост продуктивности