python - 收敛到相同种群的遗传算法的交叉
问题描述
我正在为 OneMax 算法做一个项目,但我遇到了交叉问题。
在整个迭代过程中,我采用了人员的最高“部门”并遍历他们。
对于偶数,我分配了 5 个奇数人,他们将与之交叉(即 0、4、8、12 和 16 都匹配 1、2、3、5、7 和 9,然后是 2、6、10、14、18都与 11、13、15、17、19 匹配)。这是为了确保没有重复。
然后我选择一个随机交叉点并拆分列表,然后将列表拆分并作为父 A 和 B 的 2 个拆分列表返回,然后可用于生成子 A 和 B。
我的问题是,经过几次迭代,总体收敛到完全相同的位串。
任何帮助将不胜感激!
代码:
分频器
def crossover(top20):
end = len(top20) - 1
newPop = []
# Person A crosses over with a list of 5 people
for i in range(0, end, 2):
crossPoint = (random.randint(1, len(range(stringLen - 2))))
crossPoint2 = stringLen - crossPoint
if i % 4 == 0:
peopleB = [1, 3, 5, 7, 9]
else:
peopleB = [11, 13, 15, 17, 19]
personA = pop[top20[i]]
for j in range(len(peopleB)):
personB = pop[top20[peopleB[j]]]
sizes = [crossPoint, crossPoint2]
parA1, parA2 = splitList(sizes, personA)
parB1, parB2 = splitList(sizes, personB)
childA = list(chain(parA1, parB2))
childB = list(chain(parB1, parA2))
newPop.append(childA)
newPop.append(childB)
return newPop
拆分列表
def splitList(sizes, ls):
par1 = []
par2 = []
for s in range(stringLen):
if s < sizes[0]:
par1.append(ls[s])
else:
par2.append(ls[s])
return par1, par2
这是文件要点的链接
编辑:另一件事是它总是停在一个数字上,例如数百。就像它会在 16.00 的平均值处停止,而选择的顶部的总和正好是 8000
解决方案
这是我用 3 种方法解决 OneMax 问题的最终产品,一种是常规的最大问题(即尝试得到所有 1),2 是进化到目标字符串,3 是欺骗性景观。它可以在这个要点中找到
推荐阅读
- java - 在 Java 流中,将逗号分隔的字符串列表转换为列表,但如果存在,则删除每个字符串前面的子字符串
- c - 指针操作:为什么这条抽象线不起作用?
- node.js - 我什么时候应该构建一个仅在内部使用的全栈项目。(没有网络连接)
- jquery - JQUERY/AJAX 将数据附加到特定行的末尾而不是表的底部
- swift - 使用按钮在不同选项卡上的视图控制器之间切换(self.tabBarController?.selectedIndex = 1 不起作用)
- python - 如何将while循环变成函数
- numpy - numpy - Z[[1, 2],[1]] 与 Z[(1,2),(1)] 完全一样吗?
- c# - 从字符串中获取最后一组数字的正则表达式
- node.js - 如何在 .httaccess 上使用端口 127.0.0.1:8000 运行 127.0.0.1?
- r - 通过R中的两个值使用增量数据获取数据框