蟒蛇 - 获取一个子列表而不改变位置
嗨,我正在研究遗传算法。我想知道是否有人可以帮助我与 交叉步骤。蟒蛇 - 获取一个子列表而不改变位置
例子:
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
生成范围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的分配会破坏你的循环。 继续工作;这些都是你需要发展的技能。看起来你可能在开始这项任务之前跳过了一些练习。
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:]
请编辑您的答案以包含一些解释。仅有代码的答案对未来SO读者的教育很少。您的回答是在低质量的审核队列中。 – mickmackusa
我理解正确吗?尽管您已经逐步列出了算法,但您无法编写*单行代码*来解决任务?查找**随机**包生成pseduo随机数;那可以让你开始一步。 – Prune
不要问*我们*看起来如何:问Python。这个程序做什么? (提示:您遗漏了我的一个建议,检查下限和上限的值,因此它尚未完全正常工作。) – Prune
此外,我们不太可能通过单字母变量名称来读取和检查代码。 – Prune