Алгоритм «попробуйте все возможные последовательности, пока вы не сделаете это правильно» - PullRequest
0 голосов
/ 29 февраля 2020

Это, вероятно, полностью рудиментарно, но я все еще не уверен, как это сделать.

Предположим, у меня есть список action функций / операторов / what-have-you и объекта x. Для некоторого сохраненного значения y я хочу проверить, возможно ли получить y, применяя члены action, и вернуть кратчайшую последовательность действий, которая принимает от x до y.

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

У меня есть смутное представление о том, как это можно сделать, но я не совсем уверен в спецификациях - что-то вроде:

//Set the maximum number of steps (to prevent overflow)
n = whatever

//Algorithm

<<start>>

While i<n

  u = x
  sequence = []

  <<begin loop-like thing
    u = apply actions to u
    sequence = sequence.append(action.index(last action))
  end loop-like thing>>

  i = i + 1

  if u==y
    print sequence
  else
    <<return to start>>

(я использую <<stuff>> в качестве заполнителя для случаев, когда я не знать, что такое stuff).

Для конкретного примера приложения рассмотрим action как список законных поворотов кубика Рубика, а x - начальное (зашифрованное) состояние, и y быть решенным состоянием. Это решает кубик Рубика, используя наименьшее количество возможных шагов, и печатает решение.

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

...