我自己考虑过这个问题,我能做的最好的就是通过实际解决它并分析游戏树来确定这个难题的难度。
最初:使用“人类规则”实现您的求解器,而不是使用人类玩家不太可能使用的算法。(这本身就是一个有趣的问题。)根据人类使用的难度为求解器中的每个逻辑规则评分。使用数百个或更大的值,以便您可以自由调整相对于彼此的分数。
解决难题。在每个位置:
- 枚举所有可以在当前游戏位置逻辑推导出的新单元格。
- 每个扣除的分数(完全解决一个单元格)是足以进行该扣除的最简单规则的分数。
- 编辑:如果必须同时应用多个规则或多次应用一个规则以进行单个扣除,则将其作为单个“复合”规则应用程序进行跟踪。为了给一个化合物打分,也许使用单个规则应用程序的最小数量来解决一个单元格乘以每个单元格的分数之和。(此类扣除需要相当多的脑力劳动。)根据您的规则集,计算应用程序的最小数量可能是 CPU 密集型工作。在继续探索该位置之前,应回滚任何完全解决一个或多个单元格的规则应用程序。
- 排除所有扣除中分数高于最低值的所有扣除。(这里的逻辑是玩家不会感知更难的,而是感知到更容易的并接受它;而且,这有望从决策过程中剔除大量计算。)
- 当前位置的最低分数除以“最简单”的扣分数(如果有很多,找到一个更容易)就是该位置的难度。因此,如果规则 A 是最容易适用的规则,得分为 20,并且可以在 4 个单元格中应用,则该位置的得分为 5。
- 随机选择一个“最简单”的扣法作为您的游戏,然后进入下一个游戏位置。我建议只为下一个位置保留完全解决的单元格,不传递其他状态。这当然会浪费 CPU,重复已经完成的计算,但目标是模拟人类游戏。
谜题的整体难度是您通过游戏树的路径中的位置得分的总和。
编辑:替代位置分数:不是使用更难的规则完全排除扣除,而是计算每个规则(或复合应用程序)的总体难度并选择最小值。(这里的逻辑是,如果规则 A 得分为 50,规则 B 得分为 400,并且规则 A 可以在一个单元格中应用,而规则 B 可以在十个单元格中应用,那么位置得分为 40,因为玩家更有可能找出十个更难的游戏之一,而不是一个更容易的游戏。但这需要你计算所有可能性。)
编辑: Briguy37 建议的替代方案:在位置分数中包含所有扣除项。对每个位置进行评分,1 / (1/d1 + 1/d2 + ...)
其中d1
、d2
等是个人扣除项。(这基本上计算了给定个人“扣除阻力”等位置的“任何扣除阻力” d1
。d2
但这需要您计算所有可能性。)
希望这个评分策略会产生一个随着你对难度的主观评估增加而增加的谜题指标。如果没有,那么调整规则的分数(或您从上述选项中选择的启发式方法)可能会实现所需的相关性。一旦你在分数和主观体验之间取得了一致的相关性,你应该能够判断“容易”、“困难”等的数字阈值应该是多少。然后你就完成了!