添加另一个答案以即时生成所需难度的数独。
这意味着与其他方法不同,该算法只运行一次并返回与所需难度匹配的数独配置(在一个范围内具有高概率或概率=1)
生成(和评级)数独难度的各种解决方案都与基于人类的技术和方法有关,这些技术和方法可以很容易地进行评级。
然后一个人(在生成数独配置后)用类人求解器重新求解数独,并根据求解器使用的技术(例如对、x-wing、箭鱼等)分配难度率。
这种方法的问题
(以及我所拥有的用例的要求)
为了生成具有给定难度的数独,使用以前的方法需要两次求解数独(一次使用基本算法,一次使用类人求解器)。
一个人必须(预先)生成许多数独游戏,这些数独游戏只有在被类人求解器解决后才能被评为难度。因此,一个人无法即时生成所需的数独。
类人求解器可能很复杂,并且在大多数情况下(如果不是全部)与 9x9 数独网格紧密耦合。所以不容易推广到其他数独(例如 4x4、16x16、6x6 等)
类人技术的难度等级是非常主观的。例如为什么x-wing被认为比隐藏单打更难?(个人手动解决了许多困难的已出版数独难题,从未使用过此类技术)
使用了另一种方法,它具有以下好处:
- 可以很好地推广到任意数独(9x9、4x4、6x6、16x16 等)
- 具有所需难度的数独配置一次生成并即时生成
- 难度等级是客观的。
这个怎么运作?
首先,一个简单的事实是,谜题越难,需要解决的时间就越多。
但是要解决的时间与线索(给定)的数量和每个空单元格要研究的平均替代方案密切相关。
扩展我之前的回答,有人提到,对于任何数独游戏,线索的最小数量是谜题的客观属性(例如,对于 9x9 网格,拥有有效数独的最小线索数是 17)
可以从那里开始计算每个难度级别的最小线索数(线性相关)。
此外,在数独生成过程的每个步骤中,可以确保每个空单元格的平均备选方案(待研究)在给定范围内(作为所需难度的函数)
根据算法是否使用回溯(对于讨论的用例,算法不回溯),可以通过概率=1 或在界限内(分别)以高概率达到所需的难度。
使用该算法生成的数独测试和基于先前方法(类人求解器)的难度评级,显示了期望和估计的难度率之间的相关性,以及对任意数独配置的更大泛化能力。
(已经使用这个在线数独求解器(以及这个)来关联测试数独的难度)
该代码可在 github sudoku.js 上免费获得(连同示例演示应用程序),CrossWord.js 的缩小版本,是同一作者的 JavaScript 专业填字游戏生成器