Алгоритм решения игры (Buttonia, вариант с подсветкой) - PullRequest
6 голосов
/ 31 июля 2009

Я пытаюсь создать функцию разрешимости для игрового алгоритма. В основном это функция, которая возвращает true или false для данной игры, если она разрешима или нет.

Игра представляет собой Buttonia.com (которая пока не реализует алгоритм), тип игры с подсветкой. По сути, у вас есть сетка кнопок, каждая из которых при нажатии изменяет состояние некоторых ее соседей. В настоящее время я генерирую случайную конфигурацию игры и затем применяю эвристику, насколько это возможно. Все остальное решается поиском грубой силы.

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

button_A = 1 - (button_1 + button_2 + ... + button_X)% 2

Где button_1 - button_X - состояния кнопок, влияющих на button_A. Некоторые кнопки могут быть немедленно разрешены, если они не зависят от других. В остальном я пробую одну конфигурацию, пока не получу конфликт, а затем вернусь.

В настоящее время этот алгоритм полезен для небольших конфигураций игр. Я тестировал игры от 3х3 до размеров 10х10. Где 6x6 находится рядом с верхним пределом для практической игры.

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


Пример игры 3x3 в ascii (из buttonia.com /? Game = 2964 ):

||#
-o-
+#|

Legend:
o = affect only self
- = affect left and right neighbors
| = affect above and below neighbors
+ = affect left, right, above and below neighbors
# = affect all 8 surrounding neighbors

Решение, нажмите эти: (0,0), (2,0), (1, 2), (0, 1), (1, 1), (2,1)

Уравнения для этой игры:

Button_0_0 = 1 - (0) % 2
Button_1_0 = 1 - (Button_2_0) % 2
Button_2_0 = 1 - (0) % 2
Button_0_1 = 1 - (Button_0_0 + Button_0_2 + Button_1_2) % 2
Button_1_1 = 1 - (Button_1_0 + Button_2_0 + Button_0_1 + Button_2_1 + Button_1_2) % 2
Button_2_1 = 1 - (Button_2_0 + Button_1_2 + Button_2_2) % 2
Button_0_2 = 1 - (Button_1_2) % 2
Button_1_2 = 1 - (Button_0_2) % 2
Button_2_2 = 1 - (Button_1_2) % 2

Потенциальное решение:

Изменение математических функций во избежание необходимости использования модуля позволяет нам перемещать члены с левой стороны вправо, создавая аккуратную матричную настройку, необходимую для метода Гаусса. Таким образом, первые два уравнения будут соответственно преобразованы в:

-1 = -1*B00 +  0*B10 +  0*B20 +  0*B01 +  0*B11 +  0*B21 +  0*B02 +  0*B12 +  0*B22
-1 =  0*B00 + -1*B10 + -1*B20 +  0*B01 +  0*B11 +  0*B21 +  0*B02 +  0*B12 +  0*B22

Обсуждаемое решение здесь: Исключение по Гауссу с пользовательскими операторами

Становится ближе. Почти готов к публикации полного решения: Инвертирующие двоичные сети

Ответы [ 5 ]

4 голосов
/ 31 июля 2009

Это система линейных уравнений над F 2 , поле, содержащее два элемента 0 и 1.

Вы можете решить это так же, как нормальные линейные уравнения, но вы должны выполнить арифметику по модулю 2.

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

  • Сложение и вычитание становятся исключительными или, т. Е. 0 + 0 = 0, 0 + 1 = 1, 1 + 1 = 0.

  • Умножение становится И: 0 * 0 = 0, 0 * 1 = 0, 1 * 1 = 1

  • Деление возможно только на одно: 0/1 = 0, 1/1 = 1.

Все коэффициенты в ваших уравнениях и возможные значения неизвестных либо 0, либо 1.

Таким образом, модуль не накладывается на внешние уравнения, как вы написали, он подразумевается в операциях.

Если ваша система уравнений не разрешима, вы получите уравнение 0 = 1, которое, очевидно, не разрешимо.

2 голосов
/ 31 июля 2009

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

1 голос
/ 31 июля 2009

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

0 голосов
/ 09 ноября 2012

Предположим, вы построили систему уравнений и решили их наилучшим образом, но некоторые строки оказались со всеми нулями в левой части уравнения (я представляю уравнения в виде расширенной матрицы) Предположим, вы пытались решить систему в кольце Z2 (что в практическом плане для этого конкретного примера означает, что единственное изменение - это то, что 1 + 1 = 0, в противном случае все остается прежним ... поэтому единственный оператор, который нам нужен, это XOR) и получил следующую матрицу:

1001 1
0100 1
0011 0
0000 0

Как вы можете видеть в этом примере, все 4-й ряд равен 0, что означает, что у нас нет ответа на него. Однако подумайте об этом следующим образом: строка всех 0 означает, что эта переменная не влияет на решение. Это на самом деле плохой выбор слов ... это просто означает, что они могут иметь любое значение (и здесь нам повезло, поскольку все значения означают 1 или 0, в отличие от действительных чисел ... Так что это означает, что у нас есть 2 решения для этой системы).

И вот почему: на данный момент вам нужно знать, что самый правый столбец все еще содержит правильное решение для вашей игры. Давайте возьмем первую строку для примера. Это говорит о том, что

button_0 + button_3 = 1

но мы знаем, что кнопка 3 может быть чем угодно (поскольку в строке 3 все 0). На данный момент кнопка 3 имеет значение 0 (самый правый столбец в строке 3 на этом этапе равен 0), поэтому теперь мы знаем, что это означает

button_0 + 0 = 1

поэтому мы точно знаем, что button_0 равен 1. Поэтому в этой системе, хотя мы не могли напрямую определить button_3, у нас все еще есть правильное решение.

Сгенерированной выше матрицы достаточно для проверки разрешимости. Если строка содержит все 0, то по сути это означает, что

nothing = nothing

или, чтобы лучше представить себе, почему это работает,

0x = 0

что имеет смысл, система все еще действует. Однако, если мы встречаем строку со всеми 0 с , за исключением самого правого бита, то есть

0000 1

что бы сказать

0x = 1

, что невозможно, поэтому мы теперь знаем, что система не может быть решена, поскольку мы не можем решить невозможную ситуацию, подобную этой.

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

Но что, если мы хотим, чтобы самое короткое решение для системы? Здесь мы должны рассмотреть все возможные решения. У нас есть кнопка_3, которая может иметь любое значение, поэтому это означает, что любая 1 в столбце 3 означает, что на строку, в которой она найдена, действует кнопка_3. Итак, предположим, что мы хотим проверить, будет ли решение, использующее button_3, короче. Мы создаем другую матрицу, но теперь устанавливаем для button_3 значение 1 (поскольку ранее мы установили, что это может быть что угодно, и у нас там уже было 0, поэтому теперь мы проверяем 1). Теперь мы получаем следующую матрицу:

1001 1
0100 1
0011 0
0001 1

Мы сократили это до максимума и теперь получаем следующую матрицу:

1000 0
0100 1
0010 1
0001 1

Это все еще верное решение, однако мы можем видеть, что решение длиннее (требуется 3, а не 2 нажатия кнопок), поэтому мы отказываемся от него. Мы должны сделать это для каждой перестановки установки строк, которые мы нашли как все 0s к 1. Поэтому, если у нас есть x строк, которые были всеми 0, то у системы есть x ^ 2 решения, и мы должны проверить все из них.

0 голосов
/ 31 июля 2009

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

Это будет медленно, однако почти гарантированно найти ответ, если он есть!

...