Блог пользователя yahooo

Автор yahooo, 13 лет назад, По-русски

Помогите разобраться с функцией Гранди... Не могу понять, в чем прикол ставить в соответстие состоянию игры какое-то число... и почему это число есть mex{m1,m2,m3...mk}(читал статью на e-maxx.ru)? 

P.S.  просьба ссылки на гугл не давать, там уже смотрел, написано формальным языком и мало что понятно...

  • Проголосовать: нравится
  • -21
  • Проголосовать: не нравится

13 лет назад, # |
Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

Вот я сам пишу регулярно задачи на функцию Гранди, и сдаю, и нормально, но всё-таки не понимаю, почему это работает. Сейчас для интереса глянул статью на e-maxx и понимания у меня не особо прибавилось.

Там в лемме о ниме с увеличениями есть такое предложение: "Если же текущее состояние проигрышно, то тем более наличие или отсутствие этого хода ничего не может изменить", - а мне вот кажется, что смысл делать такой ход таки есть - это может позволить зациклить игру вничью. Однако Макс пишет, что так быть не может, поскольку игра с увеличениями сама должна быть реализована как ациклический граф. Но какие конкретно ограничения это налагает на возможные ходы? Например, если в игре можно увеличивать только на y, а есть две кучки размера x, то это - не проигрышная позиция, а ничейная. Вот как, спрашивается, в терминах нима (камни, кучки...) сделать игру с увеличениями, чтобы она была ациклической? А ведь если мы этого не поймём, то дальнейшее доказательство тоже рушится становится применимым для непонятно какого множества игр, и так-то вот неочевидно, что для непустого.

Это было раз. Ну а два - ксоры и индукция могут поспособствовать вере в истинность доказательства, но не его пониманию - это всё как-то слишком неинтуитивно. Хотелось бы услышать какие-нибудь нестрогие наводящие соображения, "чтоб руками пощупать", если, конечно, я не единственный такой отсталый из тех, кто в рейтинге.
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +5 Проголосовать: не нравится

    То, что игра закончится-это дано,и зачем задумываться как оно реализовано:)

    Ну например тут приведен такой пример:

    Player II may keep adding chips, but will eventually run out of them.То есть,сумма всех увеличивающих ходов ограничена.Возможно,я что-то не так понял:)

    Автору топика:

    Попробуйте почитать книгу,ссылка на которую дана внизу статьи на e-maxx.ru

    Почему берем числа-объъясняется в главах 8,9

    Почему mex-теорема 71..

  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +7 Проголосовать: не нравится

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

    Стандартный пример из "реальных" задач - это "лестничный ним": т.е. есть n ступенек, в каждой a[i] камней (i=0..n-1), и за один ход мы можем переложить любое количество камней из какой-то k-ой кучки в k-1-ю. Тогда, если рассмотреть только ступеньки с нечётными номерами, т.е. числа a[1], a[3], a[5], и т.д., то получится ним с увеличениями: мы можем либо уменьшить какое-то число (что соответствует перекладыванию из нечётной в чётную), либо увеличить (а это - из чётную в нечётную). Понятно, что увеличения здесь вполне ограничены: хотя бы даже из того факта, что камни всегда передвигаются в сторону к первой ступеньке, т.е. игра не может длиться бесконечно.

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

    Если проще соображать в терминах лестничного нима - то эту лемму можно понять так. Если мы рассмотрим только числа a[1], a[3], a[5], ..., то да, по условию мы можем увеличить какое-то из чисел - но зачем, если у противника на этот случай есть симметричная стратегия? Мы увеличили какое-то число, а противник уменьшит его обратно, при этом мы придём к тому же набору чисел a[1], a[3], a[5], ..., но уже окажемся ближе к концовке игры. Значит, увеличение - это глупый ход, он нам никак не улучшит ситуацию, не позволит достигнуть даже ничьи.


    P.S. а про ксоры и мексы хорошо написал kuniavski.

    P.P.S. конвей, конечно, крутая книжка, но сказать откровенно - очень тяжело написанная, так что я не уверен, что с её помощью разобраться будет проще.

