【改进篇】Python实现VRP常见求解算法——量子粒子群算法(QDPSO)

该文介绍了使用Python实现经典量子粒子群优化算法(QDPSO)解决车辆路径规划问题(CVRP)的方法。通过对Split函数的改进,优化了代码结构,并展示了算法在不同参数下的性能对比,包括收敛曲线和车辆路径。此外,还提供了部分关键代码,如数据结构定义、距离矩阵计算和位置更新等。
摘要由CSDN通过智能技术生成

基于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. 完整代码

如有错误,欢迎交流。

私信,有偿

参考

  1. A simple and effective evolutionary algorithm for the vehicle routing problem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better.C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值