История участия в CodeTroopers - чемпионате по программированию Искусственного Интеллекта

Dec 17, 2013 04:27


Итак, весь последний месяц я принимал участие в открытом чемпионате по программированию игрового искусственного интеллекта, проводимого компанией Mail.ru. Короче говоря, писал бота.

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

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

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

После международного конкурса 2011 года, проводимого при поддержке гугла, в котором я занял 84-е место из примерно 8000 участников, я джва года ждал, когда же случится очередной чемпионат по чему-то подобному, но в прошлом году всё равно сумел каким-то образом пропустить первый чемпионат от мэил.ру и узнал о нем только из статье на том же хабре, уже после его окончания. Так что в этом году я уже ожидал, что в конце осени он случится. Я все равно немножко пропустил начало, опоздав примерно на неделю, но все же, у меня была еще целая неделя, чтобы успеть написать то, что сможет пройти квалификацию.

В вышеупомянутом конкурсе 2011-го года я писал на языке C#, которого не знал, так что и в этом году решил не изменять традициям, и писал на Java, с которой тоже до этого ни разу не сталкивался :)

Теперь про саму игру. Как я уже сказал выше, нужно было написать бота, управляющего командой спецназа, бегающего по уровню. Схематически выглядело примерно вот так (вид сверху):





Вкратце о правилах:
Каждый боец ходил по очереди и в свой ход получал, обычно, 12 очков действий, которые можно было тратить на разные действия: шагнуть (2 очка), выстрелить (2-4 очка, в зависимости от типа бойца), присесть (2 очка), лечь (4 очка), и еще несколько вариантов - кинуть гранату, использовать аптечку, съесть еду, воспользоваться специальным умением бойца. Таким образом, за один ход можно было, к примеру, сделать 6 шагов (2х6 = 12 очков), либо сделать 2 шага (4 очка), дважды выстрелить (+6 очков) и отойти еще на один шаг (+еще 2, т.е. в сумме 12 очков)... Ну вы поняли принцип. Кроме того, на карте попадались бонусы (гранаты/аптечки/еда). А еще, там были препятствия, за которыми можно было прятаться стоя, сидя или лежа, а зависимости от их высоты. Каждый боец имел определенный радиус зрения (7-9 клеток), и не умел смотреть сквозь стены. Вот эта светлая область на картинке -  это как раз видимый зеленым игроком кусок уровня. Также, ключевым моментом игры был тот факт, что видимость бойцом противника вычислялась таким образом -  если из центра клетки с одним солдатом можно провести линию хотя бы в одну точку клетки с другим солдатом, не пересекая при этом стену, то он ее видит. Т.е., к примеру, на картинке красный солдат , отмеченный синей стрелкой (1), может увидеть солдата (2), но не увидит (3), потому что из центра клетки солдата (1) можно провести линию, которая зацепит угол клетки (2) в обход стены, но вот к клетке (3) как ни веди линию, она в любом случае будет пересекать стену. Но при этом сам солдат (1) виден и солдату (2) и солдату (3). Т.е. суть этой фишки в том, что если один солдат видит другого, то это еще не значит, что второй солдат тоже видит первого. Это был очень важный момент для стратегии. Еще один важный момент заключался в том, что противник не видит твоего хода. Он видит только позиции противников на начало своего хода (если они в его поле зрения). т.е. к примеру, если твой противник за 1 свой ход выскочит из-за угла, выстрелит, и опять спрячется за угол, ты на своем ходу увидишь, что жизней стало меньше, но не будешь иметь понятия, почему.

Кроме того, еще один ключевой момент заключался в том, что у всех солдатов радиус видимости и радиус стрельбы отличался. У одних радиус видимости был выше (т.е. могло быть такое, что они видят врага, но выстрелить в него не могут), у других -- наоборот (врага не видят, но если выстрелят вслепую туда, где враг есть, попадут). Ну и кроме того, все, что видит один солдат, видит и вся его команда. Т.е. на картинке выше, двое зеленых солдат, у которых нет номеров, тоже знают о противнике (1), хоть и не видят его, потому что им о нем "сообщают" солдаты (2) и (3)

Наверное, самое время показать пример игры тем, кто ее еще не видел (можете понажимать на клавиатуре кнопку вверх, чтобы ускорить воспроизведение):

http://russianaicup.ru/game/view/766707 (мои синие)

http://russianaicup.ru/game/view/766796 (мои красные)

Там нажимайте кнопку "посмотреть игру". Для удобства просмотра, Туман Войны по-умолчанию отключен, так что мы хорошо видим всю карту, а не только то, что видели бойцы, как было на картинке выше.

