蟒蛇 - 获取一个子列表而不改变位置

蟒蛇 - 获取一个子列表而不改变位置

问题描述:

嗨,我正在研究遗传算法。我想知道是否有人可以帮助我与 交叉步骤。蟒蛇 - 获取一个子列表而不改变位置

例子:

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 
+1

我理解正确吗?尽管您已经逐步列出了算法,但您无法编写*单行代码*来解决任务?查找**随机**包生成pseduo随机数;那可以让你开始一步。 – Prune

+0

不要问*我们*看起来如何:问Python。这个程序做什么? (提示:您遗漏了我的一个建议,检查下限和上限的值,因此它尚未完全正常工作。) – Prune

+0

此外,我们不太可能通过单字母变量名称来读取和检查代码。 – Prune

生成范围LEN(爸爸)(见documentation的使用)两个随机整数。这些是你的随机子集的限制;称他们为较低较高

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

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

那是不足以使你移动到编码阶段?


OP CODE尝试:

我们很高兴地看到你走这么远。你不需要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的分配会破坏你的循环。 继续工作;这些都是你需要发展的技能。看起来你可能在开始这项任务之前跳过了一些练习。

+0

非常感谢你 – user02

+0

我想我可以用爸爸切片爸爸[下:上],但我不知道如何保持自己的位置 – user02

+0

不要打扰;该分片连接太简单了。复制**爸爸**,然后只更改该范围以外的元素。该副本将它们自然地放在正确的地方。 – Prune

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:] 
+1

请编辑您的答案以包含一些解释。仅有代码的答案对未来SO读者的教育很少。您的回答是在低质量的审核队列中。 – mickmackusa