Алгоритм игры «Собери число»

Я изо всех сил пытаюсь найти какое-то решение, но я понятия не имею об этом.

RobotA и RobotB, которые выбирают перестановку N чисел для начала. Робот А выбирает первым, а они выбирают по очереди. Каждый ход роботы могут выбрать только одно оставшееся число из перестановки. Когда оставшиеся числа образуют возрастающую последовательность, игра заканчивается. Робот, выбравший последний ход (после чего последовательность становится возрастающей), побеждает в игре.

Если предположить, что оба играют оптимально, кто выиграет?

Пример 1:

 The original sequence is 1 7 3. 
 RobotA wins by picking 7, after which the sequence is increasing 1 3.

Пример 2:

 The original sequence is 8 5 3 1 2.
 RobotB wins by selecting the 2, preventing any increasing sequence.

Есть ли известный алгоритм решения этой проблемы? Пожалуйста, дайте мне какие-либо советы или идеи о том, где посмотреть, было бы очень благодарно!


person Jiaji Li    schedule 11.11.2011    source источник
comment
Извините за публикацию без реального решения, но я считаю, что если вы сохраните базовый английский, больше людей поймут. Имея английский в качестве второго языка, я также чувствую необходимость использовать громкие слова, такие как перестановка, но просто говоря, что перестановка облегчает чтение и понимание того, что вы ищете.   -  person user85569    schedule 11.11.2011
comment
Спасибо вам за ваши предложения.   -  person Jiaji Li    schedule 11.11.2011
comment
@ user85569 Я не согласен. Нет причин тупить язык. Особенно, когда перестановка является общим словом в математике и информатике.   -  person Yuriy Faktorovich    schedule 11.11.2011
comment
@ user85569, перестановка - это стандартный математический термин. Его нельзя заменить перестановкой.   -  person taskinoor    schedule 11.11.2011
comment
@Yuriy Faktorovich Меня не учили математике или информатике на английском языке. Так что мне пришлось поискать это слово в Google, чтобы узнать, что он хотел сказать. Это мешает процессу, так как я уверен, что многие люди не говорят на английском как на родном языке и не учились на нем. Было предложение сделать вещи более понятными для всех... так как это интернет...   -  person user85569    schedule 11.11.2011
comment
@ Wisdom's Wind N просто является входным условием, когда последовательность 8 5 3 1 2 означает, что N равно 5.   -  person Jiaji Li    schedule 11.11.2011
comment
Нет. Каково максимально возможное N?   -  person Wisdom's Wind    schedule 11.11.2011
comment
@ Wisdom's Wind, я думаю, каков бы ни был максимально возможный N, но мне нужно гарантировать отсутствие повторяющихся элементов в последовательности.   -  person Jiaji Li    schedule 11.11.2011
comment
Позвольте мне объяснить, я могу дать вам решение, но это займет O(N!) времени. Если ок, то могу написать.   -  person Wisdom's Wind    schedule 11.11.2011
comment
@Wisdom'sWind, конечно, спасибо.   -  person Jiaji Li    schedule 11.11.2011
comment
Я все еще не понимаю игру. Ни одна из последовательностей не является перестановкой. Вы имеете в виду, что каждый робот выбирает разные числа до некоторой общей длины? Если это так, то, безусловно, паритет имеет значение. Не могли бы вы подробнее объяснить, как работает игра и каковы условия завершения?   -  person PengOne    schedule 12.11.2011
comment
@PengOne - я думаю, он хотел сказать, что роботы изначально начинаются с перестановки {1, ..., N}. В его примерах представлены не исходные последовательности (перестановки), а последовательности после определенного количества шагов в игре (поэтому некоторые числа отсутствуют, но изначально они были перестановками).   -  person IVlad    schedule 12.11.2011
comment
@IVlad Для меня это все еще не имеет смысла. Вы говорите, что он вытаскивает числа из перестановки до тех пор, пока оставшаяся последовательность не станет более упорядоченной? Если да, то решение зависит от исходной перестановки. Реальный пример или четкая экспозиция были бы полезны.   -  person PengOne    schedule 12.11.2011
comment
@PengOne - да, я так понимаю. Вам дается перестановка, и игроки A и B по очереди удаляют из нее числа, A ходит первым. Выигрывает тот, кто сделает так, чтобы оставшиеся числа располагались в порядке возрастания. Например: 1 4 3 2 => A убирает 1, и что бы ни убрал B после этого, A выиграет следующим ходом. Так что если оба будут играть оптимально, то A точно выиграет.   -  person IVlad    schedule 12.11.2011


