ICFPC 2017

В этом году контест по ряду причин был унылым, так что пост будет коротким и тоже унылым. Я и так целый месяц тянул с написанием отчёта, так что либо так, либо вообще никак.

Задание

Нам снова предложили игру на графе (зеркало). К примеру, вот на такой версии Оксфорда:

Карта «Oxford» с ICFPC-2017

Здесь зелёные точки — это «города», некоторые из которых имеют «шахты» (красные кружки). «Города» соединены «реками» (серые линии). В шахтах добываются «лямбды» (отсылка к заданию 2012-го года), которые нужно доставлять в города. В чем более далёкий город удалось доставить лямбду, тем больше получается очков.

Команды пишут ботов, которые по очереди занимают реки. В конце игры для каждой пары шахта-город, соединённой реками бота, рассчитывается минимальный путь в графе (d), и бот получает d × d очков.

В течение контеста было выпущено три обновления задания, добавлявших:

Для futures мы даже успели что-то реализовать, а остальные два дополнения проигнорировали.

Как мы играли

Вяло (относительно прошлых годов).

Codingteam в этом году представляли Akon32, ForNeVeR, grouzen, nightmare932, portnov и я. Akon32 выступал в ICFPC впервые.

Подробную хронику мне писать лень, поэтому просто перечислю те идеи, которые в итоге удалось реализовать. В порядке появления в репозитории:

Были мысли и о более крутых стратегиях, но т.к. имплементация шла медленно, до них мы так и не добрались.

Рефлексия

Уныло было по четырём причинам.

Во-первых, отсутствовал scoreboard. В прошлые годы именно scoreboard поддерживал дух соревнования, не давал расслабляться и при этом чётко сообщал, насколько хорошо справляется наше решение. В этом же году организаторы предоставили лишь игровые сервера, на которых были запущены примитивные боты. Если кому-то хотелось поиграть против настоящих противников, нужно было договариваться о матче через IRC или как-то ещё. Что-то тестировать в таких условиях было проблематично. Я под конец контеста для подбора весов в смешанных стратегиях просто написал свою реализацию сервера и сталкивал несколько инстансов нашего бота друг с другом.

Во-вторых, Scala. В отличие от 2015-го, я к Скале не готовился и потому кодинг шёл туго — приходилось подглядывать то синтаксис match, то названия методов у коллекций. По-хорошему, все эти штуки должны были бы быть у меня в кэше, чтобы я не отвлекался.

В-третьих, scala-graph. Осиливать такую библиотеку за считанные часы я никак не был готов. Малознакомый синтаксис Скалы плюс недостаток документации порой выводили из себя. Учитывая, что в итоге из библиотеки мы пользовались только маркировкой рёбер и поиском путей, я не уверен, что сто́ило вообще брать стороннюю библиотеку.

В-четвёртых, какое-то совершенно непритязательное задание. Не было какой-то изюминки, чего-то такого, за что это задание можно было бы вспоминать ещё лет десять.

Результат

Оценивание проводится в три этапа, на каждом из которых после ряда игр отсеивается половина участников. Мы вылетели на первом же (зеркало), заняв 102-е место из 120. В принципе, после такого выступления я ни на что особо и не рассчитывал; напротив, я несколько удивлён, что это не худший наш результат — в 2015-м мы старались гораздо больше и получили море фана, но лишь 151-е место из 194-х. Go figure.

Как всегда, весь наш код можно найти на GitHub.

Надеюсь, в следующем году будет повеселей.

Drop me a line! (wonder where’s the comments form?)