0

嗨,我正在研究遗传算法。我想知道是否有人可以帮助我完成交叉步骤。

例子:

dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]

我想在dad中选择一个随机子集,子集的大小也可以是随机的。例如,[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
4

2 回答 2

0

在 len(dad) 范围内生成两个随机整数(有关用法,请参阅文档)。这些是您的随机子集的限制;称它们为lowerupper

复制爸爸。对于子范围 0:lower 和 upper+1:-1(最后一个元素),按顺序将dad_copy的那个元素替换为mom的可用元素。您可以使用一个简单的计数器来跟踪您在mom中的位置,如果该元素已经在列表中,则前进:

while mom[i] in dad_copy:
    i += 1

这足以让你进入编码阶段吗?


操作码尝试:

很高兴看到你能走到这一步。为此,您不需要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做什么;一个简单的比较没有好处,分配给会破坏你的循环。继续努力;这些是您需要发展的技能。在开始这项作业之前,您似乎跳过了一些练习。

于 2017-04-21T22:30:02.423 回答
-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:]
于 2017-04-22T01:36:35.230 回答