Artificial intelligence 遗传算法数独优化变异

Artificial intelligence 遗传算法数独优化变异,artificial-intelligence,genetic-algorithm,Artificial Intelligence,Genetic Algorithm,我正在写一个解决数独难题的遗传算法,希望能得到一些帮助。该算法偶尔会解决一些难题(在同一个难题上,大约10次中的1次,最大迭代次数为1000000次),我试图获得一些关于变异率、重新填充和拼接的信息。任何意见都非常感谢,因为这对我来说是全新的,我觉得我做的事情不是100%正确 快速概述该算法 适应度函数 统计每列、每行和3*3子框中数字1到9的唯一值的数量。子集中的每个唯一值相加并除以9,得到介于0和1之间的浮点值。这些值之和除以27,得到介于0和1之间的总适应度值。1表示已解决的难题 人口规模

我正在写一个解决数独难题的遗传算法,希望能得到一些帮助。该算法偶尔会解决一些难题(在同一个难题上,大约10次中的1次,最大迭代次数为1000000次),我试图获得一些关于变异率、重新填充和拼接的信息。任何意见都非常感谢,因为这对我来说是全新的,我觉得我做的事情不是100%正确

快速概述该算法

适应度函数

统计每列、每行和3*3子框中数字1到9的唯一值的数量。子集中的每个唯一值相加并除以9,得到介于0和1之间的浮点值。这些值之和除以27,得到介于0和1之间的总适应度值。1表示已解决的难题

人口规模: 一百

选择:

轮盘赌法。每个节点都是随机选择的,其中包含更高适应值的节点有更好的选择机会

复制: 两个随机选择的染色体/电路板交换一个随机选择的子集(行、列或3*3子集)。子集(哪一行、列或框)的选择是随机的。由此产生的董事会被引入到人口中

繁殖率:每周期人口的12% 每个迭代有六次复制,每个算法周期产生12条新染色体

突变:在10次迭代后,最高适应度没有改善,突变发生率为2%。 下面列出了三种变异方法,它们具有不同的选择概率权重

1:交换随机选择的数字。该方法选择两个随机数,并在整个电路板中交换它们。在算法增长模式的早期,这种方法似乎对增长的影响最大。25%的选择机会

2:引入随机更改:随机选择两个单元格并更改其值。这种方法似乎有助于防止算法收敛65入选机会

3:计算板中每个值的数量。已求解的电路板包含1到9之间每个数字的9个计数。此方法获取出现次数少于9次的任何数字,并随机将其与出现次数超过9次的数字交换。这似乎对算法有积极的影响,但只是很少使用10选择的机会

我的主要问题是我应该以什么样的速度应用突变方法。似乎当我增加变异时,我有更快的初始结果。然而,当结果接近正确的结果时,我认为更高的变化率正在向人群中引入太多的坏染色体和基因。然而,由于变化率较低,该算法似乎过早收敛


最后一个问题是是否有更好的突变方法

您可以随时间对突变率进行退火,以获得所描述的收敛行为。但我实际上认为修改算法的其他部分可能会获得更大的收益

轮盘赌轮选择通常应用非常高的选择压力。在这一过程的早期,它往往会导致多样性的迅速丧失。二元锦标赛选择通常是一个更好的开始实验的地方。这是一种更为渐进的压力形式,同样重要的是,它能得到更好的控制

有了一个不那么激进的选择机制,你就可以生产出更多的后代,因为你不必担心生产出那么多接近最好的一个或两个个体的复制品。我选择100%,而不是12%的人口生育后代(可能因为交配池中父母的重复而减少)。你不一定要确保每一个父母都参与,只需要产生与你父母数量相同的后代

某种形式的温和精英主义可能会有帮助,这样你就不会失去好父母。如果最好的2-5个个体比最差的2-5个后代好,那么可能会从父母群体中保留最好的2-5个个体

有了精英主义,你可以使用更高的突变率。这三个操作符似乎都很有用。(请注意#3实际上是嵌入到遗传算法中的一种局部搜索形式。从性能上来说,这通常是一个巨大的胜利。事实上,你可以将#3扩展到一个更复杂的方法中,该方法循环,直到它无法找出如何进一步改进为止。)


对于你的三个变异算子,我看不到明显的更好/更差的权重集。我认为,在这一点上,您完全处于实验性参数调整的范围内。另一个想法是向流程中注入一些知识,例如,在流程的早期,您可以在它们之间随机选择。后来,随着算法的收敛,选择你认为更有可能帮助完成“几乎解决”的棋盘的变异算子。

我曾经用遗传算法做过一个相当有能力的数独解算器。这里有关于细节(包括不同的表示和变异)的博客:

我假设存在某些固定值,且不会发生变异?另一种提问方式:这个问题是用来生成数独游戏还是用来解决具有固定约束的特定游戏?它是用来解决游戏的,是的,我保护初始单元格。谢谢你的意见。我非常感谢你的意见。我要花一点时间来尝试这些建议,我会用我的发现来回答。再次感谢是的,当我想弄明白这件事的时候,我看了你的博客。它出现在谷歌“数独遗传算法”的第一页。这是一个很大的帮助,非常感谢!我在这里也写了一篇帖子: