遗传算法pmx代码,(1,2,3,4,5,6,7,8,9)(5,4,6,9,2,1,7,8,3)有mapping过程,每一个代码的意思都写出来
时间: 2024-03-24 14:40:18 浏览: 107
以下是Python实现的PMX遗传算法代码,其中使用了一个映射列表来将父代1中的基因与父代2中的基因进行匹配:
```python
import random
def pmx(parent1, parent2, mapping):
"""PMX Crossover with Mapping"""
# 确定个体长度
size = min(len(parent1), len(parent2))
# 随机生成两个交叉点
a, b = random.sample(range(size), 2)
# 确保a小于b
if a > b:
a, b = b, a
# 从mapping中获取交叉点a到b之间的基因对应关系
segment = mapping[a:b + 1]
# 创建子代个体列表
child = [None] * size
# 将交叉点a到b之间的基因从parent1复制到子代中
for i in range(a, b + 1):
child[i] = parent1[i]
# 将parent2中没有出现在子代中的基因添加到子代中
# 并且保证不能与交叉点a到b之间的基因重复
for i in range(size):
if i < a or i > b:
temp = parent2[i]
# 如果该基因在mapping中有对应关系,则使用映射的基因替换
if temp in segment:
temp = mapping[segment.index(temp) + a]
# 如果该基因已经出现在子代中,则需要使用另一个基因替换
while temp in child[a:b + 1]:
temp = parent2[child.index(temp)]
if temp in segment:
temp = mapping[segment.index(temp) + a]
child[i] = temp
# 返回生成的子代个体
return child
# 创建映射列表
parent1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
parent2 = [5, 4, 6, 9, 2, 1, 7, 8, 3]
mapping = {1: 5, 2: 4, 3: 6, 4: 9, 5: 2, 6: 1, 7: 7, 8: 8, 9: 3}
# 进行交叉操作
child = pmx(parent1, parent2, mapping)
print("Parent 1:", parent1)
print("Parent 2:", parent2)
print("Child:", child)
```
在这个实现中,我们首先创建了两个父代个体parent1和parent2,以及一个将parent1中的基因与parent2中的基因进行匹配的映射列表mapping。在这个例子中,我们可以看到,parent1中的基因1对应于parent2中的基因5,parent1中的基因2对应于parent2中的基因4,以此类推。接下来,我们使用pmx函数将parent1和parent2进行交叉操作,生成一个新的子代个体child。最后,我们打印出parent1、parent2和生成的子代个体child。
阅读全文