Еще пару слов о бойцах. Изначально их было три вида, и у каждого были свои особые способности: Командир (умеет вызывать самолет, который пролетая, показывает примерное расположение врагов, и кроме того, все бойцы в радиусе нескольких клеток от командира получают дополнительно по 2 очка действия, кроме него самого), Штурмовик (изначально имеет 120 очков жизней, вместо 100) и Медик (умеет лечить друзей или себя). Затем добавились еще два, но об этом ниже.

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

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

В общем, моя цель на неделю была попасть в топ300 первого раунда, чтобы пройти дальше.

Я не буду описывать самое начало, т.к. оно достаточно очевидно -- первым делом мы учились хоть куда-то идти, и увидев врага, стрелять в него. Ну и заодно, сразу же написал поиск пути старым добрым A*. Дальше я эту часть развивать не стал, т.к. уже тогда знал, что все равно буду реализовывать полный перебор. Поэтому, как только мои малыши научились ходить, стрелять, подставляться под выстрелы и благополучно умирать, началась основная работа - я начал писать полный перебор всех возможных действий.

Смысл примерно в следующем: до тех пор, пока у нас не закончатся очки действий, рекурсивно перебираем все возможные комбинации действий, которые укладываются в имеющееся количество очков. Ну т.е. возьмем упрощенный пример: у нас еще есть 6 очков действий. значит мы можем сделать 3 шага. но сделать их мы можем тоже кучей способов:
  • 3 шага влево;
  • 2 влево и 1 вверх;
  • 1 влево 1 вверх и снова влево
  • и т.д. и т.п.,

64 комбинации в общем, если предположить, что у нас нет никаких стен вокруг и мы можем идти куда угодно.
Но кроме того, есть и другие варианты - мы можем сделать два шага и присесть (что тоже стоит 2 очка), или сделать 1 шаг и лечь, или 2 раза выстрелить, или сделать 1 шаг и 1 раз выстрелить.
Короче говоря, в тяжелых случаях количество комбинаций уходило в десятки тысяч и просто необходимо было где-то что-то оптимизировать, чтобы не перебирать их все, потому что времени на 1 игровой ход давалось 2 секунды, и если ты не успевал походить, бот автоматически "умирал" и солдаты оставались стоять неподвижно на своих местах до конца игры.

Первым делом я ограничил количество движений (с надеждой позже убрать это ограничение) - не больше четырех за ход. кроме того, запретил некоторые не имеющие смысла комбинации действий (например, нет никакого смысла в том, чтобы присесть и сразу встать, хотя в обратном действии как раз смысл есть - иногда имело смысл встать, чтобы заглянуть за низкие препятствия, и затем снова сесть), или еще пример - я решил, что лечиться аптечкой имеет смысл только первым действием, иначе получалось, что если тебе нужно сделать 3 шага влево и вылечиться, это давало 4 разных комбинации:
  • лечение - 3 шага;
  • 1 шаг - лечение - еще 2 шага;
  • 2 шага - лечение - 1 шаг;
  • 3 шага - лечение

