Chat:Ru/2021-03-22

From CG community
Jump to navigation Jump to search

tutubalin: не 3 миллиона, а меньше. и тогда может будет в питон их нормально впихнуть

wlesavo: ну тебе все-равно нужен проход по трем миллионам

tutubalin: а, ну да...

tutubalin: хотя можно отсечение сделать

tutubalin: нашёл, как ускорить примерно на 50-100%. теперь почти всегда меньше 320 даёт.

MadKnight: и как?)

tutubalin: да у меня раньше при каждой проверке кандидата строилось новое дерево. убрал это, теперь только в конце строится уже для лучшего кандидата

tutubalin: появились идейки, как ещё соптимизировать чуток, но там уже вряд ли большой выхлоп будет

tutubalin: раньше на втором ходу для N=10 успевало перебрать 5 кандидатов. теперь 10.

MadKnight: что значит перебрать?

MadKnight: как именно?

tutubalin: есть список доступных комбинаций

tutubalin: если он небольшой, то можно проверить все из них

tutubalin: берёшь первую, сравниваешь со всеми остальными. считаешь, сколько инфы она даст. берёшь вторую и то же самое

tutubalin: трудоёмность O(N^2)

tutubalin: если список большой (например, миллион комбинаций), то все комбинации оценить не получится, поэтому просто выбираю несколько рандомных кандидатов и их оцениваю

tutubalin: вот раньше если список был из миллиона, успевал оценить 6 кандидатов (то есть 6 миллионов сравнений). теперь успеваю 12.

MadKnight: а как считаешь сколько инфы даст?

tutubalin: я же уже рассказывал. по формуле Шеннона

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

magaiti: как считается, кто выиграл в уттт, если поровну досок выиграно?

magaiti: у кого больше крестиков/ноликов на оставшихся досках, или у кого больше досок, на которых больше крестиков/ноликов?

magaiti: хотя одно и то же по идее

735487: у кого больше выигранных досок вроде

735487: а если поровну то ничья

Uljahn: если поровну, то ничья

magaiti: хз, а цг умеет ничью считать?

735487: умеет

magaiti: хмм ладно

735487: там за нолики ничья более выгодная с точки зрения рейтинга

wlesavo: tutubalin у меня на втором ходу два кандидата :smiley:

wlesavo: а считаю не по формуле а просто да чтобы самая большая подгруппа была как можно меньше

tutubalin: wlesavo я не проверял, но по идее из одного должно следовать другое, то есть равносильные критерии должны быть

miklla: вряд ли они равносильны

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

miklla: у меня есть примеры, когда наилучшее матожидание != минимальная макс группа

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

wlesavo: у внешнего хода есть недостаток в том что он не может случайно оказаться таргетом

miklla: да, я знаю, но когда вариантов много, внутренний так редко оказывается секретом, что это не важно

miklla: с тем же успехом можно говорить "а зачем вообще придумывать какой-то алгоритм, если можно случайно угадать на втором ходу"

wlesavo: ну да, но ближе к концу это релевантно

miklla: если осталось не больше трёх вариантов, то внешний ход никогда не наилучший

tutubalin: miklla а пример с внешним числом большой?

miklla: нет, маленький

miklla: http://chat.codingame.com/pastebin/bfe413a0-e0be-4671-99ee-4ba03e2322cb

miklla: тогда любой внутренний ход не даёт инфы, кроме попал/не попал, таким образом матожидание 2.5

miklla: однако ход 1243 с вероятностью 50% даёт гарантированное попадание на следующем ходу, а с вероятностью 50% оставляет 2 равнозначные опции, которые угадываются за 2.5 в среднем, итого матожидание через внешний 2.25

tutubalin: а такой набор вообще может остаться в реальной игре?

miklla: да

miklla: у меня встречался подобный

miklla: ну как кусок 9-ти значного числа, но нефиксированные места были такой структуры

tutubalin: вот же ж блин!

miklla: ух, долго не мог найти хороший фундамент теории комбинаторных игр в открытом доступе, а вот и он https://www.math.kth.se/matstat/gru/sf2972/2015/gametheory.pdf

miklla: (всё ещё готовлюсь к клобберу) :)

MadKnight: A game is an ordered pairG={GL|GR}

MadKnight: are the sets ofleftandright optionsofG

MadKnight: чё за let and right options ?

MadKnight: miklla

MadKnight: LetPbe any property that a game can have. If a game isPwheneverany option isP, then all games areP.

MadKnight: чё за game property и game option ?

MadKnight: left/right это типа речь об играх где только 2 возможных хода?

MadKnight: The simplest of all games is{|}which we callthe zero gameand denote by 0

MadKnight: тут ничего не понял, о чём вообще речь?

miklla: в игру (например шахматы) пусть играют 2 игрока, левый и правый

miklla: {G_L | G_R}, в нём G_L - множество позиций, в которые может попасть левый игрок из позиции G, если его ход

