我正在尝试使用 numpy 对遗传算法群体进行交叉。我已经使用父 1 和父 2 对人口进行了切片。
population = np.random.randint(2, size=(4,8))
p1 = population[::2]
p2 = population[1::2]
但我无法找出任何 lambda 或 numpy 命令来对父母进行多点交叉。这个概念是ith row of p1
用.随机交换一些位ith row of p2
。
我正在尝试使用 numpy 对遗传算法群体进行交叉。我已经使用父 1 和父 2 对人口进行了切片。
population = np.random.randint(2, size=(4,8))
p1 = population[::2]
p2 = population[1::2]
但我无法找出任何 lambda 或 numpy 命令来对父母进行多点交叉。这个概念是ith row of p1
用.随机交换一些位ith row of p2
。
我想你想从 p1 和 p2 中随机选择一个单元格。
为了更容易理解,我将 p1 更改为 10 到 15,将 p2 更改为 20 到 25。p1 和 p2 在这些范围内随机生成。
p1
Out[66]:
array([[15, 15, 13, 14, 12, 13, 12, 12],
[14, 11, 11, 10, 12, 12, 10, 12],
[12, 11, 14, 15, 14, 10, 13, 10],
[11, 12, 10, 13, 14, 13, 12, 13]])
In [67]: p2
Out[67]:
array([[23, 25, 24, 21, 24, 20, 24, 25],
[21, 21, 20, 20, 25, 22, 24, 22],
[24, 22, 25, 20, 21, 22, 21, 22],
[22, 20, 21, 22, 25, 23, 22, 21]])
In [68]: sieve=np.random.randint(2, size=(4,8))
In [69]: sieve
Out[69]:
array([[0, 1, 0, 1, 1, 0, 1, 0],
[1, 1, 1, 0, 0, 1, 1, 1],
[0, 1, 1, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 1, 1]])
In [70]: not_sieve=sieve^1 # Complement of sieve
In [71]: pn = p1*sieve + p2*not_sieve
In [72]: pn
Out[72]:
array([[23, 15, 24, 14, 12, 20, 12, 25],
[14, 11, 11, 20, 25, 12, 10, 12],
[24, 11, 14, 20, 21, 10, 13, 22],
[22, 20, 21, 13, 14, 13, 12, 13]])
十几岁的数字在筛子为 1 时来自 p1 二十多岁的数字在筛子为 0 时来自 p2
这可能会变得更有效率,但这是您期望的输出吗?