что явно не имело смысла, т.к. приводило к одному результату.
В общем, подобных оптимизаций было множество.
Еще большая проблема возникала с медиком - стоимость лечения составляла всего лишь одно очко действия, поэтому для него количество комбинаций при наличии нескольких раненых друзей рядом просто зашкаливало (если для других персонажей иногда могло получаться в районе 15 000 комбинаций за ход, то у него доходило до 90 000+).
Здесь тоже были сделаны свои оптимизации. например, он у меня лечил всегда по 2 раза подряд, что было гораздо дешевле. кроме того, если он лечил сам себя, то он всегда делал это в начале хода (иначе получалось много бесполезных комбинаций наподобие описанного выше случая с аптечкой. Кроме того, на этом этапе я решил не усложнять алгоритм, и оставил полный перебор действий только в режиме боя (когда виден какой-нибудь противник), а в остальное время бот ходил эвристически. При этом из команды выбирался ее лидер (которым в тот момент был командир), который искал путь до цели, а остальная команда просто следовала за ним. самими целями выбирались стартовые позиции противников, которые были зеркальными отражениями моей стартовой позиции.

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

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

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

  • из них выбираем все комбинации, в которых мы убиваем противника (тоже, если они есть)

  • затем из отобранных выбираем все, где мы получаем как можно меньше урона

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

  • затем те, где после нашего хода мы будем оставаться вне видимости видимых противников (т.е. он не будет знать, где мы)

  • ну и т.д... те, где вылечиваем как можно больше жизней, где находимся как можно ближе к лидеру, где подбираем побольше бонусов

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

Вот примерно в этот момент я залил свою стратегию, которая и участвовала в 1-м раунде, и она сразу залезла на примерно 200-е место в песочнице, так что я уже был относительно спокоен насчет прохождения во второй раунд.
Наступила пятница и наступил первый раунд. А в раундах была совсем другая система начисления очков - за 1-е место в бою ты получаешь +8 очков, за 2 +4, за 3 +2, за 4 +1.
Т.е. ты в любом случае получается сколько-то очков даже в случае проигрыша. Это было важно из-за того, что даже если ты в промежутке между первой и второй половиной раунда капитально улучшишь стратегию, тебе будет очень тяжело значительно подняться в рейтинге, потому что ты на тот момент уже будешь сильно отставать по очкам (в отличие от системы очков песочнице, где ты за выигрыш получаешь очки, а за проигрыш - теряешь, а противники выбираются своего же уровня, так что твой рейтинг в очках остается примерно одинаковым все время).

Вот именно это со мной и случилось, потому что в субботу, в промежутке между полураундами, я сделал несколько серьезных изменений (одним из самых важных было правило не становиться сразу за углом, потому что если ты стоишь на углу, а противник - в паре клеток за ним, то он тебя видит, а ты его - нет, и ты скорее всего умрешь).
Залив стратегию с этими улучшениями, за вторую половину раунда я, несмотря на большой отрыв по очкам, поднялся с 200-х мест до 62-го, на котором и закончил этот раунд. Кроме того, именно в этот небольшой промежуток времени моя стратегия была настолько успешна, как не была ни до, ни после -- я тогда создавал несколько тестовых боев, где участвовала моя стратегия против топ3 лучших игроков из рейтинга, и в большинстве созданных боев я был на 1-2 месте (пруфлинк).Но счастье было очень недолгим, потому что первый раунд закончился, снова открылась песочница, и в игре появился новый солдат - снайпер, к которому моя стратегия была совершенно не подготовлена.
Стоимость выстрела у снайпера была очень высокой - 9 очков. Так, находясь рядом с командиром, он мог в лучшем случае выстрелить и сделать один шаг, а если командира рядом не было - так после выстрела вообще больше ничего не мог сделать, т.к. действия, стоимостью в 1 очко, есть только у медика.
Но при этом снайпер имел очень высокую дальность стрельбы - 10 клеток (для сравнения, у штурмовика - 8, у остальных - еще меньше), и к тому же, урон от его выстрела был очень высоким - снимал 65 процентов жизней в стоячем положении, 80 - в присевшем и 95 при стрельбе лежа.Фактически, появление снайпера полностью меняло стратегию -- теперь наилучшей тактикой было залечь где-то снайпером, а всеми остальными бегать и показывать ему противника (т.к при дальности стрельбы в 10 клеток, радиус обзора у него был всего лишь 7 клеток).
Во второй раунд я прошел, так что теперь моей целью было попасть в финал. Для этого нужно было оказаться в топ50. Опять закипела работа, реализованных идей было огромное количество. Вот некоторые из них

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

  • избегать клеток, для которых вообще существовали такие позиции, откуда в тебя могли выстрелить, но ты не мог дать сдачи

  • если не могу ни в кого выстрелить - бежать в такие точки, откуда я бы мог достать противника в следующем ходу, а он бы меня при этом не видел.

  • запоминать последовательность ходов, чтобы затем, увидев противника, просчитывать, сколько друзей походит перед ним (т.е. если я вижу, что рядом с текущим моим солдатом есть еще один мой, и они оба походят раньше, чем противник, то я ломлюсь в бой из расчета, что я его раню, а товарищ добъет);

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

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

  • приседать или ложиться, если я нахожусь в бою и рядом со мной есть невысокие преграды

  • при движении вне боя, стараться делать 4 шага вперед, затем 1 назад и 1 пропускать. это нужно потому, что если ты уходишь вперед на все 6 шагов, то часто получается так, что на 6-м шаге ты попадаешь в поле зрения противника, но у тебя уже нет очков действий, чтобы убежать. а так ты всегда имеешь 2 очка в запасе.

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

  • более хитрый расчет того, как много урона может нанести противник (с учетом того, что он может подойти поближе, но при этом у него уменьшится кол-во выстрелов; с учетом наличия командира возле противника, который дает ему 2 бонусных очка, учет бросков гранаты противником)

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

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

Ну и еще миллион других вещей, сейчас уже и не вспомнишь всего. И нереализованных идей оставалось не меньше :)
Еще в это время пришло осознание, что было бы лучше отталкиваться от достижимых клеток. Т.е. для начала выбирать клетку, где мне лучше всего было бы завершить ход, а затем уже смотреть, каким путем к ней лучше идти. Это очень сильно уменьшило бы количество ходов для перебора. Но переделывать уже было поздно. Так что надо запомнить на будущее :)

