Genetic algorithm 用遗传算法求解数独

Genetic algorithm 用遗传算法求解数独,genetic-algorithm,sudoku,Genetic Algorithm,Sudoku,我承担了使用遗传算法创建数独解算器的任务 初始化:将给定值存储在每个染色体中,然后随机生成值,使每一行都是值1到9的有效排列 适合度:由每行、每列和方格中的“不合适”值的数量加在一起确定 适应功能:典型轮盘赌选择 选择:随机,但使用轮盘赌进行加权 交叉:从两个父对象中随机选择不同的行,这将创建一个子对象。(我还实现了一个交叉,一次从两个家长那里随机选择3行,以保持良好的迷你电网)。以下是两个示例子项,每个交叉方法一个: Parent 1 row 1 Parent 2 row 2 Parent 1

我承担了使用遗传算法创建数独解算器的任务

初始化:将给定值存储在每个染色体中,然后随机生成值,使每一行都是值1到9的有效排列

适合度:由每行、每列和方格中的“不合适”值的数量加在一起确定

适应功能:典型轮盘赌选择

选择:随机,但使用轮盘赌进行加权

交叉:从两个父对象中随机选择不同的行,这将创建一个子对象。(我还实现了一个交叉,一次从两个家长那里随机选择3行,以保持良好的迷你电网)。以下是两个示例子项,每个交叉方法一个:

Parent 1 row 1
Parent 2 row 2
Parent 1 row 3
Parent 2 row 4
Parent 1 row 5
Parent 2 row 6
Parent 2 row 7
Parent 1 row 8
Parent 1 row 9

Parent 1 row 1
Parent 1 row 2
Parent 1 row 3
Parent 2 row 4
Parent 2 row 5
Parent 2 row 6
Parent 1 row 7
Parent 1 row 8
Parent 1 row 9
变异:起初我只是在两个随机位置交换值,但这实际上使算法变得更糟糕,因为它在行中引入了重复,而这些重复是有效的置换。因此,我改变了变异(当变异的几率在25%-50%范围内时表现最好)来随机选择一行,然后随机化该行的顺序(将给定的值保留在正确的位置)

我还尝试了一种变异,它选择了一个随机行,然后在行中选择了两个随机(非给定)位置并交换它们,但这也使性能变得更差。(与两个随机位置的交换不同,我不明白为什么这种变异会使性能变得如此糟糕,但将整行随机化的变异会使性能更好)

我的算法还没有解决任何难题。它通常会接近(仅在6到10个冲突的范围内),但它永远无法找到解决方案(可能是找到局部极小值并陷入困境)

为了改进算法,我添加了用完全随机化的电路板替换大部分人口(表现最差的染色体)的功能,但这似乎效果甚微

我的方法有哪些弱点?如何提高性能


似乎数独可以通过变异而获得更好的性能,而不是交叉。

我所知道的以编程方式解决soduko问题的最佳策略是使用a

我用GA解决了一些数独难题,使用这种方法:

数独游戏有许多虚假的局部极小值,因此保持种群多样性非常重要。不要过于贪婪地趋同。这是许多难题的关键。收敛速度非常慢

我不喜欢轮盘赌。这是一个收敛太快,太依赖于适应度函数的玩具。例如,您可以使用锦标赛选择


我同意交叉是很难应用的。你可以把它看作是一种大的变异,这恰好是一种交叉。

为什么要用遗传算法来实现这一点?遗传算法通常用于NP完全问题,而解决数独要容易得多(事实上,编写数独算法也很容易)。我相信索多科问题的解决者是NP完全问题,但我们可以解决小的索多科难题。阿琼是对的。这更像是一个运用遗传算法解决各种问题的练习。@ajon:同意,从技术上讲是这样的。在一个非常小的空间里,考虑到只有一个解的数独很少有超过一小撮不能在更短时间内分离的排列。当然,如果你处理的数独游戏有不止一种解决方案,情况就不同了,但人类也不应该能够解决这些问题。@Ryan:这是有道理的,我想我最近的思维方式有点实际了。我确实看到你的算法有问题,但我还没有找到解决方法。如果到那时这件事还没有解决,我明天再看一看。