您好我正在研究遗传算法。我想知道是否有人可以帮助我 交叉步骤。
示例:
dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]
我想在爸爸中选择一个随机子集,子集的大小也可以是随机的。例如,[1,2,3]或[3,4,5]或[2,3,4]或[1,2]或[4,5]或[1,2,3,4]但它们必须在爸爸的原始顺序。
所以例如,随机子集是[2,3,4,5]
然后我希望我的后代是[,2,3,4,5 ,,]。然后我想用妈妈的名单填补空位。我想迭代妈妈的名单。首先考虑2,2已经在列表中,所以我跳过2.然后考虑3,3也已经在列表后代,所以我跳过3.然后6,6不在后代列表所以我将添加6第一个可用的地方。所以后代现在是[6,2,3,4,5 ,,]。最终,offspring
应为[6,2,3,4,5,1,7]
任何帮助都将非常感谢!
我认为我需要帮助的最困难的部分是如何实现这一步[,2,3,4,5,,]
通过妈妈的名单迭代可能对我有用。
更新代码
dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]
upper=random.randint(0,len(dad)-1)
lower=random.randint(0,len(dad)-1)
slice=dad[lower:upper]
child=copy.deepcopy(dad)
j =0
for i in child:
if i not in slice:
child[j] = 0
j+=1
n=len(child)
h=0
k=0
while k <= len(child)-1:
if child[k] == 0:
if mom[h] not in slice:
child[k]=mom[h]
h+=1
k+=1
else:
h+=1
else:
k+=1
答案 0 :(得分:0)
在len(dad)范围内生成两个随机整数(有关用法,请参阅documentation)。这些是随机子集的限制;称他们为低级和高级。
制作爸爸的副本。对于子范围0:lower和upper + 1:-1(最后一个元素),按顺序将 dad_copy 的元素替换为 mom 的可用元素。您可以使用一个简单的计数器来跟踪您在妈妈中的位置,如果该元素已经在列表中,则前进:
while mom[i] in dad_copy:
i += 1
这足以让你进入编码阶段吗?
OP CODE ATTEMPT:
很高兴看到你走得这么远。您不需要 deepcopy ,只需要一个普通的全切片副本(请参阅我对该行的更改)。
import random
dad = [1,2,3,4,5,6,7]
mom = [2,3,6,1,7,5,4]
upper = random.randint(0,len(dad)-1)
lower = random.randint(0,len(dad)-1)
# Note: if lower > upper, you have to switch them.
# If they're equal, you need to change one.
slice = dad[lower:upper]
child = dad[:] # Easier way to get a shallow copy
for i in child:
if i not in slice:
i == 0
我担心你在这里失去了焦点。您需要单步执行外所有位置的下限:上限。另外,我不知道你想用 i == 0 做什么。一个简单的比较并不好,而 i 的任务会破坏你的循环。 继续努力;这些是你需要发展的技能。看起来你可能在开始这项任务之前跳过了一些练习。
答案 1 :(得分:-1)
dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]
upper=random.randint(0,len(dad)-1)
lower=random.randint(0,len(dad)-1)
slice=dad[lower:upper]
#Find elements from mom only
from_mom = [e for e in mom if e not in slice]
#Append elements from mom to the start and end of the child list.
child = from_mom[0:lower]+slice+from_mom[lower:]