Ответы (4)


Дана последовательность w различных чисел, пусть N(w) будет длиной w, а L(w) будет длиной самой длинной возрастающей подпоследовательности в w. Например, если

w = 3 5 8 1 4

затем N(w) = 5 и L(w) = 3.

Игра заканчивается, когда L(w) = N(w) или, что то же самое, N(w) - L(w) = 0.

Возвращаясь к игре в обратном порядке, если на ходу RobotX N(w) - L(w) = 1, то оптимальная игра состоит в том, чтобы удалить уникальную букву не из самой длинной возрастающей подпоследовательности, тем самым выиграв игру.

Например, если w = 1 7 3, то N(w) = 3 и L(w) = 2 с самой длинной возрастающей подпоследовательностью 1 3. Удаление 7 приводит к увеличению последовательности, гарантируя, что игрок, удаливший 7, выиграет.

Возвращаясь к предыдущему примеру, w = 3 5 8 1 4, если удалить 1 или 4, то для полученной перестановки u мы получим N(u) - L(u) = 1, поэтому игрок, удаливший 1 или 4, обязательно проиграет компетентному противнику. Однако любая другая игра приводит к победе, поскольку заставляет следующего игрока перейти на проигрышную позицию. Здесь оптимальная игра состоит в том, чтобы убрать любой из 3, 5 или 8, после чего N(u) - L(u) = 2, но после следующего хода N(v) - L(v) = 1.

Дальнейший анализ в этом направлении должен привести к оптимальной стратегии для любого из игроков.


Ближайшая математическая игра, которую я знаю, — это игра монотонной последовательности. В игре монотонной последовательности два игрока поочередно выбирают элементы последовательности из некоторого фиксированного упорядоченного набора (например, 1,2,...,N). Игра заканчивается, когда результирующая последовательность содержит либо восходящую подпоследовательность длины A, либо убывающую подпоследовательность длины D. Эта игра берет свое начало с теоремы Эрдоса и Секереса, и хорошее изложение можно найти в МОНОТОННЫЕ ПОСЛЕДОВАТЕЛЬНЫЕ ИГРЫ и эту слайд-презентацию Брюса Сагана также является хорошим справочником.

Если вы хотите больше узнать о теории игр в целом или о такого рода играх в частности, то я настоятельно рекомендую «Выигрышные пути для ваших математических игр» Берлекэмпа, Конвея и Гая. Том 3, я полагаю, посвящен такого рода играм.

person PengOne    schedule 11.11.2011

Похоже на проблему Minimax.

person taskinoor    schedule 11.11.2011
comment
Я не думаю, что это правильный путь. Это будет очень медленно и очень сложно реализовать так, чтобы игровой процесс был оптимальным. - person IVlad; 12.11.2011
comment
@IVlad У тебя есть лучшее предложение? Минимаксное или альфа-бета-отсечение — это стандартные способы изучения подобных деревьев игры. - person Nick Johnson; 14.11.2011
comment
@NickJohnson - нет, это не так. Это стандарт только для игр, не имеющих эффективного математического решения. Стандартный подход состоит в том, чтобы попытаться найти математический подход, используя теорию игр. Вы бы не использовали минимакс для игры ним, не так ли? Проблема выглядит так, как будто она есть, но нет, реального решения у меня пока нет. - person IVlad; 14.11.2011
comment
@IVlad IVlad, я тоже не был уверен, настоящий ли это минимакс. Вот почему я не сказал, что это минимакс, я сказал, что это похоже на минимакс. мне казалось, что минимакс может быть возможным решением. И да, у меня тоже нет идеального решения. - person taskinoor; 14.11.2011
comment
@IVlad Конечно, но я не уверен, что он есть, и вы не продемонстрировали обратного. Вы должны воздерживаться от критики, пока не предложите конкретную альтернативу. - person Nick Johnson; 14.11.2011
comment
@ Ник Джонсон - это было скорее мнение, чем критика, поскольку я не минусовал. Если это задано в классе или задано на собеседовании, я думаю, что ожидаемый ответ не будет чем-то вроде минимакса. Если вы хотите узнать, знает ли студент/опрашиваемый минимакс, есть вопросы получше. А оптимальная игровая часть, на мой взгляд, — это мертвая распродажа. Минимаксные реализации могут быть очень умными, но я пока не слышал об оптимальной. Я просто думаю, что это неверный путь, вот и все. - person IVlad; 14.11.2011
comment
И зачем мне вообще экономить на критике, если у меня нет ничего лучше? Может быть, моя критика поможет другим что-то придумать. Это точно никому и ничему не повредит, если это конструктивно и у меня есть аргументы. - person IVlad; 14.11.2011
comment
@IVlad Minimax и связанные с ним алгоритмы (альфа-бета и их уточнения) - это именно то, что используется для определения оптимальной игры. На самом деле вся основа минимакса заключается в том, чтобы действовать таким образом, чтобы свести к минимуму наихудшие последствия действий вашего оппонента, что и является оптимальной игрой. - person Nick Johnson; 15.11.2011
comment
@Nick Johnson - Minimax использует функцию рейтинга для присвоения очков части дерева игры, а затем выбирает ход на основе этих очков. Поскольку игровое дерево обычно очень большое (да, существуют методы обрезки, но обычно игровое дерево слишком велико, чтобы его можно было полностью изучить), минимакс никогда не будет играть оптимально, потому что очень трудно гарантировать, что эта функция будет работать оптимально с информацией. доступным для него. Попробуйте решить такие игры, как ним, с помощью минимакса. Затем решите их математически, сравните со своим минимаксом и посмотрите, какой из них действительно оптимален. - person IVlad; 15.11.2011
comment
@IVlad Если вы тщательно просматриваете дерево игр - единственный способ оптимально играть в игру без тривиального решения - минимакс / альфа-бета приводят к оптимальной игре. Это не так, только когда вам приходится ограничивать глубину поиска и делать приближения. Я не предлагаю использовать минимакс для решения проблемы, имеющей тривиальное решение, но вы не продемонстрировали, что здесь это так. - person Nick Johnson; 16.11.2011

