应用A * sudoku的启发式功能

时间:2016-03-16 14:02:02

标签: algorithm artificial-intelligence heuristics

我需要一个很好的启发函数来为A星解决数独问题。 数独网格为4X4,根据定义,每个州的合法操作是向下一个空闲单元格插入一个新数字(顺序是从左到右,从上到下)。

例如,这是输入网格:

enter image description here

我们现在应该填充单元格(1,2)。

所有节点都是表示不同状态的不同网格。 分支因子是4,因此我们有4种可能性用于下一个细胞:1,2,3或4,即每个节点4个孩子。

如何在节点上定义启发式函数以在网格上应用A *?

我能想到的只有:

如果插入当前状态网格的新数字是illigal(=在同一行,列或框中出现多次),则h(n)=无穷大。

else, h(n)= [number of empty remain cells].

我认为我的解决方案不正确,因为同一级别中合法的两个节点之间的启发式值没有区别。

2 个答案:

答案 0 :(得分:3)

一个启发式函数是选择具有最大约束数的单元格。

E.g。在您的示例中,您可以选择(2,3) =>因为它只有一种适合的可能性(最大约束数)。在你做了一个"下注" (放置一个数字),你可以继续使用相同的策略=>地点S[2,3] = 2 =>选择S[2,2]等等。

根据约束,我的意思是,考虑到数独规则中的约束,每个单元格有多少个选项。

  

h [cell] = 1 /(每盒#选项+每行#options + #options per   列)

这是一个非常简单的策略(一个预见选项),但更复杂的策略是将此策略组合成更高阶的逻辑=>基本上是:

  

h2 [cell] = h [cell-left] + h [cell-right] + ...;

答案 1 :(得分:0)

正如一条评论所指出的,A *不适合像Sudoku这样的游戏,因为考虑到Sudoku规则,你只有一个可能的解决方案。 A *(带有打开列表)允许在给定可接受启发式的情况下找到最佳解决方案,该启发式告知目标状态的估计成本和小于或等于实际成本。采取非法行动毫无意义。在给定状态的情况下,可以通过定义适当的动作来丢弃它们。

唯一能够使用A *对Sudoku有意义的搜索公式是嵌入查找解决方案的成本,因此启发式将代表搜索的估计成本。在这种情况下,细胞填充物质的顺序。

但是,通常,其他一些搜索技术用于数独,例如深度优先搜索。这个想法是通过适当地修剪搜索图并明智地选择要处理的下一个单元来提高搜索效率。另一种答案给出了选择下一个单元格的一种可能方法。

但是,对于如何选择下一个要处理的下一个单元格的额外约束,您的问题似乎并非如此。 如果你必须坚持A *,你定义的启发式是正确的,因为它是可以接受的。如您所见,启发式值对于所有节点都是相同的。这将导致基本上广泛的第一次搜索,并且效率非常低。

有关知情搜索和启发式方法的更多信息,请参阅Russell和Norvig撰写的Artificial Intelligence: a modern approach第3章。