miklla: G_R - множество позиций, в которые может попасть правый игрок из позиции G, если его ход

MadKnight: ааа

MadKnight: а чё за simplest game ?

miklla: хоть и для решения игры обычно есть лишь стартовая позиция, где ход определённого гирока

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

miklla: это кажется бесоплезным

miklla: но

miklla: это очень полезно, когда игра разбивается на компоненты связности, как в клоббере

miklla: я бы рекомендовал сначала читать не теорию, а статью, которую скидывал ранее https://project.dke.maastrichtuniversity.nl/games/files/msc/Claessen_thesis.pdf

Uljahn: а, это null-move heuristic вроде

miklla: если ты про то, что никогда не надо делать ход в подыгре значения ноль, то это не эвристика, а оптимальная стратегия

miklla: или что ты имел ввиду?

MadKnight: miklla а что именно вообще дают эти 2 статьи?

MadKnight: для практики

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

MadKnight: чё за компоненты?

MadKnight: и чё за значения?

miklla: ну например если позиция разбилась на 2 компоненты по 10 команей

miklla: камней*

MadKnight: погоди, мне надо изучить вообще эту игру

miklla: обычно тебе бы пришлось её перебирать, как целую

MadKnight: а то я не знаю о чём она

MadKnight: есть линк?

miklla: https://www.codingame.com/ide/puzzle/clobber

MadKnight: а

MadKnight: > ну например если позиция разбилась на 2 компоненты по 10 команей всмысле что 10 камней никак не могут повлиять на другие 10 камней?

miklla: да, такое часто случается

MadKnight: ну так это и так было бы понятно

miklla: и что ты собирался делать в таком случае?

MadKnight: а как эти твои линки помогают с этим?

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

miklla: если окажется, что позиции вычислимы или сравнимы с нулём, то можно найти оптимальный ход, перебирая их по-отдельности, а не вместе

MadKnight: ну так это понятно

miklla: и как ты собрался определить, в какой ход нужнее всего, и что это за ход вообще?

MadKnight: а тут надо отталкиваться от условий победы

miklla: проигрывает, кто не может сделать ход

MadKnight: если каким-то образом можно победить чисто одной компонентой - то забиваем на менее потенциальные

MadKnight: если же всеми - то ходим той, где хуже всего дела

miklla: а если 2 компоненты, в каждой из которых выигрывает тот, кто делает первый ход?

MadKnight: а стоп

MadKnight: я только что это понял

MadKnight: число ходов у игроков одинаковое

MadKnight: была похожая мульти

MadKnight: там что-то похожее с ходами было

MadKnight: там типа массив вертикальных линий, и на каждой стоит твой юнит и юнит противника

MadKnight: ты двигаешь одного юнита за ход вверх

MadKnight: а противник - вниз

MadKnight: через друг друга проходить не можете

MadKnight: и проигрывает тот, у кого ходов не будет первым

MadKnight: помнишь такую?

miklla: корридор?

miklla: который тут называется по-другому

miklla: мельница на рисунке

miklla: тут он называется the great escape

MadKnight: нене

MadKnight: где у тебя на каждом Х по фишке

miklla: не знаю такой

Uljahn: miklla: показалось, что похоже на https://en.wikipedia.org/wiki/Null-move_heuristic

MadKnight: https://www.codingame.com/ide/puzzle/find-the-winning-strategy

MadKnight: нашёл

MadKnight: miklla

miklla: прикольная эвристика, не знал о ней, да, напоминает

miklla: только там эвристика, а тут точная теория

tutubalin: MadKnight это по сути игра Ним. представь что вместо солдатиков и клеток между ними - просто кучки камней. и ты выбираешь, из какой кучки сколько забрать

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

MadKnight: tutubalin ну так о том и речь

miklla: да, линк MadKnight как раз на задачу про суммирование игр, для её решения надо применять теория Шпрага-Гранди, которая является подтеория комбинаторных игр

MadKnight: просто там кучки ещё друг на друга влияют

tutubalin: вот и в клоббере тоже влияют.

MadKnight: нене

MadKnight: я про клоббер и говорил

tutubalin: в солдатиках у меня решение на JS 19х8 символов :)

tutubalin: не совсем правильный квадрат, но симпатично

MadKnight: пробовал перебор для поиска что даёт больше всего информации с глубиной?)

MadKnight: типа 2 подряд

MadKnight: кто тут играл в одну из этих игр? Fireworks, Clobber, Connect4, 2048

MadKnight: ну с clobber в основном уже знаю

tutubalin: Connect4, говорят, полностью решена

Uljahn: есть классный вариант Connect4, там два цвета и две формы фишек, надо по цвету или по форме соединять

Uljahn: по этим правилам даже чемпионаты AI проводят, вроде

MadKnight: Uljahn а мульти на CG по этой версии будет?)

tutubalin: кстати, а есть какое-то ограничение на время компиляции?

MadKnight: tutubalin ну вроде секунда на первый ход