Я сам рассмотрел эту проблему, и лучшее, что я могу сделать, - это решить, насколько сложно решить головоломку, фактически решив ее и проанализировав игровое дерево.
Первоначально:
Реализуйте свой решатель, используя «человеческие правила», а не алгоритмы, которые вряд ли будут использоваться людьми. (Сама по себе интересная проблема.) Оцените каждое логическое правило в своем решателе в соответствии с его сложностью для использования людьми. Используйте значения в сотнях или больше, чтобы у вас была возможность корректировать оценки друг относительно друга.
Решите загадку. На каждой позиции:
- Перечислить все новые ячейки, которые могут быть логически выведены в текущей игровой позиции.
- Оценка каждого вычета (полное решение одной ячейки) - это оценка простейшего правила, достаточного для этого вычета.
- РЕДАКТИРОВАТЬ: если более одного правила должны применяться вместе, или одно правило несколько раз, чтобы сделать один вывод, отслеживать его как одно "составное" применение правила. Чтобы оценить состав, возможно, используйте минимальное количество отдельных приложений правил, чтобы вычислить ячейку, умноженную на сумму баллов каждого. (Значительно больше умственных усилий требуется для таких выводов.) Расчет минимального количества приложений может потребовать значительных ресурсов процессора в зависимости от установленных правил. Любое приложение правила, которое полностью решает одну или несколько ячеек, следует откатить, прежде чем продолжать исследовать позицию.
- Исключить все вычеты с оценкой выше минимальной среди всех вычетов. (Логика здесь заключается в том, что игрок не будет воспринимать более сложные, восприняв более легкое и взяв его; а также, это обещает сократить много вычислений из процесса принятия решений.)
- Минимальная оценка в текущей позиции, поделенная на количество «самых простых» вычетов (если их много, найти проще) - это сложность этой позиции. Таким образом, если правило A является наиболее простым применимым правилом с оценкой 20 и может применяться в 4 ячейках, позиция имеет оценку 5.
- Выберите один из "самых простых" вычетов наугад в качестве своей игры и переходите к следующей игровой позиции. Я предлагаю оставить только полностью решенные ячейки для следующей позиции, не переходя ни в какое другое состояние. Конечно, это бесполезно расходует ресурсы процессора, повторяя уже выполненные вычисления, но цель состоит в том, чтобы симулировать игру человека.
Общая сложность головоломки - это сумма баллов позиций на вашем пути через игровое дерево.
РЕДАКТИРОВАТЬ: Альтернативная оценка позиции: вместо того, чтобы полностью исключать вычеты с использованием более сложных правил, рассчитайте общую сложность каждого правила (или составного приложения) и выберите минимум. (Логика здесь заключается в том, что если правило A имеет оценку 50, а правило B имеет оценку 400, и правило A может применяться в одной ячейке, а правило B может применяться в десяти, то оценка позиции составляет 40, поскольку игрок с большей вероятностью определите одну из десяти более сложных игр, чем одну более простую, но это потребует от вас вычисления всех возможностей.)
РЕДАКТИРОВАТЬ: Альтернатива, предложенная Briguy37: Включить все вычеты в балл позиции. Оцените каждую позицию как 1 / (1/d1 + 1/d2 + ...)
, где d1
, d2
и т. Д. Являются индивидуальными вычетами. (Это, в основном, вычисляет «сопротивление совершению любого вычета» в позиции, заданной отдельными «сопротивлениями удержания» d1
, d2
и т. Д. Но для этого потребуется вычислить все возможности.)
Надеемся, что эта стратегия выигрыша даст метрику для головоломок, которая увеличивается по мере увеличения вашей субъективной оценки сложности. Если этого не произойдет, то при корректировке баллов ваших правил (или вашего эвристического выбора из указанных выше вариантов) может быть достигнута желаемая корреляция. Как только вы достигнете последовательной корреляции между оценкой и субъективным опытом, вы сможете судить, какими должны быть числовые пороги «легкий», «жесткий» и т. Д. И тогда все готово!