В общем, это была самая спокойная неделя, без особых фейлов с моей стороны, и в результате я успешно закончил 2-й раунд на 24-м месте.
И вот тут пришла моя самая провальная неделя - неделя финала.
Здесь добавился новый солдат - разведчик. он всегда имел 12 очков действий, независимо от наличия командира рядом, и кроме того, имел большую дальность обзора - 9 клеток. в общем, он был создан для того, чтобы "подсвечивать" противников снайперу.
Кроме того, было известно, что в финале бои будут проходить снова в измененном формате -- к 50-ти лучшим стратегиям второго раунда присоединятся еще топ10 песочницы (кроме тех, кто уже и так прошел), и бои в финале будут проходить в формате дуэли - в каждом бою всего 2 команды по 5 солдатов. при этом бои будут проходить волнами, и в каждой волне каждый участник сыграет против каждого другого на каждой карте.
И вот тут мне пришла в голову хорошая мысль, про которую я уже упомянул выше -- каскадный выбор наилучшей стратегии - это плохой вариант, гораздо лучше было бы давать или забирать за каждое действие какое-то количество очков, и затем выбирать то действие, где кол-во очков было мы максимальным. Ну там к примеру, убил противника - получи 15000 очков, а закончил ход на опасной клетке - верни 5000.

Преимущество заключалось в следующем: в старой, каскадной, системе, к примеру, правило того, что мы стараемся нанести урон находилось выше правила "лечиться, если ранен", так что мы всегда выбирали стрельбу, даже если жизней у нас оставалось мало, а урона мы могли нанести самый минимум.
А вот с очками мы получали гораздо большую гибкость. например, если за каждую единицу урона мы получаем 100 очков, а за каждое действие лечения по 60, тогда нанести 50 урона будет выгоднее, чем вылечить 75 жизней (потому что 50*100 > 75*60), но в то же время, если урона мы можем нанести всего лишь 40, то лечиться уже будет выгоднее.
Ну и вот таких правил с очками было большое количество - штук 40 или 50. кроме того, я добавлял еще случайное количество очков, чтобы избежать "залипания" (в некоторых ситуациях получалось так, что выгоднее всего, скажем, сделать два шага влево, затем 2 вправо и закончить ход там же, где и начал. ну а в след. ходу ситуация повторяется, и ты так и стоишь на одном месте бесконечно).

Сразу было очевидно, что сама идея была хорошая, но хоть и на переделку системы ушло не слишком много времени, гораздо больше его ушло на подбор этих самых коэффициентов. Так что учитывая, что я только на предфинальной неделе за это взялся, как я ни пыхтел, всё равно не успел толком доделать.
Под конец недели я надеялся взять в пятницу выходной и довести всё до ума, но само собой, финал обязан был совпасть с завалом на работе, так что ничего у меня не получилось, и я был вынужден залить на финал версию недельной давности, которая играла во 2-м раунде. Причем после прихода с работы в пятницу, времени у меня не оставалось уже даже на то, чтобы элементарно добавить в нее хотя бы упоминание разведчика, так что она даже не догадывалась о его существовании (ну т.е. не умела выбирать его лидером, не пользовалась его преимуществами и т.д.). Самым обидным было то, что новая версия уже отлично работала локально и в хлам рвала предыдущую, но при заливке в песочницу, она слишком медленно работала и в очень многих боях падала в таймаут, так что нужно было просто оптимизировать несколько мест, но я уже никак не успевал.
В общем, эпик фейл.
Как и следовало ожидать, после первой половины финала, я был на 42-м месте, причем от 41 и 40-го отрыв был всего в несколько очков, а вот оттуда до 39-го отрыв был огромным -- около 200 очков. В финале система очков опять была необычной - за победу в дуэли давалось 2 очка, за проигрыш - 0, за ничью - по одному. соответственно, чтобы покрыть эти 200 очков отставания, мне нужно было бы за оставшиеся 12 часов выиграть на 100 боев больше, чем 39-е место, при том, что в сумме боев во второй половине планировалось всего около 1000. К тому же, в субботу я вынужден был ехать на день рождения дедушки жены на весь день, и приехал домой только в 2 часа ночи. поборовшись несколько минут с ленью, я все-таки сел и сделал нужные мне оптимизации за несчастные 3 часа, и в 5 утра, залив код, ушел спать. В 10 утра начался второй раунд финала. Отрыв в 200 очков мне так и не удалось преодолеть, и закончил финал я на 41-м месте, с отрывом всего в 8 очков от товарища amurushkin-а, занявшего 4-е место в первом раунде, и 40-е в финале, но отрыв от 39-го места сократился с 200 очков до 14-ти.
После окончания финала, еще неделю продолжался бой в песочнице, победители которой тоже награждались, так что хоть на призовые места я и не метил, но решил не сдаваться, и помучиться еще недельку.
Наступил понедельник и я, не заливая ничего нового после финала, ушел на работу. Вечером оттуда заглянул в песочницу и вот тут мне стало по-настоящему обидно, потому что моя стратегия была на 18-м месте. Т.е. получается, я всю неделю работал над ней ночами напролет, но не хватило несчастных трех часов, чтобы довести до ума и вероятно, попасть в топ20 в финале.
Но уж ничего не поделаешь... Я наивно решил, что надо хотя бы в песочнице не облажаться и вечером принялся за работу.
В песочнице никакого финала не было -- она просто работала до 10-ти вечера в воскресенье, после чего результаты заморозились и стали финальными.
Снова до 5-ти утра пятницы я программировал. Прикрутил пару вещей, на которые мне всё не хватало времени:

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

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

  • Наконец-то добавил стрельбу вообще вслепую по потенциально опасным точкам.

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