Я думаю, что есть более быстрое решение для этой задачи. Я подумаю. Но я могу дать вам идею решения со сложностью O(N! * N^2).

Во-первых, обратите внимание, что выбор числа из N-перестановки эквивалентен следующему:

  1. Выберите число из N-перестановки. Пусть это был номер X.

  2. Переназначить номера по правилу:

1 = 1

2 = 2

...

X-1 = X-1

X = Ничего, его нет.

X+1 = X

...

N = N - 1

И вы получите перестановку N-1 чисел.

Пример:

1 5 6 4 2 3

Выберите 2

1 5 6 4 3

Переназначить

1 4 5 3 2

Давайте использовать это как ход, вместо того, чтобы просто выбирать. Также легко видеть, что игры эквивалентны, игрок А выигрывает в этой игре для некоторой перестановки тогда и только тогда, когда он выигрывает в оригинале.

Дадим код всем перестановкам из N чисел, N-1 чисел, ... 2 чисел.

Определить F(x) -> {0; 1} (где x — код перестановки) — это функция, которая равна 1, когда текущий

игрок выигрывает, и 0, если текущий игрок терпит неудачу. Легко увидеть F(1 2 .. K-1 K) = 0.

F(x) = 1, если есть хотя бы ход, который переводит x в y, и F(y) = 0.

F(x) = 0, если для любого хода, переводящего x в y, F(y) = 1.

Таким образом, вы можете использовать рекурсию с запоминанием для вычисления:

Boolean F(X)
{
    Let K be length of permutation with code X.
    if you already compute F for argument X return previously calculated result;
    if X == 1 2 .. K return 0;
    Boolean result = 0;
    for i = 1 to K do
    {
         Y code of permutation get from X by picking number on position i.
         if (F(y) == 0)
         {
             result = 1;   
             break;
         }
    }
    Store result as F(X);
    return result;
}

Для каждого аргумента мы будем вычислять эту функцию только один раз. Есть 1! перестановки длины 1, 2! перестановки длины 2 .. N! перестановки длины N. Для длины перестановки K нам нужно выполнить операцию O (K) для вычисления. Таким образом, сложность будет O(1*1! + 2*2! + .. N*N!) =‹= O(N! * N^2) = O(N! * N^2)

person Wisdom's Wind    schedule 11.11.2011

Вот код Python для алгоритма Wisdom's Wind. Он выводит выигрыши для RobotA.

import itertools

def moves(p):
    if tuple(sorted(p)) == p:
        return
    for i in p:
        yield tuple(j - (j > i) for j in p if j != i)

winning = set()

for n in range(6):
    for p in itertools.permutations(range(n)):
        if not winning.issuperset(moves(p)):
            winning.add(p)

for p in sorted(winning, key=lambda q: (len(q), q)):
    print(p)
person Per    schedule 12.11.2011