等级数独难度级别

时间:2011-05-25 16:14:33

标签: javascript algorithm sudoku

我正在构建一个用Javascript编写的数独游戏 一切正常,每次都可以通过一个解决方案完全生成电路板。

我唯一的问题是,这就是让我无法将项目发布到公众的原因 是我不知道如何评估我的板的难度级别。我一直在寻找, 发布在论坛等等。我不想自己编写算法,这不是重点 项目,左侧​​和旁边,它们对我来说太复杂了,因为我不是数学家。

我唯一接近的是this website that does grading via JS
但问题是,代码是以一种糟糕的无证,非常特别的方式编写的,因此无法借用...

我会说到这一点 -
任何人都可以请我指出一个提供数独评级/评级源代码的地方吗?

由于

更新22.6.11:
这是我的Sudoku game,我已经实施了自己的评分系统,它依赖于 关于基本的人类逻辑解决技巧,请查看。

6 个答案:

答案 0 :(得分:5)

我自己已经考虑过这个问题,我能做的最好的事情就是通过实际解决和分析游戏树来决定解决难题的难度。

最初: 使用“人类规则”实现求解器,而不是人类玩家不太可能使用的算法。 (这本身就是一个有趣的问题。)根据人类使用的难度,对求解器中的每个逻辑规则进行评分。使用数百或更大的值,这样您就可以自由地相对于彼此调整分数。

解决难题。在每个位置:

  • 枚举所有可在当前游戏位置逻辑推断的新单元格。
  • 每个演绎的分数(完全解决一个单元格)是足以进行演绎的最简单规则的分数。
  • 编辑:如果必须同时应用多个规则,或多次执行一个规则,以进行单个扣减,请将其作为单个“复合”规则应用程序进行跟踪。要对化合物进行评分,可以使用最小数量的单个规则应用程序来解决单元格乘以每个单元格得分的总和。 (这种扣除需要更多的心理努力。)根据您的规则集,计算最小数量的应用程序可能是CPU密集型工作。任何完全解决一个或多个单元格的规则应用程序都应该在继续探索该位置之前回滚。
  • 排除所有扣除额高于最低扣除额的所有扣除额。 (这里的逻辑是,玩家不会感觉到更难的人,感觉更容易并且接受了它;而且,这有望在决策过程中修剪大量的计算。)
  • 当前位置的最低分数除以“最简单”扣除的数量(如果存在多个,更容易找到一个)是该位置的难度。因此,如果规则A是最简单的适用规则,得分为20,并且可以应用于4个单元格,则该位置得分为5.
  • 随机选择一个“最简单”的扣除作为你的游戏并前进到下一个游戏位置。我建议只为下一个位置保留完全解决的细胞,不通过任何其他状态。这当然浪费了CPU,重复已经完成的计算,但目标是模拟人类游戏。

拼图的整体难度是游戏树路径中各个位置得分的总和。

编辑:替代位置得分:不是使用更难的规则完全排除扣除,而是计算每个规则(或复合应用程序)的总体难度并选择最小值。 (这里的逻辑是,如果规则A得分为50,规则B得分为400,规则A可以应用于一个单元格,但规则B可以应用于十,则位置得分为40,因为玩家更有可能发现十个较难的游戏中的一个比一个更容易的游戏。但这需要你计算所有可能性。)

编辑:Briguy37建议的替代方案:包括位置分数中的所有扣除。将每个排名评为1 / (1/d1 + 1/d2 + ...),其中d1d2等是个人扣除额。 (这基本上是在给予个人“扣除抵抗”d1d2等的位置上计算“抵制任何扣除”等等。但这需要你计算所有可能性。)

希望这种评分策略能够为谜题制定一个指标,随着您对难度的主观评估的增加而增加。如果没有,那么调整规则的分数(或从上述选项中选择启发式)可以实现所需的相关性。一旦你在得分和主观经验之间取得了一致的相关性,你就应该能够判断“简单”,“难”等数字阈值应该是多少。然后你就完成了!

答案 1 :(得分:4)

Donald Knuth研究了这个问题,想出了Dancing Links algorithm来解决数独,然后对它们的难度进行评分。

谷歌周围,有几个Dancing Links引擎的实现。

答案 2 :(得分:2)

我有一个简单的求解器,只能在行,列和方块中查找唯一的可能性。当它解决了通过这种方法可解决的几个单元格时,它然后选择剩余的候选者尝试它并查看简单解算器是否导致解决方案或单元格没有可能性。在第一种情况下解决了谜题,在第二种情况下,一种可能性已被证明是不可行的并因此被消除。在第三种情况下,既没有最终解决方案也没有不可行性,没有 可以达到扣除。

