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

31
Спортивное программирование - это не страшно! Опыт участия в конкурсе Russian AI Cup 2013 CodeTroopers

Upload: solit

Post on 02-Nov-2014

120 views

Category:

Technology


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

Russian AI Cup 2013 CodeTroopers

Page 2: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

Действие

Page 3: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

Page 4: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

Page 5: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

вид сбоку

Page 6: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

Page 7: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

• Local Runner

• Repeater

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

Page 8: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

CodeTroopers (2013)

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

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

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

Отличия от CodeTanks

CodeTanks (2012)

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

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

Page 9: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

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

Page 10: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

Page 11: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

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

Page 12: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

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

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

Page 13: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

Page 14: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

Page 15: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

Page 16: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

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

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

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

Page 17: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

Page 18: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

Page 19: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

Page 20: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

Что делать?

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

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

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

Page 21: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

1-й раунд!

Page 22: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

Новые фичи:

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

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

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

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

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

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

• Waypoints

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

Page 23: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

Page 24: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

2-й раунд!

Page 25: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

Что делать?

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

Эволюция

Page 26: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

Почему так?

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

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

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

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

Page 27: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

Новые фичи:

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

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

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

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

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

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

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

Page 28: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

ФИНАЛ

Page 29: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

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

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

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

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

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

Page 30: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

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

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

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

Page 31: Solit 2014, Опыт участия в конкурсе по спортивному программированию Russian Al Cup 2013, Поляков Иван

Вопросы?

Кстати, их можно задать и по почте: [email protected] ;)

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

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