Algorithm 关于跳舞链接/算法X的问题

Algorithm 关于跳舞链接/算法X的问题,algorithm,sudoku,Algorithm,Sudoku,我正在开发一个数独应用程序,其中一个需要的是解决数独问题的方法。我对一些回溯算法做了很多研究,包括制作我自己的版本,但后来遇到了舞蹈链接和算法X。我看过它的一些实现,它看起来很酷,但有一些问题-我还不能完全理解它(我没有太多的编码经验,所以我还没有掌握完全理解它的核心以及它是如何工作的所需的全部知识,尽管我将其作为一个方便的参考) 据我所知,你有一个数独,然后你把它转换成一个1和0的数组-最终目标是找到一个完全是1的行组合-这意味着我们找到了一个有效的解决方案(耶!) 现在,我有点理解了在普通数

我正在开发一个数独应用程序,其中一个需要的是解决数独问题的方法。我对一些回溯算法做了很多研究,包括制作我自己的版本,但后来遇到了舞蹈链接和算法X。我看过它的一些实现,它看起来很酷,但有一些问题-我还不能完全理解它(我没有太多的编码经验,所以我还没有掌握完全理解它的核心以及它是如何工作的所需的全部知识,尽管我将其作为一个方便的参考)

据我所知,你有一个数独,然后你把它转换成一个1和0的数组-最终目标是找到一个完全是1的行组合-这意味着我们找到了一个有效的解决方案(耶!)

现在,我有点理解了在普通数独游戏中是如何工作的——例如,如果我们把一个5放在左上角的单元格中,它会删除该行和该列上的所有其他选项,反过来也会删除该正方形中的所有选项。但我不太明白的是,如果我在做一个数独变体,它会如何工作?例如,o一种流行的变体是X数独,在正常规则的基础上,每个主对角线上都必须有一次1到9的数字。我可以假设数独上有额外的2行/列,也需要从1到9填充,这样做,还是不这样做


现在,一个棘手的问题是:另一个变体是反骑士数独。基本上,在正常规则的基础上,你不能有一个相同的数字,一个棋手的移动距离(2向外,1向一边).由于这在行和其他方面变得有点不稳定,这些是否可以作为额外的约束添加到算法中,以按照这些思路求解数独?

X-Sudoku可以完全按照您描述的方式求解

反骑士数独更为棘手,因为反骑士约束无法直接融入到精确的覆盖框架中。算法X有一个扩展,用于处理打包约束(最多一个,而不是一个)当选择一个不满意的约束时,有效地将它们视为满意的。然后,对于由一个数字和两个方块组成的每三个方块,骑士的跳跃间隔为一个,你有一个填充约束,其中最多一个方块被该数字填充


如果实现算法X看起来太困难,您可以寻找SAT解算器库来代替。

X-Sudoku可以完全按照您描述的方式解决

反骑士数独更为棘手,因为反骑士约束无法直接融入到精确的覆盖框架中。算法X有一个扩展,用于处理打包约束(最多一个,而不是一个)当选择一个不满意的约束时,有效地将它们视为满意的。然后,对于由一个数字和两个方块组成的每三个方块,骑士的跳跃间隔为一个,你有一个填充约束,其中最多一个方块被该数字填充


如果实现算法X看起来太难了,你可以找一个SAT解算器库来代替。

这对X数独来说已经足够公平了-我只需要想一想如何实现它!至于反骑士数独,你知道我在哪里可以找到它吗?我没有看到任何关于添加打包约束的内容。我知道我还可以在任何类型的约束上使用它吗?不过对于算法X,我设法找到了一个我能够实现的JavaScript版本-我不一定100%完全理解它以添加额外的约束,但我必须给它一个机会来解决它。@Opaquer Exact cover适用于0-1变量和constr像x111+x112+…+x119=1这样的属性(如果xijk是表示平方(i,j)有值k的0-1变量,则此约束表示此平方正好有一个值;列约束可能是x175+x275+…+x975=1,表示列7最多有一个5)。打包约束类似于x175+x255≤ 1(平方(1,7)不是5或平方(2,5)不是5;我们对每个可能的冲突都有一个约束)。您可以通过引入松弛变量来编写打包约束:x175+x255+s=1。@opaquery问题是算法X处理的效率不高。最好改为修改实现,以便在查找未满足的约束时选择一个相等约束。好的,这就是推送lim这是我对精确覆盖问题和算法X的知识,但到目前为止,我认为这是有意义的。当你提到松弛变量s时,如果平方1、7或2、5都不是5,那么将5放入其中将是一个有效的选项(即s=1)?至于修改实现,我会这样做,而不是只看哪些行/列需要覆盖,我会让它检查更多的方块,然后检查通常的行/列/方块约束等?抱歉,如果这看起来像是一件基本的事情,那么需要考虑很多:P@Opaquer是的,这就是slack变量的工作原理。你不知道想要选择约束作为分支,因为它倾向于(总是?)使搜索树更大。在约束上使用标志而不是松弛变量的优化使事情变得更整洁。这对于X-Sudoku来说已经足够公平了-我只需要想一想怎么做!至于反骑士数独,你知道我在哪里可以找到一些关于它的信息吗?我没有看到任何关于添加打包约束的内容。我知道拿它来说,我还可以在任何类型的约束上使用它?不过对于算法X,我设法找到了一个我能够实现的JavaScript版本-我不一定100%完全理解它,足以添加额外的约束,但我必须给它一个机会来弄清楚。@Opaquer Exact cover适用于0-1变量和cons像x11这样的火车