循环通过此程序的主要结果是消除可能性,直到采摘 正确的单元格条目会导致解决方案。到目前为止,这个程序已经解决了最困难的问题 谜题没有失败。它解决了多种解决方案的难题。如果 试验候选人随机挑选,它将产生所有可能的解决方案。

然后我根据必须的非法候选人数量产生难题 在简单解算器找到解决方案之前被淘汰。

我知道这就像猜测,但如果简单的逻辑可以消除一个可能的候选人,那么一个 更接近最终解决方案。

麦克

答案 3 :(得分:1)

也许你可以对拼图的一般“约束”进行评分?考虑一个新的谜题(只有提示)可能有一定数量的单元格,可以简单地通过消除它不能包含的值来确定。我们可以说这些细胞被“约束”到比典型细胞更少数量的可能值,并且存在的高度受限的细胞可以在没有猜测的情况下在拼图上进行更多的进展。 (这里我们认为“猜测”的要求是难以解决的问题。)

然而,在某些时候,玩家必须开始猜测,而且,细胞的约束性很重要,因为对于给定的细胞,要选择的值越少,就越容易找到正确的值(并增加约束力)其他细胞)。

当然,我实际上并不玩Sudoku(我只是喜欢为它编写游戏和求解器),所以我不知道这是否是一个有效的指标,只是大声思考=)

答案 4 :(得分:1)

我过去做过这个。

关键是你必须从人类逻辑的角度来确定使用哪些规则。您提供的示例详细介绍了许多不同的人类逻辑模式作为右侧列表。

您实际上需要使用这些规则而不是计算机规则来解决难题(使用简单的模式替换可以在几毫秒内解决它)。每次更换电路板时,您都可以从“最简单”的模式(例如,单元格或行中的单个打开的框)重新开始,然后向下移动直到您找到下一个要使用的逻辑“规则”。

在对sodoku进行评分时,会为每种方法分配一些点值,您可以为需要填写的每个字段添加该值。虽然“单个空单元格”可能会得到0,但“XY链”可能会得到100.您可以将所需的所有方法(和频率)制成表格,然后最终加权。有很多地方列出了这些权重的预期值,但它们都是相当经验的。你正试图模拟人类的逻辑,所以你可以随意提出自己的权重或增强系统(如果你真的使用XY链,那么这个难题可能比需要更高级的东西更容易机制)。

你也可能会发现即使你有一个独特的sodoku,它也无法通过人类逻辑来解决。

并且还要注意,这比以标准的图案化方式解决它更加耗费CPU。几年前,当我编写我的代码时,它需要多次(我完全忘记,但可能甚至多达15秒)来解决我创建的一些生成的谜题。

答案 5 :(得分:0)

假设难度与用户解决难题所需的时间成正比,这里是人工智能解决方案,随着时间的推移接近理想算法的结果。

  1. 随机生成固定数量的起始拼图布局,例如100。
  2. 最初,提供一个随机难度部分,让用户可以从可用的布局中播放随机拼图。
  3. 为每个用户保留平均随机解决方案时间。我可能会为此制作一个前十名/前十名的排行榜,以产生对随机拼图的兴趣。
  4. 保持每个拼图解决方案的平均解决时间乘数(如果用户通常在5分钟内解决拼图并在20分钟内解决,则应该计入拼图平均解算时间乘数4)
  5. 一旦玩了足够多次拼图以获得拼图的基础难度,比如5次,将该拼图添加到您的额定拼图列表中,并将另一个随机生成的拼图添加到您可用的拼图布局中。
    注意:您应该在随机谜题列表中保留第一个谜题,以便您可以获得更好更好的统计数据。
  6. 一旦你有足够的基础谜题,比如50,允许用户访问你的应用程序的“额定难度”部分。每个谜题的难度将是该谜题的平均时间乘数 注意:当用户选择玩具有额定难度的谜题时,这不应影响平均随机解时间或平均解时间乘数,除非您想要计算加权平均值(否则如果用户播放很多难题,他们的平均时间和时间乘数会有所偏差。)
  7. 使用上述方法,解决方案的评级从0(已经解决/没有时间解决)到1(用户可能会在平均时间内解决这个难题)到2(用户可能需要两倍的时间来解决这个难题比平均时间到无穷大(用户将永远寻找解决这个难题的方法)。