Solit 2014, Опыт участия в конкурсе по спортивному...

Preview:

DESCRIPTION

Иван Поляков, Минск. Программист, занимается разработкой компьютерных игр (Shareware / Indy) с 99 года. Закончил ФПМИ БГУ, где участвовал в чемпионатах ACM по программированию. «Опыт участия в недавно прошедшем конкурсе по спортивному программированию Russian AI Cup 2013″. Development секция. Не упустите возможности узнать, как думают алгоритмически участники олимпиад. (http://russianaicup.ru/profile/Cooler – 15-е место в финале, 11-е место в песочнице – это лучший результат среди участников из Беларуси). Об особенностях задачи, о принципах работы моего решения и особенностях решений некоторых других участников из топа, о вероятных ошибках и способах их избежать. P.S. Рассказ победителя конкурса имеется тут – http://habrahabr.ru/post/206680/

Citation preview

Спортивное программирование - это не страшно!

Опыт участия в конкурсе

Russian AI Cup 2013 CodeTroopers

Russian AI Cup - соревнование по программированию искусственного интеллекта (AI).

Задача: написать AI, управляющий отрядом солдат в пошаговой стратегии.

Стратегии соревнуются между собой в боях:

О конкурсе: постановка задачи

СЕРВЕРСТРАТЕГИЯ

СТРАТЕГИЯСТРАТЕГИЯ

Состояние игрового мира

Действие

О конкурсе: принцип боя

5 видов юнитов, 3 типа бонусов:

О конкурсе: правила игры

Юниты ходят по очереди, на ход дается 10-12 очков действия.

За нанесение урона / уничтожение юнитов противника начисляются очки.

Побеждает команда, набравшая больше очков (даже если все её бойцыбыли уничтожены).

Лимит времени: 0.2 секунды на ход (в среднем).

Видимость несимметрична: A не видит B, но B видит A

“Физический смысл” видимости:

О конкурсе: видимость

вид сбоку

О конкурсе: формат соревнования

• языковой пакет - скелет стратегии

• Local Runner

• Repeater

Набор участника

CodeTroopers (2013)

• игра пошаговая

• четкие, однозначные правила позволяют точно предсказать состояние игрового мира

• игра с неполной информацией

Отличия от CodeTanks

CodeTanks (2012)

● игра реального времени

● симуляция физики с неизвестными параметрами

Отличия от “обычного” соревнования:

• продолжительность: не 4-5 часов, а 4-5 недель

• сравнительно большой обьем кода, итерационная разработка

• упор не на эффективность алгоритмов, а на способность к развитию

• поэтому архитектура, расширяемость и удобство отладки имеют большое значение

Отличия от разработки AI для реальных игр:

• В реале обычно иная цель - чтобы AI играл интересно, развлекал игрока. А не тупо выигрывал.

Отличительные особенности

• Нет смысла делать версию, которую потом придется полностью переделывать. Эвристики - путь тупиковый, поэтому нужно сразу писать перебор.

• Ключевые факторы - скорость развития и отсутствие багов. Поэтому нужны хорошие средства отладки.

• Нюансы решают! Не усложнять!

• План развития: добавлять фичи, углублять перебор, оптимизировать параметры (возможно генетическим алгоритмом?)

Строим начальный план

Глобальный AIАнализирует состояние игрового мира,

ставит глобальные цели,меняет параметры локального AI для

достижения глобальных целей.

Архитектура базовой версии

Локальный AIпринимает решение по текущему ходу

Перебор всех возможных действий

(с отсечением)

Оценочная функция

Базовая версия учитывает такие факторы:

• общее здоровье команды

• продвижение к глобальной цели

• “выгодность” занимаемых клеток (4x-3y)

• расстояние до остальных членов команды (особенно для командира и медика

• стойку и возможность нанесения урона видимым противникам

• невидимость для известных противников

• наличие бонусов

Оценочная функция

Отладчик-визуализатор

Логи перебора

При тестировании боя создается 200-400 Mb логов с описанием всех перебираемых вариантов действий:

1. Протестировать очередной бой.

2. Что-то не так?

3. Выяснить причину неразумного поведения по логам

4. Проблема может быть решена оптимизацией параметров?

5. Если нет - подумать над добавлением новой фичи.

Принцип доработки

Фичи, добавленные до 1-го раунда

• использование всех типов бонусов

• pathfinding для определения расстояния между юнитами / целями

• сохранение позиций врагов в течение хода

• определение известных карт

• обнаружение скрытого урона

• стратегия “доения медика”

• стратегия избегания “доения”

• авиаразведка и стратегия добивания

Добавление фич

Оптимизация параметров редко позволяет добиться принципиально иного поведения в бою. Уровень игры стратегии упирается в потолок.

А добавление новых фич способно сломать слаженную работу имеющихся параметров оценочной функции.

Фичи vs оптимизация

Чтение форумов позволяет узнать, над чем работают другие.

Учиться лучше на чужих ошибках.

Наблюдение за соперниками

Общий рейтинг песочницы не дает хорошего представления об уровне игры новых версий.

Можно создавать бои вручную на сервере:

Где мы находимся?

Ограничения Local Runner:

• доступна лишь одна карта

• ограниченность в выборе соперников

Что делать?

а) взломать и модифицировать Local Runner

б) написать свой аналог

