基于python语言,实现经典量子粒子群算法(QDPSO)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数
往期优质资源
-
CVRP系列
-
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
MDVRP系列
-
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
VRPTW系列
-
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
HVRP系列
-
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
MDHFVRPTW系列
-
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
1. 适用场景
- 求解CVRP
- 车辆类型单一
- 车辆容量不小于需求节点最大需求
- 单一车辆基地
2. 改进效果对比
这里做了简单的参数敏感性分析,量子粒子群算法的参数较少,只有一个 创新参数 alpha,参数调整范围为:[0.1,0.95],步长为0.05其他参数:最大迭代次数为300,车辆容量为80。
2.1 实验结果汇总
3. 求解结果
(1)收敛曲线
(2)车辆路径
(3)输出文件
4. 部分代码
(1)数据结构
# 数据结构:解
class Sol():
def __init__(self):
self.node_no_seq=None # 解的编码
self.obj=None # 目标函数
self.route_list=None # 解的解码
self.route_distance = None # 车辆路径的长度集合
# 数据结构:网络节点
class Node():
def __init__(self):
self.id=0 # 节点id
self.x_coord=0 # 节点平面横坐标
self.y_coord=0 # 节点平面纵坐标
self.demand=0 # 节点需求
class Model():
def __init__(self):
self.best_sol=None # 全局最优解
self.node_id_list=[] # 需求节点集合
self.sol_list=[] # 解的集合
self.demand_dict={} #需求节点映射id集合
self.distance_matrix = {}
self.depot=None # 车场节点
self.number_of_demands=0 # 需求节点数量
self.vehicle_cap=0 # 车辆最大容量
self.Cr=0.5 # 差分交叉概率
self.F=0.5 # 差分变异概率
self.popsize=0
(2)距离矩阵
# 计算距离矩阵
def calDistanceMatrix(model):
for i in model.node_id_list:
for j in model.node_id_list:
d=math.sqrt((model.demand_dict[i].x_coord-model.demand_dict[j].x_coord)**2+
(model.demand_dict[i].y_coord-model.demand_dict[j].y_coord)**2)
model.distance_matrix[i,j]=d
dist = math.sqrt((model.demand_dict[i].x_coord - model.depot.x_coord) ** 2
+ (model.demand_dict[i].y_coord - model.depot.y_coord) ** 2)
model.distance_matrix[i, model.depot.id] = dist
model.distance_matrix[model.depot.id, i] = dist
(3)路径提取
def extractRoutes(node_no_seq,P,depot_id):
route_list = []
j = len(node_no_seq)
while True:
i = P[node_no_seq[j-1]]
route = [depot_id]
route.extend(node_no_seq[k] for k in range(i+1, j))
route.append(depot_id)
route_list.append(route)
j = i+1
if i == -1:
break
return route_list
(4)位置更新
# 更新位置
def updatePosition(model):
alpha=model.alpha
pg=model.pg
mg=model.mg
#更新历史平均最优位置
mg_=[0]*model.number_of_demands
for id, sol in enumerate(model.sol_list):
x=sol.node_no_seq
pl = model.pl[id].node_no_seq
pi=[]
for k in range(model.number_of_demands):
phi = random.random()
pi.append(phi*pl[k]+(1-phi)*pg[k])
if random.random()<=0.5:
X=[min(int(pi[k]+alpha*abs(mg[k]-x[k])*math.log(1/random.random())),model.number_of_demands-1)
for k in range(model.number_of_demands)]
else:
X=[min(int(pi[k]-alpha*abs(mg[k]-x[k])*math.log(1/random.random())),model.number_of_demands-1)
for k in range(model.number_of_demands)]
#调整可行性
X= adjustRoutes(X, model)
X_obj, X_route_list,X_route_distance = calObj(X,model)
if X_obj < model.pl[id].obj:
model.pl[id].node_no_seq = copy.deepcopy(X)
model.pl[id].obj = X_obj
model.pl[id].route_list = X_route_list
model.pl[id].route_distance = X_route_distance
if X_obj < model.best_sol.obj:
model.best_sol.obj = copy.deepcopy(X_obj)
model.best_sol.node_no_seq = copy.deepcopy(X)
model.best_sol.route_list = copy.deepcopy(X_route_list)
model.best_sol.route_distance = copy.deepcopy(X_route_distance)
model.pg = copy.deepcopy(X)
mg_ = [mg_[k] + model.pl[id].node_no_seq[k] / model.popsize for k in range(model.number_of_demands)]
model.sol_list[id].node_no_seq = copy.deepcopy(X)
model.sol_list[id].obj = copy.deepcopy(X_obj)
model.sol_list[id].route_list = copy.deepcopy(X_route_list)
model.sol_list[id].route_distance = copy.deepcopy(X_route_distance)
model.mg=copy.deepcopy(mg_)
5. 完整代码
如有错误,欢迎交流。
私信,有偿
参考
- A simple and effective evolutionary algorithm for the vehicle routing problem