我正在编写一种遗传算法,在将交叉应用于一对父母时,在避免循环方面遇到了一些问题。到目前为止,我已经接近了,但在最后一步我需要一些帮助。
总体是一个2d数组,每个个体都是一个一维数组:
pop = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])要获得父母对,我使用下面的内容,因此父母是一个3d数组,即一对父母的数组:
inds = np.arange(pop.shape[0]).reshape((2,2))
parents = np.take(pop, inds, axis=0)
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]现在我要执行交叉操作,它有签名。
crossover: [parent1, parent2] -> [child1, child2]当子节点也是一个一维数组时,每次交叉都会产生两个子数组。
所以给定的人口
[p1
p2
p3
p4]我想回去
[crossover(p1,p2)[0]
crossover(p1,p2)[1]
crossover(p3,p4)[0]
crossover(p3,p4)[1]]或者,因为它可以简单地被压平
[crossover(p1,p2)
crossover(p3,p4)]我尝试过使用np.apply_along_axis,但我认为不可能将它应用于一对父母,一次只使用一个家长(通过使用axis=-1)。
有人能给我建议一下这样做的唯一方法吗?
附加信息--这是我目前正在做的事情,并列出了一个列表:
children = [
crossover(pop[2 * i], pop[2 * i + 1])
for i in range(pop.shape[0] // 2)
]发布于 2020-10-25 20:21:57
好的,我设法让它开始工作,即使它意味着稍微改变我的交叉函数。通过重新构造pop数组,您可以连接连续的行。
pop = np.array([[0,1,5,6,7,2,3,4],[0,7,2,6,1,5,4,3],[2,5,1,7,0,3,4,6],[7,6,5,1,2,0,4,3]])
pop_resh = pop.reshape((pop.shape[0]//2, -1))
[[0 1 5 6 7 2 3 4]
[0 7 2 6 1 5 4 3]
[2 5 1 7 0 3 4 6]
[7 6 5 1 2 0 4 3]]
[[0 1 5 6 7 2 3 4 0 7 2 6 1 5 4 3]
[2 5 1 7 0 3 4 6 7 6 5 1 2 0 4 3]]现在可以在每一对合并的行上使用apply_along_axis,然后对其进行整形以回到起始形状。
children = np.apply_along_axis(py_crossover, 1, pop_resh).reshape(pop.shape)
[[0 7 6 1 5 2 3 4]
[0 1 6 7 2 5 4 3]
[6 5 1 7 0 2 4 3]
[7 6 5 1 2 0 3 4]]我不确定我是要使用这个,还是坚持使用列表中的comp,但是这个解决方案至少可以帮助到其他人。
https://stackoverflow.com/questions/64527705
复制相似问题