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

【VRP问题】基于遗传结合粒子群求解VRPTW问题 一、粒子群算法简介 粒子群算法是在1995年由Eberhart博士和Kennedy博士一起提出的,它源于对鸟群捕食行为的研究。它的基本核心是利用群体中的个体对信息的共享从而使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的最优解。设想这么一个场景:一群鸟进行觅食,而远处有一片玉米地,所有的鸟都不知道玉米地到底在哪里,但是它们知道自己当前的位置距离玉米地有多远。那么找到玉米地的最佳策略,也是最简单有效的策略就是搜寻目前距离玉米地最近的鸟群的周围区域。 在PSO中,每个优化问题的.. 阅读详情

基于python语言,实现经典粒子群算法(DPSO)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数

往期优质资源

CVRP系列
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
MDVRP系列
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
VRPTW系列
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
HVRP系列
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法
MDHFVRPTW系列
遗传算法
蚁群算法
禁忌搜索算法
模拟退火算法
自适应大邻域算法
粒子群算法
量子粒子群算法
差分进化算法

1. 适用场景

  • 求解CVRP
  • 车辆类型单一
  • 车辆容量不小于需求节点最大需求
  • 单一车辆基地

2. 改进效果对比

这里做了简单的参数敏感性分析,比较不同参数组合下两个版本code的最优值与求解时间的差异。具体为:1)设定权重w为0.7,0.8,0.9 ;2)设定学习因子c1为[0.5,4]步长为0.5等不同值,c2为[0.5,4]步长为0.5;其他参数:最大迭代次数为300,车辆容量为80。

2.1 实验结果汇总

改进后的split算子是基于图论的,相对比较耗时,但有一定提升效果。
在这里插入图片描述

2.2 目标函数对比

w=0.7
在这里插入图片描述
w=0.8
在这里插入图片描述
w=0.9
在这里插入图片描述

2.3 求解时间对比

w=0.7

在这里插入图片描述

w=0.8

在这里插入图片描述

w=0.9

在这里插入图片描述

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):
    w=model.w
    c1=model.c1
    c2=model.c2
    pg = model.pg
    for id,sol in enumerate(model.sol_list):
        x=sol.node_no_seq
        v=model.v[id]
        pl=model.pl[id].node_no_seq
        r1=random.random()
        r2=random.random()
        new_v=[]
        for i in range(model.number_of_demands):
            v_=w*v[i]+c1*r1*(pl[i]-x[i])+c2*r2*(pg[i]-x[i])
            if v_>0:
                new_v.append(min(v_,model.Vmax))
            else:
                new_v.append(max(v_,-model.Vmax))
        new_x=[min(int(x[i]+new_v[i]),model.number_of_demands-1) for i in range(model.number_of_demands) ]
        new_x=adjustRoutes(new_x,model)
        model.v[id]=new_v

        new_x_obj,new_x_route_list,new_x_route_distance=calObj(new_x,model)
        if new_x_obj<model.pl[id].obj:
            model.pl[id].node_no_seq=copy.deepcopy(new_x)
            model.pl[id].obj=new_x_obj
            model.pl[id].route_list=new_x_route_list
            model.pl[id].route_distance = new_x_route_distance
        if new_x_obj<model.best_sol.obj:
            model.best_sol.obj=copy.deepcopy(new_x_obj)
            model.best_sol.node_no_seq=copy.deepcopy(new_x)
            model.best_sol.route_list=copy.deepcopy(new_x_route_list)
            model.best_sol.route_distance = copy.deepcopy(new_x_route_distance)
            model.pg=copy.deepcopy(new_x)
        model.sol_list[id].node_no_seq = copy.deepcopy(new_x)
        model.sol_list[id].obj = copy.deepcopy(new_x_obj)
        model.sol_list[id].route_list = copy.deepcopy(new_x_route_list)
        model.sol_list[id].routes_distance = copy.deepcopy(new_x_route_distance)

5. 完整代码

如有错误,欢迎交流。

私信,有偿

参考

  1. A simple and effective evolutionary algorithm for the vehicle routing problem
基于离散粒子群算法求解车辆路径问题(DPSO_CVRP)实战项目 车辆路径问题(Vehicle Routing Problem, VRP)旨在为一组配送车辆设计最优行驶路线,使其从配送中心出发,服务所有客户后返回起点,且满足各类操作约束。其核心目标是最小化总行驶成本,通常表现为距离或时间的最小化。其中 $c_{ij}$ 表示节点 $i$ 到 $j$ 的距离,$x_{ij}$ 为二元决策变量,表示是否经过边 $(i,j)$。self.position = np.array(position) # 当前解(客户排列) 阅读详情

相关推荐

DPSO算法与基本PSO的MATLAB实现指南及源码

