Войти
ФлеймФорумОбщее

Russian Ai Cup: Codetroopers (32 стр)

Страницы: 129 30 31 32 33 34 Следующая »
#465
1:22, 15 дек. 2013

Мой код:  http://pastebin.com/Lb7HA84i


#466
1:37, 15 дек. 2013

ud1
У меня они тоже часто застревали, даже с перебором. В некоторьій момент просто решил, что другие фичи важнее и забил

#467
10:03, 15 дек. 2013

Круто, как раз собирался попросить кого-нибудь выложить. Еще бы Мегабайт код открыл...

#468
13:04, 15 дек. 2013

PlayerDark
> Еще бы Мегабайт код открыл...
До финала песочницы как-то странно на это рассчитывать :)

#469
14:05, 15 дек. 2013

Ну и да, для галочки вот мой код:
https://sourceforge.net/p/codetroopers2013/code/HEAD/tree/
основной код в uTactic (перебор) и в uWorldState (симуляция мира). В MyStrategy.pas только вызов перебора и какие-то хаки добавлявшиеся в последний момент.
    123 место во втором раунде, сейчас в песочнице 161. Наверное был шанс войти в сотню, но я уже забил, да и надоело на работе запускать каждый день "ололо-раскрути вентилятор ноутбука в 4 потока".

    История: Сначала вообще ничего не просчитывал, потом с нуля написал свою симуляцию игрового мира и сделал просчет действий текущего юнита. Для оптимизации два лечения медика считал за одно стоимостью 2ОД, гранату кидал только в одну выгоднейшую точку, не жрал больше одного рациона за ход. Еще для оптимизации запрещал садиться сразу после того как встал и наоборот, также для использования аптечки и кидания гранаты сделал абсолютный приоритет. Ну и под конец еще одну оптимизацию сделал - не больше двух смен режима. Т.е. либо перемещаемся-действуем-перемещаемся, либо действуем-перемещаемся-действуем, но не шагнул-стрельнул-шагнул-стрельнул, т.к. это все равно смысла не имеет а срезает перебираемые ходы для медика почти вдвое.
    Для мирного перемещения тоже делал перебор, это правда не очень помогает и бойцы часто тупят, при этом сжирая лишнее время и отъедая его у расчетов в бою.
    Визуализацию делал в консоли

+ Показать

    Т.к. уже был свой раннер, то добавил генетику и вместо мороки с многопоточностью просто запускал две-три-четыре копии симулятора для разных карт.
    Главный забавный для меня момент был, когда генетика научила моих ботов кайтить - я сделал в оценке позиции в том числе и оценку клетки "простреливаема\непростреливаема\видима\невидима\можно стрелять во врагов", причем коэффициенты для разных типов клеток подбирались генетикой. Когда я делал это надеялся что это научит медика прятаться в безопасной территории а остальных вставать в позиции откуда можно стрелять и при этом в них нельзя попасть. Но в результате генетика подобрала коэффициенты так что все стремились уходить в безопасную зону, т.е. кайтить.
    Потом меня все равно вытеснили из сотни и я сделал перебор вражеских действий. Точнее он был не совсем честный: я выбирал лучшие N своих цепочек действий, различавшихся финальным положением и маской убитых врагов. Для каждой из этих N цепочек я выбирал оптимальные по моей оценке действия врагов и союзников, в результате сравнивал финальную оценку и выбирал одну их этих N как лучшую. N регулируется в зависимости от запаса по времени - пока укладываемся в "норму" - повышаем N, когда перестаем укладываться - понижаем. Правда это я делал только на сервере, а в генетическом оптимизаторе поставил фиксированное N=10

    Как минимум, выяснилось что при этом старые коэффициенты не годятся, т.к. стратегии становятся сверхпараноидальными (стараются уйти в невидимую зону чтобы враги не смогли их увидеть даже если пойдут вперед до упора). А перебирать стало сложнее, т.к. один раунд (50 партий, чтобы каждый из 20 генов сразился с каждым) стал длиться по 10 минут. Но на работе у меня мощный i7, поэтому я дома вечером правил, а днем на работе в 4 потока считались коэффициенты.

    Это дало небольшой бонус, но не спасало и тогда я добавил "воображаемых врагов". Если мы видим одного солдата врага и помним что остальных мы не убивали, то значит остальные где-то рядом. Поэтому я рандомом воображал остальных солдат в неизвестной территории слегка позади видимого врага и с фиксированным сидом(чтобы более-менее согласовать между бойцами эту версию) и просчитывал ходы и для них. Это было уже за несколько дней до раунда 2, и где-то в процессе этого текущая версия разучилась кайтить (хотя более-менее справлялась со смартгаями и со старой версией). Я добавил в генетику отбор короткими раундами по 20 партий (чтобы каждый из 20 генов просто поучаствовал в 2 боях) и потом "полировал" сверху длинными раундами, делал еще какие-то изменения в спешке, в середине второго раунда залил то что получилось, убедился что место упало с 102 до 123 (то ли т.к. все тоже допилили стратегии, то ли т.к. это улучшение было призрачным а кайтить мы разучились вполне реально) и забил - стало ясно что по добору в финал не пройду.

