Итак, весь последний месяц я принимал участие в открытом чемпионате по программированию игрового искусственного интеллекта, проводимого компанией 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 раз больше?