在这个问题中,我试图创建一个新的长度列表 n
从两个长度列表中 n
每个。我随机选择第一个父列表的一个子集(使用开始和结束变量),并将它们添加到新列表中,位置与它们出现在相应列表中的位置相同。然后我用第二个父列表中的元素按照它们出现的顺序填充新列表的其余部分,而不复制从第一个父列表中选择的任何元素。图像解释了这一点。
这是我的python代码:这里的平面是感知器模型的权重。
def breed(plane1, plane2):
num_list = list(range(0, len(plane1)))
random.shuffle(num_list)
n1 = num_list[0]
n2 = num_list[1]
start = min(n1, n2)
end = max(n1, n2)
child = [None] * len(plane1)
for i in range(start, end):
child[i] = plane1[i]
idx = (end) % len(plane2)
for i in range(len(plane2)):
pos = (end + i) % len(plane2)
if plane2[pos] not in child:
child[idx] = plane2[pos]
idx = (idx + 1) % len(plane2)
return child
有人能推荐一种高效简洁的方法吗?
此外,随机范围的结尾不包括在选择中:
one = [1,2,3,4,5,6,7,8,9]
two = [9,8,7,6,5,4,3,2,1]
child = breed(one, two)
print(child)
开始:0结束:7
输出:[1,2,3,4,5,6,7,9,8]
2条答案
按热度按时间gg58donl1#
编辑
原来的答案是超级错误的,经过一段时间的反复,这个工作,假设列表中没有重复的。
幻数
通过生成开始和结束,如果您想设置最小长度,可以调整magic-2和magic+1。我把这里的最小长度设为1。
pxyaymoc2#
这里有一个解决方案。它可能会更好,不使用while循环会更优雅。我不知道它是否涵盖了所有的边缘案件。我已经从随机生成的数字中分离出了逻辑,以便于测试。