13 лет назад, # |
Rev. 3   Проголосовать: нравится +38 Проголосовать: не нравится

Попробую вкратце все объяснить.

1. По поводу эквивалентности ниму, как себе все это представить и.т.д.
Что такое ним? Это полный ориентированный ацикличный граф. Вообще в теории Гранди рассматриваются  ТОЛЬКО ацикличные графы, поэтому зацикливание невозможно как таковое. Как может быть устроен ним с возвратом и почему он эквивалентен обычному ниму. Я себе это представляю так. У нас есть несколько ацикличных полных графов, и какие-то переходы между ними, не создающие циклов. То есть из каждой вершины есть все необходимые переходы вниз, и какие-то еще переходы, только не вверх, а куда-то в бок.Почему такой ним эквивалентен обычному? Да потому что, если мы в выигрышной позиции - нам этот ход в бок просто не нужен, а если в проигрышной - то он ничего не даст, т.к. из него нас переведут в такую же позиция как и была. Делать это бесконечно долго у нас не получится, так как нет циклов. Еще для желающих сюда можно дописать слово индукция.

2. По поводу откуда взялся mex.
Что представляет из себя игра? Игра это некоторая вершина, и множество игр соответствующих ее потомкам. (Что на самом деле тоже самое что и ацикличный граф). Опять вспоминая что бывает индукция, и что вершина без переходов это вполне себе ним-0, Мы можем заменить всех потомков на какие-то нимы. А теперь что же у нас получилось? Это и есть ним с возвратом размера mex! Почему? Потому что есть переходы во все меньшие нимы и в какие-то большие, при этом нет зацикливания. Но ним с возвратом эквивалентен обычному ниму того же размера. То есть исходная игра эквивалентна этому mex'у.

3. По поводу зачем все это нужно.
Функция гранди - некоторое число, полностью характеризующее ацикличную игру, с точки зрения выигрышности/проигрышности. То есть мы заменяем достаточно сложную конструкцию - ацикличный граф,  простой - числом. Это уже радует. А что нам это еще дает. Без функции гранди чтобы проанализировать несколько независимых игр сразу, или игру распадающуюся на независимые, пришлось бы строить новый граф, объединяющий две игры в одну, причем в нем количество вершин будет произведением количеств вершин в исходных графах - а это не мало.

4. По поводу откуда взялся ксор.
Утверждается что функция гранди от суммы двух независимых игр  будет ксором их функций гранди. Это вполне хорошо доказано у макса для нимов, а любая игра как написано выше эквивалентна ниму. Остается узнать какому. То что это будет ксор можно показать для двух игр(чего в силу ассоциативности ксора достаточно) по индукции. Выглядеть это будет примерно так. Нарисуем табличку. в клетку (i,j) напишем i^j. Докажем, что число в каждой клетке - мекс всего что написано под ней и левее ее. Это доказывается по индукции. Только за переход надо не +1 делать, а удваивать квадрат. Тогда для нижней левой четверти все очевидно, для верхней левой и нижней правой - у нас есть все числа от 0 до 2k - 1 в нижней левой четверти и то что нужно в этой же. А для верхней правой числа в нижней правой и верхней левой слишком большие, а она сама совпадает с нижней левой. Этот кусок доказательства лучше нарисовать. И собственно все.