Локальное тестирование

Проверка боем даёт самые достоверные сведения о реальном положении дел!

1. Это уникальная возможность для сравнения версий.

2. Возможность проверки корреляции результатов раунда с результатами локального тестирования.

1-й раунд!

Опираемся на результаты локального тестирования:

• масштабный тюнинг параметров

Новые фичи:

• Оценка вероятности гранатных атак

• Сохранение информации о врагах между ходами

• Базовое определение порядка ходов

• Определение возможных позиций невидимых врагов при получении урона

• Возможность бросать гранаты в невидимые клетки

• Учёт уничтоженных врагов

• Waypoints

Дальнейшее развитие

Сумма линейных функций - линейна.

Максимум такой функции - всегда на краях диапазона.

Иногда это хорошо, но бывает так, что нужен компромисс.

Проблема крайностей

Убегать Нападать

Риска практически нет, поэтому те же принципы, что и в первом раунде:

• ручной сбор статистики

• сравнение версий между собой и с результатами локального тестирования

2-й раунд!

Почему эволюционный алгоритм не годится:

• еще много нереализованных фич!

• слишком долго: выгоднее потратить время на фичи

• есть опасность, что “не сработает” в реальном бою из-за нерепрезентативной / ограниченной популяции

• люди говорят, что именно так оно и выходит :(

Что делать?

Оптимизировать параметры путём “ручной эволюции” (похоже на линейное программирование).

Эволюция

Углубление перебора - FAILED! (а ведь предупреждали!)

Почему так?

• Игра с неполной информацией - неопределённость слишком велика.

• Большое количество нюансов делает задачу крайне сложной как в реализации, так и в дебаге.

Итог: 3 дня (из 5) потрачено впустую :(

Дальнейшее развитие

Новые фичи:

• Поле вероятности врагов

• Динамическая карта выгодности/опасности

• Более точное определение порядка ходов

• Режимы: разведка, бой, отступление, суицид.

• Вейпоинты и параметры, зависящие от карты и типа юнита.

• Учет промежуточных положений (разведка)

Дальнейшее развитие - 2

Причины (на мой взгляд) неудачи в финале:

• потеря времени на углубленный поиск

• отсюда: недоработанность фич, баги, недостаточная оптимизация параметров

• локальное сравнение версий уже не дает хорошего результата

А как надо было делать?

• Формат финала сильно отличается - начинать работу над ним следовало еще задолго до 2-го раунда (а ведь так и планировал!)

• Необходимо было оставить хотя бы 2 дня на подгонку параметров и проверку работы стратегии на реальных противниках.

ФИНАЛ

После завершения конкурса все любят рассказывать: “Как я это сделал!”

Оказалось что:

• Большинство стратегий устроены и работают примерно одинаково.

• Многие топы (но не slash!) делали визуализаторы.

• Реализация перебора у slash’а весьма оригинальна.

• Никто из участников финала, рассказавших о своих стратегиях, не использовал перебор глубже чем на 1 ход (зато со свистелками!)

• Большинство финалистов не реализовали всё, что хотели.

А что же другие?

Очень хороший уровень организации. Никаких накладок и сбоев.

Интересная задача: достаточно глубокая, с разнообразными подходами к решению.

Впечатления от конкурса

Вопросы?

Кстати, их можно задать и по почте: cooler@tut.by ;)

А рассказ победителя можно почитать тут: http://habrahabr.ru/post/206680/

Спасибо за внимание!

Recommended