#470
14:44, 15 дек. 2013

Интересно, после завершения конкурса симулятор оставят? Хотелось бы из свой стратегии все-таки что-то внятное сделать.

#471
15:08, 15 дек. 2013

kipar
Что такое "кайтить"?

Странно -- моя стратегия намного проще, но результаты намного выше (пока я активно писал (до финала), то был около 30-го места). Видимо, я гораздо более лучше подбирал коэффициенты -- но надо понять где именно :)

Я делал похожий перебор, но
+) Поскольку писал на питоне, то пришлось ограничивать существенно больше (медик если лечил кого-то -- то до упора; запрещал лечить, бросать гранату после перемены стойки и тп)
+) Перебрав все варианты хода одного своего юнита, оценивал каждый вариант так: брал урон, который я уже нанес и плюс все мои и чужие юниты просто тупо стреляли в того, кого видели (стреляли в порядке очереди ходов; если юнит видит двух врагов -- стреляет в того, у кого меньше хп). Если враги меня вообще не видят -- то я добавлял +Х к оценке позиции. За каждого убитого юнита добавлял к оценке +50 (+25 очков, которые дают; и еще +25 потому, что типа это может быть последний юнит плюс потому, что он уже меня не ударит).
Вот и все :)
Да -- и моя стратегия тайм-аутилась один раз за 100 игр в среднем, но я на это забил.

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

Одна особенность: чтобы оценить крутость новых версий, кроме тестов и просмотра боев глазами, я гонял новую версию против своих старых версий 15-20 раз на каждой карте (каждый бой длился почти минуту, поэтому часто запускать такое не получалось).
Один раз я заметил, что моя новая версия на 5 картах сыграла почти вничью со старыми, а на шестой карте выиграла почти все бои. Это было очень странно. Я посмотрел эти бои глазами и оказалось -- поскольку все мои стратегии ходят все время приблизительно одинаково, то в большинстве из этих 20 боев драка начиналась из более-менее одинаковой ситуации. В итоге, фактически, я запускал не 20 боев, а один и тот же бой 20 раз. Клин клином вышибают :) -- чтобы убрать эту случайность, я добавил рандом. В каждой тестовой игре, все мои стратегии первые два-три хода случайным образом бегали в броуновском движении -- в итоге, по итогам 15 боев уже можно было более-менее нормально судить об уровне новой стратегии.

Мой код (уже кидал): github.com/OlexiyO/CodeTroopers. Оценка позиции в бою идет в battle_evaluator.EvaluatePosition(), перебор в файле dfs.py

#472
15:21, 15 дек. 2013

Olexiy
> Что такое "кайтить"?
> Странно -- моя стратегия намного проще, но результаты намного выше (пока я
> активно писал (до финала), то был около 30-го места). Видимо, я гораздо более
> лучше подбирал коэффициенты -- но надо понять где именно :)
Кайтить - уходить из зоны видимости в конце хода. В какой-то момент это стало определяющим фактором лидерства, и в то время был в районе 50-70 места.

