8

所以,我对数独谜题的生成做了相当多的阅读。据我所知,获得所需难度的数独谜题的标准方法是生成一个谜题,然后对其进行评分,然后重复进行,直到获得可接受的评分。这可以通过使用一些更复杂的求解模式(XY-wing、swordfish 等)通过回溯生成来细化,但这并不是我想要做的。

我想要做的,但一直找不到任何真正的资源,是从“难度值”(0-1.0 值,0 是最简单的,1.0 是最难的)生成一个谜题。

例如,我想创建一个难度适中的谜题,因此选择了值 0.675。现在使用该值,我希望能够生成一个中等难度的谜题。

有人知道这样的事情吗?或者也许有类似的方法?

4

4 回答 4

4

添加另一个答案以即时生成所需难度的数独。

这意味着与其他方法不同,该算法只运行一次并返回与所需难度匹配的数独配置(在一个范围内具有高概率或概率=1

生成(和评级)数独难度的各种解决方案都与基于人类的技术和方法有关,这些技术和方法可以很容易地进行评级。

然后一个人(在生成数独配置后)用类人求解器重新求解数独,并根据求解器使用的技术(例如x-wing箭鱼等)分配难度率。

这种方法的问题 (以及我所拥有的用例的要求)

  1. 为了生成具有给定难度的数独,使用以前的方法需要两次求解数独(一次使用基本算法,一次使用类人求解器)。

  2. 一个人必须(预先)生成许多数独游戏,这些数独游戏只有在被类人求解器解决后才能被评为难度。因此,一个人无法即时生成所需的数独。

  3. 类人求解器可能很复杂,并且在大多数情况下(如果不是全部)与 9x9 数独网格紧密耦合。所以不容易推广到其他数独(例如 4x4、16x16、6x6 等)

  4. 类人技术的难度等级是非常主观的。例如为什么x-wing被认为比隐藏单打更难?(个人手动解决了许多困难的已出版数独难题,从未使用过此类技术)

使用了另一种方法,它具有以下好处:

  1. 可以很好地推广到任意数独(9x9、4x4、6x6、16x16 等)
  2. 具有所需难度的数独配置一次生成并即时生成
  3. 难度等级是客观的。

这个怎么运作?

首先,一个简单的事实是,谜题越难,需要解决的时间就越多

但是要解决的时间与线索(给定)的数量和每个空单元格要研究的平均替代方案密切相关。

扩展我之前的回答,有人提到,对于任何数独游戏,线索的最小数量是谜题的客观属性(例如,对于 9x9 网格,拥有有效数独的最小线索数是 17

可以从那里开始计算每个难度级别的最小线索数(线性相关)。

此外,在数独生成过程的每个步骤中,可以确保每个空单元格的平均备选方案(待研究)在给定范围内(作为所需难度的函数)

根据算法是否使用回溯(对于讨论的用例,算法不回溯),可以通过概率=1 或在界限内(分别)以高概率达到所需的难度。

使用该算法生成的数独测试和基于先前方法(类人求解器)的难度评级,显示了期望和估计的难度率之间的相关性,以及对任意数独配置的更大泛化能力。

(已经使用这个在线数独求解器(以及这个)来关联测试数独的难度)

该代码可在 github sudoku.js 上免费获得(连同示例演示应用程序),CrossWord.js 的缩小版本,是同一作者的 JavaScript 专业填字游戏生成器

于 2015-02-24T15:31:44.763 回答
2

数独难度以一种有趣的方式与为给定网格指定唯一解决方案所需的(最小)信息量相关联。

听起来像信息论,是的,它在这里也有应用。

数独谜题应该有一个独特的解决方案。此外,数独谜题具有某些对称性,即按行、按列和按子方格。

这些对称性指定了所需的最小线索数量(以及它们或多或少的位置),以便解决方案是唯一的(即使用数独编译器或回溯搜索之类的算法)。

这将是最困难/最难的数独难题级别(即最少需要的线索数)。然后通过允许比所需的最小数量更多的线索来生成所有其他难度级别,从不太难到容易。

应该注意的是,数独难度级别不是标准的,如上所述,一个人可以根据需要设置多少难度级别。标准是线索的最小数量(和位置)(这是最难的级别,并且与数独对称性相关),然后可以通过允许额外/冗余线索可见来生成任意多的难度级别也是。

于 2014-08-04T01:02:05.513 回答
1

它不像你问的那么优雅,但你可以用缓存来模拟这种行为:

  1. 决定你想要多少个“桶”来拼图。例如,假设您选择 20。因此,您的存储桶将包含不同难度范围的谜题:0-.05、.05-.1、.1-.15、..、.9-.95、.95- 1
  2. 生成一个谜题
  3. 为拼图评分
  4. 放入合适的桶中(或桶满时扔掉)
  5. 重复直到你的桶被“填满”。存储桶的大小及其存储位置将取决于您的应用程序的需求。

然后,当用户请求某个难度拼图时,从他们选择的存储桶中给他们一个缓存的拼图。您可能还想考虑交换数字并改变已知难度的谜题的方向,以生成具有相同难度级别的类似谜题。然后,当您需要用新的谜题重新装满您的水桶时,根据需要重复上述操作。

于 2012-05-23T14:48:45.323 回答
1

好吧,在你知道如何解决它之前,你不可能知道它有多复杂。并且数独求解(因此也包括难度等级)属于NP-C 复杂性类,这意味着(很可能)在逻辑上不可能找到一个(渐近地)比所提出的随机猜测和检查更快的算法。

但是,如果你能找到一个,你已经解决了P 与 NP 的问题,并且应该为菲尔兹奖牌清理一个橱柜...... :)

于 2012-05-23T15:08:58.370 回答