Что интересно, в эту неделю чаще всего случалась такая веселая ситуация, когда пишешь стратегию, которая в хлам разрывает твою предыдущую -- успешную. Заливаешь ее -- а она проигрывает всем подряд. Ну, думаешь, лааадно, будем переделывать. Переделываешь еще раз, и новая версия рвет и ту, успешную, и ту, что рвала в хлам успешную. Заливаешь - а она еще хуже :)
Ну я уверен, все участники конкурса с этим сталкивались не раз :)
Итак, наступил вечер четверга, переходящий в утро пятницы - утро моего второго моего фейла на этом чемпионате.
У меня была готова глючная версия, которая с какой-то ошибкой вылетала чуть ли не в каждой второй игре, но я в 5 утра уже был не в состоянии это исправлять, и я подумал, что ладно, залью как есть, упаду на пару десятков позиций, а как проснусь - исправлю и залью нормальную, но зато уже буду знать, как она себя ведет в тех боях, когда не вылетает.
Так и сделал и ушел спать. Когда встал - обнаружил себя на 48-м месте, вместо 18-20. Исправил ошибку, залил, посмотрел, что рейтинг потихоньку растет, и вот тут меня посетила "гениальная" мысль:
При заливке стратегии можно было включить волшебную опцию под названием "увеличить изменчивость рейтинга". Если ее включить, то в следующих нескольких боях при победе ты будешь получать сразу много очков, а при проигрыше - терять много. Это нужно для тех ситуаций, когда ты сделал значительное улучшение, чтобы не тратить время в ожидании, пока рейтинг повысится.
Ну я такой подумал - это же именно мой случай! И поставил галочку. И проиграл бой какому-то Spasitel-ю (это наверное была моя расплата за недостаточную православность)), потеряв при этом сразу почти 500 очков и упав за один бой куда-то в район 300-го места... и это за 2 дня до конца песочницы, при частоте в 2 боя в час!
Вот он, этот эпичный бой: http://russianaicup.ru/game/view/722368
Короче говоря, все оставшееся время я просто пытался вернуться на свою позицию :)
Вот так это выглядело:


1. Мое падение за ночь с глючной стратегией
2. Тестирование исправленной перед тем, как поставить ту галочку
...Пике я даже не подписывал, там всё ясно... За ним последовал долгий рост рейтинга
3. Ненадолго залил пробную стратегию, не очень удачную
4. Исправил и залил еще раз. В этот раз рейтинг начал быстро идти вверх, но оставалось всего-лишь 6 часов до конца песочницы, так что так и не добрался я до своих топ20.

Эпилог.

Песочницу я закончил на 27-м месте. Это конечно тоже очень неплохой результат, хотя если бы не мои фэйлы - наверное был бы в топ20 и в финале и в песочнице.
----
Небольшое обновление тут. Сегодня (в среду) организаторы, уже вне рамок конкурса, просто так включили песочницу для тех, кто еще хочет побаловаться... Ну и вот, пол дня шли игры, и в данный момент я в песочнице на 17-м месте, что подтверждает предположение, что если бы не мой фейл, вероятно, закончил бы в топ20 :)

Интересную, кстати, штуку заметил - из тех 26 человек, что оказались выше меня в рейтинге, всего трое украинцев, а почти все остальные - русские. В России всего-то в 3 раза больше население... Почему же людей в топе почти в 8 раз больше?

Previous post
Up