python-获取子列表而不更改位置

时间:2017-04-21 22:09:27

标签: python algorithm genetic

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

示例:

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

2 个答案:

答案 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:]