P.S.  вкратце не получилось.
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    а как можно узнать по числу m, сопоставленное состоянию, выигрышное это или проигрышное состояния? 

    P.S наверное если m отлично от нуля, то выигрышное, иначе нет?

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да. Игра эквивалентна ниму размера m. Если m = 0 то ним проигрышный, иначе - выигрышный, т.к. есть ход в 0.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
всем спасибо, более или менее разобрался
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
кст, раз уж зашел разговор, можно несколько задач на эту тему?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    ну вот есть небольшая подборка (если что-то получится понять из этого конспекта):

    http://e-maxx.ru/upload/lections/lection_games.pdf

    • 13 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      а где можно почитать какой-нибудь подробный пошаговый анализ какой-либо из игр (а еще лучше несколько разных типов приведения impartial игр к функции Гранди)?
      потому как теория, вроде, понятна, а на практике не совсем понятно как оно решается
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

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

        а с материалом по этой теме вообще проблемы, и именно анализа задач я нигде не видел - сам рад бы был почитать

        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          понятно. спасибо.
          "будем искать"(с)
          p.s: Есть повод кому-то из красных написать пару статей. Если не здесь, то на хабр, к примеру ;)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А есть какой-нибудь красивый способ считать mex чисел на практике? Я делаю это сетом. Можно ли делать это за линию с помощью какой-нибудь арифметической магии? Массив пометок не годится, это тот же сет по сути.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Да, только он за линию, а  не за nlogn. Более разумное что-то вряд ли получится.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Погодите, это пройтись по сету можно за линию. А при последовательном совании в него n произвольных элементов либо всё-таки есть логарифм, либо я чего-то не понимаю (во втором случае буду рад, если мне объяснят, в чём дело).
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        С сэтом таки n * log n, kuniavski имел ввиду что есть метод за линейку. Только почему LooNaTeg не нравится массив пометок? Асимптотика то лучше.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ну, он тогда за линию, да не за ту. Массив пометок либо за O(MlogM), где M - число переходов из данного состояния, либо за O(N), где N - число состояний, а LooNaTeg, видимо, хочет за O(M), а ёк.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            За O(M) можно: заведём большой глобальный массив размера N, в нём сначала поюзаем числа по каждому из M переходов, потом тупо найдём первое непоюзанное число (очевидно, оно будет не больше M) - это мы нашли mex, а потом ещё раз пройдёмся по всем переходам и снимем отметки из массива.
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Или ещё проще - просто сделаем числовой used.


              Только хотелось, видимо, совсем арифметического решения без массивов - имхо, маловероятно, что такое решение есть.

            • 13 лет назад, # ^ |
              Rev. 6   Проголосовать: нравится 0 Проголосовать: не нравится

              Это-то понятно, но тогда спрашивается зачем. У нас же всё равно O(NM) O(N2) памяти юзается, так что выигрыша никакого нет.
              • 13 лет назад, # ^ |
                  Проголосовать: нравится +3 Проголосовать: не нравится
                Ну если всё правильно написать, то можно обойтись одним таким глобальным массивом, так что будет O(N) памяти, а время - O(M) на одно состояние.
                • 13 лет назад, # ^ |
                  Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                  А, кажется, понял. "Всё правильно написать" - это значит понять, в каком порядке нужно обрабатывать состояния, чтобы динамика настоящая получилась, а не ленивая. Спасибо.
                  P.S. Вот только понять это заранее в некоторых задачах, возможно, вовсе не получится.
                  • 13 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Нет, я туплю. Моё P.S. в предыдущем комменте не читать - сам убрать не могу из-за несовершенства интерфейса.
                  • 13 лет назад, # ^ |
                      Проголосовать: нравится +3 Проголосовать: не нравится

                    ===============

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

            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              За O(M) можно и с локальными массивами сделать, но только если M известно заранее. Заводим массив размера M+1 и ставим пометки, если они не превышают M+1. mex в любом случае будет <= M+1, поэтому все бОльшие числа бесполезны.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Нравится мне массив пометок. Что касается асипмтотики, то я не видел пока задач, где этот небольшой log будет критичен. Хотелось, действительно, как сказал e-maxx, узнать именно арифметическое решение, если бы оно было.
»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Что делает U?

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Объединение

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      "Крестики-крестики"

      Условие. Рассмотрим клетчатую полоску размера 1xN клеток. За один ход игроку надо поставить один крестик, но при этом запрещено ставить два крестика рядом (в соседние клетки). Проигрывает тот, кто не может сделать ход. Сказать, кто выиграет при оптимальной игре. (c) e-maxx.ru

      Плз, сможете скинуть код от этой задачи используя Grandy?

      • »
        »
        »
        »
        10 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится -16 Проголосовать: не нравится

        при оптимальной игре ничья.

        UPD бред написал. не прочитал внимательно задачу.