Python: 如何实现两个整数的交叉?
Python: how to implement crossover of two integers?
我正在试验一种遗传搜索算法,在随机构建初始种群,然后选择最适合的两个条目后,我需要 'mate' 它们(带有一些随机突变)来创建 64
'children'。交叉部分,在这里解释:
似乎很容易理解,但我似乎无法弄清楚如何在 Python 中实现它。如何实现两个整数的交叉?
这是一个名为交叉的函数,它需要两个 parents 和一个交叉点。 parents 应该是相同长度的整数列表。交叉点是基因交换之前的点,如您链接到的文章中所定义。
它returnsparents的两个后代。
def crossover(a, b, crossover_point):
a1 = a[:]
b1 = b[:]
for i in range(crossover_point):
a1[i], b1[i] = b1[i], a1[i]
return [a1, b1]
下面是一些演示其用法的代码。它创建了一个由两个长度为 10 的列表组成的群体,一个只有 0,另一个只有 1。它在第 4 点将它们交叉,并将 children 添加到总体中。
def test_crossover():
a = [0]*10
b = [1]*10
population = [a,b]
population += crossover(a,b,4)
return population
print (test_crossover())
上面的输出是:
[
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
]
def crossover(a, b, index):
return b[:index] + a[index:], a[:index] + b[index:]
应该比 James 的解决方案快很多,因为这个让 Python 完成所有工作!
我正在试验一种遗传搜索算法,在随机构建初始种群,然后选择最适合的两个条目后,我需要 'mate' 它们(带有一些随机突变)来创建 64 'children'。交叉部分,在这里解释:
似乎很容易理解,但我似乎无法弄清楚如何在 Python 中实现它。如何实现两个整数的交叉?
这是一个名为交叉的函数,它需要两个 parents 和一个交叉点。 parents 应该是相同长度的整数列表。交叉点是基因交换之前的点,如您链接到的文章中所定义。 它returnsparents的两个后代。
def crossover(a, b, crossover_point):
a1 = a[:]
b1 = b[:]
for i in range(crossover_point):
a1[i], b1[i] = b1[i], a1[i]
return [a1, b1]
下面是一些演示其用法的代码。它创建了一个由两个长度为 10 的列表组成的群体,一个只有 0,另一个只有 1。它在第 4 点将它们交叉,并将 children 添加到总体中。
def test_crossover():
a = [0]*10
b = [1]*10
population = [a,b]
population += crossover(a,b,4)
return population
print (test_crossover())
上面的输出是:
[
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
]
def crossover(a, b, index):
return b[:index] + a[index:], a[:index] + b[index:]
应该比 James 的解决方案快很多,因为这个让 Python 完成所有工作!