Chat:Ru/2021-05-19
wlesavo: хех, кто-то мои питоновские эвристики запушил в легу гиперсоника
VanDarkMole: Серёжа ты мой ♂faking slave ♂
VanDarkMole: Я только за настоящую мужскую качалку
wlesavo: tutubalin
BorisZ: позовите Вия
BorisZ: если разрешить рубить только с 13 дня, то чуть лучше играет с топ100, но хуже со второй сотней
BorisZ: как-то поумнее бы сформулировать это, без привязки к дню
BorisZ: чуть лучше - это конечно условно сказано - то есть бывают победы в первых 4х боях, до этого не бывало
YurkovAS: у меня лучше с 12 днем
YurkovAS: запилил мктс по пм-у Магуса - еле играет
YurkovAS: и роллаутов вроде достаточно, другой чел из топ20 писал, что у него 1.7к роллаутов, у меня 2.2к.
BorisZ: быстро это ты, вот блин практика решает
YurkovAS: а, ну я его делал еще на выходых - тот очень плохо играл
BorisZ: а ролауты с каким ограничением?
BorisZ: у меня без сида, до 13 хода и без комплита
BorisZ: 8-9 к получается
YurkovAS: пока доп бонусов не подобавлял - мктс так и не заработал нормально, а у Магуса и другого чела про это не сказано
YurkovAS: http://chat.codingame.com/pastebin/d3426a8e-8ef7-4090-a0ef-1be645dfc612
YurkovAS: If there is no possible COMPLETE and no possible GROW, try a SEED with the same condition as the possible actions computation (not next to one of my tree and only when the seed cost is 0).
BorisZ: но у меня не мктс, просто мк
YurkovAS: прям как у него и написано сделал
YurkovAS: о, хорошо у тебя сейчас заиграл
YurkovAS: получается у тебя только grow, wait и так 13 дней?
YurkovAS: ну надо попробовать, с этим пока немного экспериментировал и играет лучше по схеме Магуса.
BorisZ: да, но бесплатный сид я всегда делаю принудительно
YurkovAS: и в ПМ-ах тоже про это пишут, что очень важная вещь - доигрывание на евристиках. а не ускорение, например.
YurkovAS: а, ну значит с сидом
YurkovAS: а какой, их же много будет, т.е. все добавляешь?
YurkovAS: может я не так делаю: все действия в массив собираю, а потом рандомно выбираю из него
BorisZ: до 4 дня - чтоб тень не пересекалась, до 8 дня чтоб не рядом
YurkovAS: и еще дало буст, если последним положить wait, а при рандоме давать больший приоритет началу списка. типа: FastRand(movesCount + 5) - 5;
BorisZ: но это я от фонаря сначала поставил и не пробовал тюнить даже
YurkovAS: ну а ты так же делаешь? в массив их, а потом рандомно выбираешь?
YurkovAS: или более принудительно где-то есть приоритет у конктретных действий. в рандомном доигрывании
BorisZ: при ролауте да
BorisZ: при начальном выборе - все возможные действия беру, их фильтрую костылями
BorisZ: в доигрывании - полностью случайно
YurkovAS: в доигрывании у тебя совсем без seed-а?
BorisZ: да, совсем без
YurkovAS: ясно, спасибо, проверю еще. видел тут в чате это обсуждали и в ПМ-е вроде тоже.
YurkovAS: мой мктс до 170 места дополз: уже лучше. а бимсерч был на 80-м.
Beard: YurkovAS делать массив а потом выбирать случайное действие это очень медленно
YurkovAS: а что быстрее?
Beard: я когда в это уперся - скопировал прям функцию с перебором действий
Beard: и вместо массива на каждое допустимое действие поставил рандом
Beard: типа if(randGen() % 2) { return action; }
Beard: там под x10 к скорости
YurkovAS: с % 2 он у тебя врятли дальше 5-го экшена доходит
YurkovAS: или я не понял, как ты это сделал
Beard: вот пробовал равновероятно, стало хуже чем % 2
Beard: не было времени разбираться почему)
YurkovAS: ну интересно, проверю. спасибо!
BorisZ: может посчитать количество экшенов, потом сгенерить случайное число и тогда только до него можно действия генерить
BorisZ: тогда их и сохранять не надо, и только до N/2 в среднем дойдем
Beard: BorisZ да, только я вот не придумал, как узнать количество, не проверив все действия, а это неотличимо от их генерации
YurkovAS: если память под массив уже выделена, то не должен он сильно тормозить.
YurkovAS: 140 место с мктс, класс!
YurkovAS: интересная игра получилась, можно много алгоритмов поприменять: бимсерч, мктс, мс, нейронки
BorisZ: если в битах хранить то можно узнать количество, если каждый сид по 1 разу считать
BorisZ: количество действий будет = количеству не спящих деревьев + все места посадки + 1 вейт
BorisZ: на маску деревьев наложим последовательно маски посадки для каждого дерева
YurkovAS: и для битовых масок в пм-ах есть быстрый расчет теней или что-то такое, не помню уже.
BorisZ: тогда можно кстати вобще другие действия не генерить, мы имеем биты взведенные в местах возможных действий, то есть это индексы ячеек, где ячейка == экшн
BorisZ: выбрать одну ячейку случайно, потом в зависимости от того что там - трешка, малое дерево или пусто сгенерить экшн
BorisZ: и без битов наверное можно, но это смотря как хранится состояние, у меня списка моих деревьев нет, но можно переделать
BorisZ: у меня пока 2 улучшения сработали: не рубить до 13 дня, и в ролаутах я тоже не рублю до того же дня
BorisZ: а то не логично было - в игре я не рублю а в ролауте рублю, неконсистентно)
BorisZ: в один и тот же день, в 10 например
BorisZ: надо взять себя в руки и запилить мктс уже, хоть самый простой с последовательными ходами, черт с ним
YurkovAS: поднял тайминги и мктс дошел до 80-м места: стало больше роллаутов и на первом ходу дерево дальше просчиталось и дольше переиспользуется.
Chibikko: Сколько роллаутов уже успевает за 100 ms посчитаться? Дерево переиспользуешь с прошлого хода?
Chibikko: мне пришлось до 78 ms ограничить расчёт. Сборщик мусора в шарпе такое зло.
Uljahn: а ты не переиспользуешь однократно созданные ноды? каждый ход новые создаёшь? или откуда мусор тогда
Chibikko: пока не использую. Надо переписывать всё, чтобы фиксированный размер стейта был.
YurkovAS: на 2-ом ходу 3.5к роллаутов с прошлого хода, пытаюсь найти ход противника и прокручиваюсь к нему. т.к. там есть статистика и многое может быть раскрыть, то это даст прибавку
YurkovAS: а ноды в с++ можно сделать большой глобальный массив структур и потом из него брать следующие, хватит на долго. главное конструктор не добавлять, а просто поля потом заполнять когда понадобится новая нода
YurkovAS: вывел у себя статистику, можешь посравнивать: http://chat.codingame.com/pastebin/c111d022-2b26-4474-ab94-0e1eb22afa23
Chibikko: спасибо, посмотрю.
MelnikovIgor: @chibiko, а ты не заставляй волноваться сборщик, выделяй память на 1ом ходу, используй структуры, как выше писали
MelnikovIgor: Можно в C# выделить массив без трекинга GC
MelnikovIgor: Marshal.AllocHGlobal
Beard: YurkovAS а как искать, если отдал команду WAIT а соперник ещё садовничает вовсю?
Beard: Это стало единственной причиной почему отказался от мемоизации и строил дерево каждый раз заново
Beard: вот она где была, эта легенда)
MelnikovIgor: Перебирать варианты, пока не придешь к стейту из инпута?
MelnikovIgor: Ну максимум глубина будет 10, чаще меньше5
Beard: у меня типо DUCT так что если соперник сделал много действий то нужно состояние на большой глубине
MelnikovIgor: А, DUCT, я хз как тм
Beard: пфф ну да, подумал "да ну, искать ещё, будет слишком долго" и не проверил
Beard: ужас)
YurkovAS: рекурсивно искать, он уже не найдет, если противник сделает 2+ действий. там дерево очень плохо раскрывается
Beard: ну понятно, т.е. затраты на поиск себя окупят
MelnikovIgor: На глубину 2 какие затраты то?)
YurkovAS: да какие там затраты - быстро отработает. ты же ищешь, пока ход противника.
Beard: MelnikovIgor говорю ж, меня смутил один частный случай(
YurkovAS: но дерево скорее всего будет пустое, я долго пытался это улучшить в первой реализации. а потом прочитал пм Магуса и успокоился.
YurkovAS: правда странно, что реализация как у него вообще не играет
YurkovAS: может роллаутов мало...
Beard: YurkovAS не понял про "пока ход противника". мы же забираем инпут, по нему определяем состояние, и уже это состояние ищем в дереве, правильно? Но пока это всё происходит, идет наше время
YurkovAS: да, так и делаю
YurkovAS: ну это просто отсечение - что у ноды дерева ход именно противника, чтобы лишние не перебирал
YurkovAS: там же рекурсивно
Beard: аа, это последовательный вариант
YurkovAS: последовательный мктс
YurkovAS: а у тебя же в duct тоже будет последовательный
YurkovAS: или нет?
Beard: нее, у меня пара действий
Beard: в первый раз мктс делал, опыта нет)
YurkovAS: я дукт в саомо конце поизучаю, т.к. не понял из документаций детали. а с мктс-ом уже есть опыт
mraymun: шо за Error loading certifications
gybson_samara: for j in range(1000000): http://chat.codingame.com/pastebin/7bf48378-d4e9-47a7-b450-1b3e213c0ccc
gybson_samara: независимо от количества нулей
gybson_samara: дошло =)
gybson_samara: но как исправить пака не ддошло
Uljahn: а чего хочешь-то? по коду не очень понятно
aropan: Видимо уже ничего не хочет.