引言
在物流配送、快递运输等场景中,如何规划最优行车路线是一个经典的组合优化问题。本文将介绍如何使用Python实现遗传算法(Genetic Algorithm)来解决这一优化问题。
算法原理
遗传算法模拟生物进化过程,通过以下步骤实现优化:
- 种群初始化:生成随机路线集合
- 适应度评估:计算每条路线的总距离
- 选择操作:保留优秀个体
- 交叉变异:产生新路线
- 迭代进化:重复2-4步直至收敛
Python实现
1. 问题建模
import random
import numpy as np
class RouteOptimizer:
def __init__(self, coordinates, pop_size=100, elite_size=20, mutation_rate=0.01):
self.coords = coordinates # 地点坐标列表
self.pop_size = pop_size # 种群规模
self.elite_size = elite_size # 精英保留数量
self.mutation_rate = mutation_rate # 变异概率
2. 核心算法实现
# ... 初始化代码 ...
def create_route(self):
"""生成随机路线"""
route = random.sample(range(len(self.coords)), len(self.coords))
return route
def route_distance(self, route):
"""计算路线总距离"""
total = 0
for i in range(len(route)):
a, b = self.coords[route[i]], self.coords[route[(i+1)%len(route)]]
total += np.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)
return total
def rank_routes(self, population):
"""路线排序"""
fitness = [(1/self.route_distance(route), route) for route in population]
return sorted(fitness, reverse=True)
def crossover(self, parent1, parent2):
"""顺序交叉(OX)"""
geneA = random.randint(0, len(parent1))
geneB = random.randint(0, len(parent1))
start, end = min(geneA, geneB), max(geneA, geneB)
child = [None]*len(parent1)
child[start:end] = parent1[start:end]
pointer = 0
for gene in parent2:
if gene not in child:
while child[pointer] is not None:
pointer += 1
child[pointer] = gene
return child
def mutate(self, route):
"""交换变异"""
if random.random() < self.mutation_rate:
i, j = random.sample(range(len(route)), 2)
route[i], route[j] = route[j], route[i]
return route
3. 进化流程控制
def next_generation(self):
"""生成下一代种群"""
ranked = self.rank_routes(self.population)
elites = [x[1] for x in ranked[:self.elite_size]]
# 生成新种群
children = []
while len(children) < self.pop_size - self.elite_size:
parent1, parent2 = random.choices(ranked, k=2)
child = self.crossover(parent1[1], parent2[1])
child = self.mutate(child)
children.append(child)
return elites + children
可视化效果
通过迭代优化,算法会逐步收敛到更优解:
迭代次数 | 最优距离
-----------------
0 | 583.2 km
50 | 412.5 km
100 | 378.6 km
200 | 352.1 km
优化方向建议
- 引入精英保留策略保持优秀个体
- 尝试不同的交叉方式(如PMX、CX)
- 加入局部搜索优化
- 使用自适应变异率
- 并行化计算加速进化过程
结语
遗传算法为路径优化问题提供了有效的解决方案。本文实现展示了算法核心流程,读者可以通过调整参数和优化策略进一步提升算法性能。
本文通过Python代码演示了遗传算法在路径优化中的典型应用。遗传算法的优势在于其全局搜索能力,特别适合解决复杂的组合优化问题。