А с коэффициентами - да, я понимаю я перемудрил. У меня коэффициентов в финальной версии уже были десятки - за положение на углу, за лежание\стояние в конце хода, за имение бонусов, за положение рядом с бонусом, за видимость\невидимость\простреливаемость\непростреливаемость позиции, отдельно коэффициенты для мирного перемещения и отдельно для режима "перегруппировки" (если был огневой контакт но потом врагов не стало видно, мы N ходов залегаем\лечимся\готовимся). Плюс потом еще сделал изменение коэффициентов в зависимости от числа видимых врагов - но это скорее от отчаяния. Итого получилось как-то так (лидер последнего тура генотбора для первой карты):

+ Показать

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

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

#473
15:30, 15 дек. 2013

kipar
Ого :) Глаза можно сломать

У меня было 5 параметров, а на самом деле меньше (некоторые из них не параметры, потому что я их не менял :):
KILL_EXTRA_PROFIT = 50  -- сколько даем лишних очков за убийство (сразу поставил в 50 и ни разу не менял)
TOO_FAR_FROM_ALLIES = 7 -- в мирное время, позиция получает штраф, если расстояние больше, чем это. Попробовал 6, стали часто застревать, поменял на 7
BATTLE_SIMULATOR_NUM_ROUNDS = 2 -- на сколько ходов "симулировать" битву (когда только стреляют и не ходят). Как правило, после 2 ходов все равно все сдохли, так что не имеет смысла менять :)
PREDICTION_DISCOUNT = 0.8  -- насколько выгоднее убить сейчас, сравнительно с "мы думаем, что убьем потом". Если ставить его равным 1, то юнит видел врага с 10хп и думал "я не буду стрелять, все равно следующий его убьет; следующий думал так же :)
ENEMIES_DONT_SEE_US_BONUS = 50 -- бонус к оценке позиции если нас никто не видит из врагов (чтобы "кайтить")

#474
15:35, 15 дек. 2013

Olexiy
> PREDICTION_DISCOUNT = 0.8  -- насколько выгоднее убить сейчас, сравнительно с
> "мы думаем, что убьем потом". Если ставить его равным 1, то юнит видел врага с
> 10хп и думал "я не буду стрелять, все равно следующий его убьет; следующий
> думал так же :)
Думал над чем-то похожим, но уже лень вносить. Среди всего прочего, возможно дело как раз в нем - учитывать только результат просчета вперед неправильно, потому что просчет основывается на многих рандомных допущениях.

#475
21:53, 15 дек. 2013

SladeThe
> С другой стороны, всё получилось честно: те, кто приложил усилия на создание
> собственного раннера, получили возможность пользоваться всеми его
> преимуществами раньше остальных. Мы открыли возможность запуска нескольких
> стратегий и выбора карт (чего кстати ещё никто не сделал) почти сразу, как
> только раннер появился в открытом доступе.
Люто, бешено плюсую :) Всё получилось очень здорово!
Каждый может выбирать свой подход: подбирать ли вейпоинты, гонять ли генетику, придумывать ли эвристики под абстрактные карты - все нормально, везде свои особенности и не надо никого ущемлять в этом выборе.

#476
23:30, 15 дек. 2013

Посмотрел мельком выложенные коды и офигел - как вы вообще справляетесь без комментариев? У меня так наверно четверть исходников занимают комментарии, но не потому, что хотелось причёсывать код, а сугубо для себя - из практической полезности (сам код ужасен!)

#477
23:41, 15 дек. 2013

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

#478
23:42, 15 дек. 2013

http://yadi.sk/d/zBfOSe3lENR9L

Вот мое. Есть и скомпиленые версии, последняя и все предыдущие :)
У меня перебор ходов для одного, текущего юнита, но много предпросчетов.

#479
23:45, 15 дек. 2013

Cooler
> Вот это, кстати, зря. Я тоже сперва так сделал, но потом убрал. А наоборот
> норм.
Ну, если он встал и увидел врага то все равно состояние мира изменилось и я все заново пересчитываю.

Страницы: 129 30 31 32 33 34 Следующая »
ФлеймФорумОбщее

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