本文还有配套的精品资源,点击获取 简介:离散粒子群优化算法(DPSO)是面向离散空间的全局优化方法,适用于如组合优化、调度等离散问题。DPSO算法通过模拟群体行为,在离散搜索空间中寻找最优解。MATLAB源码实现DPSO算法的关键步骤包括初始化、更新规则、适应度函数评估、更新最佳位置、迭代循环,以及输出最终的最优解。本课程设计项目旨在帮助学生和研究者深入理解DPSO算法,并...

weixin_42300144的博客 1208

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言,采用经典离散粒子群算法(DPSO)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。

Better.C的博客 1330

离散粒子群优化算法在覆盖阵列生成中的应用与C++实现详解

PSO是一种启发式的优化算法,受到鸟群觅食行为的启示。每个粒子表示在解空间中的一个点,通过迭代,粒子更新它们的速度和位置,寻找问题的最优解。与此不同,DPSO是为离散解空间设计的。例如,生成覆盖阵列的问题就是一个离散问题,其中的解由一系列的0和1表示。为了表示每个粒子,我们首先定义一个Particlepublic:// 粒子的当前位置// 粒子的最佳位置// 粒子的速度// 粒子的适应度值这个类中,position和velocity都是向量,代表粒子在解空间中的各个维度的值。

qq_38334677的博客 403

离散粒子群(DPSO)——任务分类

一、题目要求 在[0,100]*[0,100]的二维平面上有10个物体需要搬运,共有4个机器人。 现在需要将10个物体分配给4个机器人,使得机器人移动的总距离最小,如何分配? 每个机器人最多搬运3个物体。 10个物体和4个机器人的初始位置。 global task_position; task_position = [[75.7740 ,82.3458]; [74.3132,69.4829]; [39.2227,31.7099];

龙晨天的博客 6880

【路径规划-VRP问题】基于粒子群算法求解VRP问题附matlab代码 上传.zip

1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士等教研学习使用 5.博客介绍:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可si信

深入解析Lora模块的工作原理与应用场景

本文深入解析了Lora模块的工作原理与应用场景。Lora模块作为物联网领域的核心无线通信组件,凭借其独特的扩频调制与半双工通信技术,实现了远距离、低功耗的数据传输。文章详细拆解了其技术内核,包括空中唤醒等低功耗奥秘,并提供了地址、信道、空中速率等关键参数的实战配置指南。最后,探讨了Lora模块在智能家居、智慧农业、城市监测等广域物联网场景中的具体应用,为开发者提供了从理论到实践的完整参考。

weixin_29174385的博客 333

Python实现VRP常见求解算法——离散粒子群(DPSO)

基于python语言,实现经典粒子群算法(DPSO)对车辆路径规划问题(CVRP)进行求解。

Better.C的博客 6227

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 563

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——离散粒子群算法(DPSO)

基于python语言,采用经典离散粒子群算法(DPSO)对 需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1474

大样本EEG公共数据集汇总

描述: OpenNeuro平台包含多个认知障碍相关的EEG数据集,例如针对轻度认知障碍(MCI)或阿尔茨海默病(AD)的研究。描述: 天普大学医院EEG语料库包含大量临床EEG记录,可通过元数据筛选出与认知障碍相关的片段(如诊断标签包含dementia或MCI)。描述: ADNI主要提供多模态神经影像数据(MRI/PET),但部分合作研究整合了EEG数据。样本量: 部分数据集包含100+被试(例如结合MRI与EEG的多模态数据)。样本量:30,000+ EEG记录(持续更新,全球最大临床EEG数据库)。

谁人打的太极拳的博客 1764

【Scrapy】Scrapy教程4——命令行工具

Scrapy支持使用模块设置自己的项目命令。如何实现可参考的实践方法。然后在项目的settings文件中配置来添加自定义命令。以上就是对Scrapy命令行工具的说明,有不明确的地方,可参考官方文档欢迎大家在各大平台关注我,我会不定期发布技术相关文章和各种小工具,并且欢迎共同技术探讨!

jayhgq的博客 1251

Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)

基于python语言,实现经典离散量子行为粒子群算法(DQPSO)对车辆路径规划问题(CVRP)进行求解。

Better.C的博客 1975

开源浏览器插件开发实战:从零搭建多平台内容分发工具

浏览器扩展(Browser Extension)是运行在浏览器上层、通过标准Web技术增强浏览器能力的轻量级程序,其核心价值在于对页面内容的读取、操作与跨应用信息流转。在内容创作与分发场景中,创作者频繁需要在公众号、知乎、优快云、头条等平台间搬运同一篇文章,而传统SaaS分发工具往往受限于免费额度、授权托管和平台适配滞后等问题。基于Manifest V3规范,开发者可以构建一款100%开源、永久免费的浏览器插件,利用content script完成从源文章页提取标题、正文与图片,通过消息通信机制将结构化数

