ФлеймФорумПрограммирование

CodeRacing 2015 [Russia AI Cup] (19 стр)

Страницы: 114 15 16 17 18 19
#270
3:27, 21 дек 2015

}:+()___ [Smile], ты хоть в этом году и не занял призовое в финале, но хотелось бы услышать, как у тебя всё работает. По опыту предыдущих лет, твоя стратегия обычно всё же отличается от других.  Как минимум, в ней больше математики.
Если лень писать статью, то хотя-бы пост в топике на форуме хотелось бы

ud1, ну и ждём твоё описание/сорцы, в дополнение к видео

#271
12:41, 24 дек 2015

Смайл молчит, что-то...

#272
2:33, 26 дек 2015

В общем, моя стратегия. В одном файле, ибо я ленивый, как ud1.
Общая схема у меня такая же, как и у всех топов, пройдусь по отдельным подсистемам.

Поиск пути у меня похожий на таковой у sskolot.
Сначала были карты, построенные волновым алгоритмом по клеткам, для каждой целевой точки по одной.
Потом вместо клетки я сделал 12 направлений в ней (4 прямых и 8 диагональных), взял с потолка матрицы переходов, и генерировал карту (многоуровневую) для всей трассы.
После, вместо одного значения на клетку стал считать псевдонепрерывное расстояние до финиша с учетом ориентации машинки.

Перебор траекторий я задумывал состоящим из двух частей: построение траектории с нуля и мутация лучших.
Мутационная часть должна была помочь с недостаточной точностью предсказания физики и выправлять "уплывшие" траектории,
но, в итоге, это работало недостаточно хорошо и опыт santa324 показал, что лучше было бы заняться оптимизацией точного 10-итерационного предсказателя.

Ну, а теперь, самое интересное — генератор траекторий.
В первых версиях траектории набирались из кусков некоторой фиксированной полной продолжительности, внутри которых была пара поворотов в случайные моменты времени.
Причем, я давал машинке, после достижения времени окончания куска, проехать еще пару тайлов и запоминал состояние в момент пересечения границ этих тайлов.
Из всех таких состояний для разных траекторий выживали только с максимальным пройденным путем (в тайлах) и максимальным без единицы.
Для этих двух расстояний выживала не одна лучшая или, наоборот, все траектории; я проводил классификацию состояний машинки и запоминал лучшее в каждой группе.
Классификация была по положению в тайле (2 или 4 группы на границе клетки) и ориентации (16 вариантов), потом добавился 1 бит от модуля скорости.
В качестве стартовых состояний для следующего куска траектории я брал все сохранившиеся из группы пред-максимальных по расстоянию.
Также со всеми сгенерированными траекториями конкурировал соответствующий кусок лучшей стратегии с прошлого тика.

Добавив поддержку тормоза в старую схему, задействовав ранее неиспользованный вариант с двумя поворотами в одну сторону, я понял, что это тупик.
В итоге, сделал универсальную схему: план движения описывается набором действий в разные моменты времени (поворот {−1, 0, +1}, газ {−1, +1}, тормоз on/off, нитро).
Для генерации куска траектории исполняется байткод общего вида с командами типа: выполнить действие, случайное/фиксированное ожидание, безусловный переход и раздвоение на относительное смещение.
Команда "раздвоения" рекурсивно исполняла обе ветки: со следующей команды и по смещению.
После этого моя машинка научилась ездить задом и использовать нитро.

Ездила задом она плохо, поэтому я стал допиливать механизм генерации.
Вместо одной программы стало несколько, каждая со своей продолжительностью в тиках.
Из всех программ выбирались те, что соответствовали текущему состоянию управления машинки.
Теперь машинки не ехали два тайла после достижения времени окончания, а запоминались все пересечения тайлов, которые в плюс по дистанции, за время работы программы.
Из этих прохождений тайлов, для продолжения генерации, по прежнему, выбирались два последних, однако, сама генерация шла не фиксированное количество раз, а до достижения целевого расстояния (8 тайлов).
Где-то в это время мне надоело вручную высчитывать смещения для операций перехода и я запилил ассемблер байткода с текстовыми метками :)

Для всякой стрельбы и полива маслом я предсказывал положение врагов по 3-м сценариям: тапка в пол и поворот на {−1, 0, +1} и брал наихудший результат стрельб.
Для езды в паре сделал избегание своих выбранных тракторий, однако это часто приводило к тому, что лидер тормозил и пропускал отстающего, поэтому ближняя машинка к финишу стала ездить без оглядки на дальнюю.
Ну и перебирал дикое количество разных функций оценок и коэффициентов.

P. S. Надо будет в следующий раз сесть за неделю до бета-теста и запилить фреймворк для визуализации, а то уже 4-й конкурс руки не доходят (в первых 2-х у меня был модный ASCII-арт, но сейчас его уже не хватает).
P. P. S. Размер моей стратегии из года в год монотонно растет: 42k, 50k, 73k, 87k. Боюсь подумать, что будет дальше.

#273
2:49, 27 дек 2015

Сделал визуализацию для своей стратегии:

+ Показать

И ещё решил показать фрагменты исходников:

+ Показать
#274
8:00, 28 дек 2015

у меня был модный ASCII-арт

Жизненно, кроме шуток, реально пытался так рисовать, пока не завезли плагин к локалраннеру

+ Показать

Потом перешёл на что-то такое

+ Показать
#275
17:00, 28 дек 2015

}:+()___ [Smile] Спасибо за описание. Думаю, если бы в этот раз посерьезней отнесся бы к конкурсу, то кто его знает... :)
Adler Выложил бы код полностью архивом, да и все. Отрывки не помещаются.

Страницы: 114 15 16 17 18 19
ФлеймФорумПрограммирование

Тема в архиве.