weixin_29882269的博客 296

【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】

粒子群算法求解带时间窗的车辆路径规划问题 完整代码,直接运行,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2840

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5092

节省人力成本40%!仓储物流AI机器人调度系统实战案例(含路径规划算法与系统架构图)

首先,我们需要定义一个Node类self.x = x # 节点x坐标self.y = y # 节点y坐标self.g = g # 从起点到当前节点的实际成本(g值)self.h = h # 从当前节点到终点的启发式成本(h值)self.f = g + h # 总成本(f值)self.parent = None # 父节点(用于回溯路径)self.task_id = task_id # 任务IDself.priority = priority # 任务优先级(1=最高,5=最低)

小程序开发 950

Python之粒子群算法(含代码实例)

Python粒子群算法(含代码实例)

m0_60307882的博客 3万+

SerDes学习笔记:DFE均衡架构示例(USB3.1、PCIe3.0\4.0)

本文探讨了DFE均衡器架构在不同数据接口中的应用特性。研究表明,抽头数量随数据速率提升而增加,1-16抽头架构较为常见。通过PCIeGen3/4实例分析,对比了单抽头、双抽头和15抽头DFE的性能差异,证明多抽头结构能通过精细调节有效提升噪声容限和降低误码率。文章详细阐述了DFE工作原理,包括其通过反馈信号对输入信号的补偿机制,以及不同抽头对消除码间干扰的作用。实验采用8Gbps速率(125ps/UI)进行波形仿真,直观展示了均衡处理前后的信号变化,为理解信道均衡技术提供了重要参考。

一只豌豆象的博客 519

基于离散粒子群算法(DPSO)求解路径规划 附Matlab代码

路径规划作为人工智能和机器人技术领域的核心问题之一,其目标是在给定环境下找到一条从起点到终点的最优或近似最优路径,同时避开障碍物和满足特定约束条件。传统的路径规划算法,例如 Dijkstra 算法、A* 算法及其变体,在静态、低维环境中表现良好,但在高维、动态或复杂环境中,往往面临计算复杂度高、易陷入局部最优等问题。近年来,智能优化算法凭借其全局搜索能力和适应性,在路径规划领域得到了广泛应用。

qq_59747472的博客 1574

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【PSO】离散粒子群算法(DPSO)和离散二进制粒子群算法(BPSO )

1. 什么是离散粒子群算法? 普通粒子群算法(Particle Swarm Optimization Algorithm,PSO)的粒子初始位置、更新速度都是连续函数,与之对应,位置和速度更新均为离散值的算法是离散PSO算法(Discrete Particle Swarm Optimization Algorithm,DPSO); 一般就是在跟新粒子位置后,对粒子进行离散点处理; 比如:你

小白兔的窝 5万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

基于PSO粒子群优化算法的VRTPW路径规划问题matlab仿真

VRPTW是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小等目的。鸟群在整个搜寻过程中,通过相互传递各自的信息,让其他鸟知道自己当前的位置,通过这样的协作来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终整个鸟群都能聚集在食物源的周围,即找到了最优解。所有的粒子都有一个被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离。

FPGA/MATLAB学习教程/源码/项目合作开发 1372

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MATLAB粒子群算法求解带充电站(桩)的电动车辆路径规划EVRP问题代码实例

MATLAB粒子群算法求解带充电站(桩)的电动车辆路径规划EVRP问题代码实例 问题实例描述: 现有一个配送中心需要向20个客户点进行送货。每个客户点有不同货物需求量和卸货服务时间。配送中心和客户点的位置和相关信息如下表所示(0表示配送中心,1~20表示客户点): 表1 配送中心和客户点的位置和相关服务信息 编号 x坐标 y坐标 所需货物量(kg) 服务时间(分钟) 0 50 50 na...

waterstar2010的博客 4696

多配送中心VRP建模与求解—基于粒子群算法

本文为多配送中心、单车型、车辆封闭、非满载、需求不可拆分的VRP场景建立数学模型,并设计粒子群算法进行求解。

_2312 1万+

【TWVRP】基于matlab遗传和粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 1037期】

遗传和粒子群算法求解带时间窗的车辆路径规划问题 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 3209

【进阶一】Python实现MDCVRP常见求解算法——离散粒子群(DPSO)

基于python语言,实现离散粒子群算法(DPSO)对多车场车辆路径规划问题(MDCVRP)进行求解。

Better.C的博客 2066
上一篇: 【改进篇】Python实现VRP常见求解算法——差分进化算法(DE)
下一篇: 【改进篇】Python实现VRP常见求解算法——量子粒子群算法(QDPSO)
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Better.C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值