【改进篇】Python实现VRP常见求解算法——自适应大邻域算法(ALNS)

用Python手把手实现ALNS算法:从零搭建一个车辆路径规划(VRP)求解器 本文详细介绍了如何使用Python从零实现自适应大邻域搜索(ALNS)算法来构建车辆路径规划(VRP)求解器。通过完整的代码示例,讲解了ALNS的核心组件包括破坏-修复算子、自适应权重机制和模拟退火策略,并提供了性能优化技巧和实际应用建议,帮助开发者掌握这一强大的元启发式算法。 阅读详情
AI摘要

文章介绍了使用Python实现自适应大邻域搜索算法(ALNS)解决车辆路径规划问题(CVRP)的优化代码,特别是改进了Split函数。通过对不同参数组合的实验,展示了改进后的算法在目标函数和求解时间上的对比。尽管改进后的算法在时间消耗上有所增加,但能提供更优的解。此外,文章提供了部分关键代码,包括数据结构、距离矩阵计算、路径提取等,并分享了收敛曲线和车辆路径的可视化结果。

基于python语言,实现经典自适应大邻域算法(ALNS)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数

往期优质资源

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

1. 适用场景

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

2. 改进效果对比

这里做了简单的参数敏感性分析,比较不同参数组合下两个版本code的最优值与求解时间的差异。具体为:1)设定权重衰减系数为0.1,0.3,0.5 三个不同等级;2)设定退火速率为0.7,0.75,0.8,0.85,0.9,0.95等不同值;3)设定权重更新步长为2,4,6,8,10等不同值,其他参数固定不变:最大迭代次数为10,车辆容量为80。

2.1 实验结果汇总

改进后的split算子是基于图论的,相对比较耗时,再加上ALNS的贪婪算子需要进行多次计算,因此改进后的算法在时间上的增加额外明显。
在这里插入图片描述

2.2 目标函数对比

rho = 0.1:

在这里插入图片描述

rho = 0.3:

在这里插入图片描述

rho = 0.5:

在这里插入图片描述

2.3 求解时间对比

rho = 0.1:

在这里插入图片描述

rho = 0.3:

在这里插入图片描述

rho = 0.5:

在这里插入图片描述

3. 求解结果

(1)收敛曲线

在这里插入图片描述

(2)车辆路径

在这里插入图片描述

(3)输出文件

在这里插入图片描述

4. 部分代码

(1)数据结构

# 数据结构:解
class Sol():
    def __init__(self):
        self.node_no_seq=None # 解的编码
        self.obj=None # 目标函数
        self.action_id=None # 算子id
        self.route_list=None # 解的解码
        self.route_distance = None  # 车辆路径的长度集合
# 数据结构:网络节点
class Demand():
    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.demand_dict = {}  # 需求节点集合
        self.demand_id_list = []
        self.sol_list = []  # 解的集合
        self.depot = None # 车场节点
        self.number_of_nodes = 0 # 需求节点数量
        self.vehicle_cap = 80 # 车辆最大容量
        self.distance_matrix = {}
        self.popsize = 100 # 种群规模
        self.alpha = 2 # 信息启发式因子
        self.beta = 3 # 期望启发式因子
        self.Q = 100 # 信息素总量
        self.rho = 0.5 # 信息素挥发因子
        self.tau = {} # 弧信息素集合
        self.vehicle_cap=0  # 车辆最大容量

(2)距离矩阵

def calDistanceMatrix(model):
    for i in range(len(model.demand_id_list)):
        f_n = model.demand_id_list[i]
        for j in range(i + 1, len(model.demand_id_list)):
            t_n = model.demand_id_list[j]
            dist = math.sqrt((model.demand_dict[f_n].x_coord - model.demand_dict[t_n].x_coord) ** 2
                             + (model.demand_dict[f_n].y_coord - model.demand_dict[t_n].y_coord) ** 2)
            model.distance_matrix[f_n, t_n] = dist
            model.distance_matrix[t_n, f_n] = dist
            model.tau[f_n, t_n] = 100
            model.tau[t_n, f_n] = 100

        dist = math.sqrt((model.demand_dict[f_n].x_coord - model.depot.x_coord) ** 2
                         + (model.demand_dict[f_n].y_coord - model.depot.y_coord) ** 2)
        model.distance_matrix[f_n, model.depot.id] = dist
        model.distance_matrix[model.depot.id, f_n] = dist

(3)路径提取

def extractRoutes(node_no_seq,P,depot_id):
    route_list = []
    route = []
    p = P[node_no_seq[0]]
    for node_seq in node_no_seq:
        if P[node_seq] == p:
            route.append(node_seq)
        else:
            route.insert(0,depot_id)
            route.append(depot_id)
            route_list.append(route)
            route = [node_seq]
            p = P[node_seq]
    return route_list

(4)破坏算子

# 随机破坏
def createRandomDestory(model):
    d=random.uniform(model.rand_d_min,model.rand_d_max)
    return random.sample(model.node_id_list,int(d*(len(model.node_id_list)-1)))
# 最坏值破坏
def createWorseDestory(model,sol):
    deta_f=[]
    for node_no in sol.node_no_seq:
        node_no_seq_=copy.deepcopy(sol.node_no_seq)
        node_no_seq_.remove(node_no)
        obj,_,_=calObj(node_no_seq_,model)
        deta_f.append(sol.obj-obj)
    sorted_id = sorted(range(len(deta_f)), key=lambda k: deta_f[k], reverse=True)
    d=random.randint(model.worst_d_min,model.worst_d_max)
    return [sol.node_no_seq[i] for i in sorted_id[:d]]

(5)收敛曲线

# 绘制目标函数收敛曲线
def plotObj(obj_list):
    plt.rcParams['font.sans-serif'] = ['SimHei']  #show chinese
    plt.rcParams['axes.unicode_minus'] = False  # Show minus sign
    plt.plot(np.arange(1,len(obj_list)+1),obj_list)
    plt.xlabel('Iterations')
    plt.ylabel('Obj Value')
    plt.grid()
    plt.xlim(1,len(obj_list)+1)
    plt.show()

(6)车辆路径

# 绘制优化车辆路径
def plotRoutes(model):
    for route in model.best_sol.route_list:
        x_coord=[]
        y_coord=[]
        for node_no in route:
            x_coord.append(model.demand_dict[node_no].x_coord)
            y_coord.append(model.demand_dict[node_no].y_coord)
        plt.plot(x_coord,y_coord,marker='s',color='b',linewidth=0.5)
    plt.show()

(7)输出结果

# 输出结果
def outPut(model):
    work=xlsxwriter.Workbook('result.xlsx')
    worksheet=work.add_worksheet()
    worksheet.write(0, 0, 'id')
    worksheet.write(0, 1, 'route')
    worksheet.write(0, 2, 'distance')
    worksheet.write(0, 3, 'total_distance')
    worksheet.write(1,3,model.best_sol.obj)
    for id,route in enumerate(model.best_sol.route_list):
        r=[str(i)for i in route]
        worksheet.write(id + 1, 0, f'v{str(id + 1)}')
        worksheet.write(id + 1, 1, '-'.join(r))
        worksheet.write(id + 1, 2, model.best_sol.route_distance[id])
    work.close()

5. 完整代码

如有错误,欢迎交流。

私信,有偿

参考

  1. A simple and effective evolutionary algorithm for the vehicle routing problem
Python实现VRP高效求解算法——自适应大邻域搜索(ALNS)的算子调优与性能分析 本文详细介绍了Python实现的自适应大邻域搜索算法(ALNS)在车辆路径问题(VRP)中的应用与优化。通过破坏算子和修复算子的动态组合,ALNS算法能够高效求解复杂物流配送问题。文章还提供了关键参数调优指南、性能优化技巧以及典型问题的解决方案,帮助开发者提升算法求解效率。 阅读详情

相关推荐

用Python手把手实现ALNS算法:从零搭建一个车辆路径规划求解器(附完整代码)

本文详细介绍了如何使用Python从零实现自适应大邻域搜索(ALNS)算法来解决车辆路径规划问题。通过破坏/修复算子设计、权重更新机制和模拟退火接受准则的整合,构建了一个完整的ALNS求解器框架,并提供了可扩展的模块化代码实现。文章还包含实际应用示例和性能优化建议,帮助读者掌握这一高效的元启发式算法。

weixin_30689307的博客 448

Python实现VRP常见求解算法——自适应大邻域搜索算法(ALNS)

基于python语言,实现经典自适应大邻域搜索算法(ALNS)对车辆路径规划问题(CVRP)进行求解。

Better.C的博客 1万+

用Python搞定物流配送难题:手把手教你用ALNS算法求解带时间窗的VRP(附完整代码)

本文详细介绍了如何使用Python中的自适应大邻域搜索算法(ALNS)解决带时间窗的车辆路径问题(VRPTW)。通过破坏-修复双算子机制,ALNS能高效处理物流配送中的时间窗约束、车辆载重限制等复杂条件。文章包含完整代码实现、数据预处理方法、核心算法设计及电商配送案例解析,帮助开发者快速掌握这一物流优化利器。

weixin_28737603的博客 416

量子退火Python实战(1):车辆路径问题(VRP : Vehicle Routing Problem)

建模车辆路径问题(VRP:Vehicle Routing Problem)的QUBO矩阵,并提供Python实现代码。

gangshen1993的博客 1万+

【运筹优化】自适应大邻域搜索(ALNS)算法实战:从原理到代码实现与性能调优

本文深入解析自适应大邻域搜索(ALNS)算法,从核心原理到代码实现与性能调优。ALNS作为元启发式算法,通过智能化的破坏-重建策略解决组合优化问题,特别适用于车辆路径规划(VRP)等场景。文章详细介绍了破坏算子、修复算子的设计技巧,以及自适应权重更新机制,并提供了Python实现框架和实战案例,帮助开发者掌握这一高效运筹优化工具。

weixin_31364787的博客 272

告别调参玄学:用Python手把手实现ALNS的自适应算子权重调整

本文详细介绍了如何用Python实现自适应大规模邻域搜索算法(ALNS)的自适应算子权重调整机制。通过动态权重调整、得分系统和轮盘赌选择等核心组件,ALNS算法能够在车辆路径规划、生产调度等组合优化问题中实现智能优化。文章提供了完整的代码实现和调优经验,帮助开发者告别调参玄学,提升算法性能。

weixin_30751947的博客 385

着实不错的自适应大邻域搜索算法ALNS

着实不错的自适应大邻域搜索算法ALNS

taozibaby的博客 3589

别再死磕代码了!用Python手把手教你实现ALNS算法(附VRP问题实战代码)

本文详细介绍了如何使用Python实现自适应大规模邻域搜索算法(ALNS)来解决车辆路径问题(VRP)。通过破坏-修复循环机制和动态调整策略,ALNS能高效处理复杂组合优化问题。文章包含完整的Python代码实现,从算法架构、VRP建模到算子设计和自适应机制,并提供了可视化分析和性能优化技巧,帮助开发者快速掌握这一强大优化工具。

weixin_30555515的博客 392

ALNS-自适应大邻域搜索算法

是由Ropke与Pisinger在2006年提出的一种启发式方法,其在邻域搜索的基础上增加了对算子的作用效果的衡量,使算法能够自动选择好的算子对解进行破坏与修复,得到一个成本(cost)最低的一个解。由于算法的自动反馈更新权重机制,根据算子的历史表现与使用次数选择下一次迭代使用的算子,通过算子间的相互竞争来生成当前解的邻域结构,而在这种结构中有很大概率能够找到更好的解,同时可以尽可能地避免出现局部最优解的情况。

Lukkkka77的博客 4349

告别暴力穷举!用Python实现ALNS算法,5分钟搞定TSP旅行商问题(附完整代码)

本文详细介绍了如何使用Python实现自适应大邻域搜索(ALNS)算法,快速解决旅行商问题(TSP)。通过破坏-修复迭代循环和动态权重调整机制,ALNS在5分钟内即可求解中等规模TSP问题,显著优于传统暴力穷举法。文章包含完整代码实现、性能优化技巧及可视化示例,为运筹优化领域提供实用解决方案。

weixin_32642109的博客 377

ALNS-VRPPD(Python)自适应大邻域搜索解决取送货的VRP问题(Python)

1、完整代码,可直接运行 (如有疑问可私信) 2、擅长领域:路径规划、机器学习、数据爬虫、数据分析处理等 3、该资源有较为详尽的注解,非常方便大家阅读与理解。 ALNS_VRPPD(Python) 自适应大邻域搜索解决取送货的VRP问题(Python)

【进阶六】Python实现SDVRPTW常见求解算法——自适应大邻域算法(ALNS)

基于python语言,采用经典自适应大邻域算法(ALNS)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。

Better.C的博客 1718

ALNS.zip_ALNS_ALNS算法_matlab_traini4m_vrp

解决vrp问题的ALNS的matlab算法

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——自适应大邻域算法(ALNS)

基于python语言,采用经典自适应大邻域算法(ALNS)对 需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1475

VRP问题研究(附代码)_Solomon标准数据_VRP问题_vrp_车辆路径问题_测试数据_源码

车辆路径问题研究,可供研究人员下载和研究

SIwave仿真手册——电源完整性仿真之PDN阻抗的提取(四)

(想不到我这个弱鸡的博主有一天也有被催更的时候,看到后台被催的消息,我慌了,赶紧写一篇把。) 文章目录3.1 PDN阻抗的提取3.1.1手动完成PDN阻抗的提取1、创建pin group2、创建端口3、数据文件的清理和检查(参考1.3.4&1.3.5)4、添加电容模型(参考2.2.1)(==这一步很重要==)5、开始仿真6、查看仿真结果3.1.2利用向导工具完成PDN阻抗的提取1、点击图标![在这里插入图片描述](https://img-blog.csdnimg.cn/36d974339ea5449

luohuo9844的博客 1万+

5.Python实现VRP常见求解算法——自适应大邻域搜索算法(ALNS)

参考笔记 https://github.com/PariseC/Algorithms_for_solving_VRP 1. 适用场景 求解CVRP 车辆类型单一 车辆容量不小于需求节点最大需求 单一车辆基地 2. 问题分析 CVRP问题的解为一组满足需求节点需求的多个车辆的路径集合。 假设某物理网络中共有10个顾客节点,编号为1~10,一个车辆基地,编号为0,在满足车辆容量约束与顾客节点需求约束的条件下,此问题的一个可行解可表示为:[0-1-2-0,0-3-4-5-0,0-6-7-8-0,0-9-10-

qq_36744449的博客 3716

Yolov26 在 Rk3588 上的 Rknn Onnx 部署实践(模型转换)

本文详细介绍了将YOLOv26 ONNX模型转换为RKNN模型的过程,适用于RK3588平台。主要内容包括:1)量化数据集的创建,通过随机抽取最多400张JPG图片生成校准数据集;2)ONNX转RKNN的完整脚本,支持多种量化方式和平台适配;3)模型转换的参考调用方式;4)模型结构对比展示。文章还提供了注意事项,强调量化数据集图片尺寸、mean/std值需与实际推理一致,并给出精度优化建议。该转换流程为YOLOv26模型在RK3588上的高效部署提供了完整解决方案。

qq_64366203的博客 1127

如何快速掌握ALNS:Python自适应大邻域搜索算法的完整指南

ALNS(Adaptive Large Neighborhood Search)是一款强大的Python组合优化算法库,专为解决复杂的组合优化问题设计。通过灵活的启发式搜索框架,ALNS能在大型解空间中高效寻找近似最优解,广泛应用于物流调度、生产规划和资源分配等领域。本文将带你从安装到实战,全面掌握这个优化神器! ## ???? 什么是ALNS?核心功能解析 ALNS算法的核心在于**自适应邻域搜...

gitblog_00235的博客 664

Zabbix 简介、优缺点、基础原理

(8条消息) Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型 --------------------------------------------------------------------------------------------------------------------------- 一、Zabbix 简介 Zabbix是由A...

weixin_50196615的博客 2037

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

执行命令: make -j 4 && make install 这里要等待一段时间,等待编译完成。执行命令: ./configure --prefix=/usr/local/src/zlilb。执行命令: ./config --prefix=/usr/local/src/openssl。执行命令: make -j 4 && make test && make install。执行命令: make -j 4 && make install。执行命令: /etc/init.d/sshd restart。

X_yufei的博客 7429

ALNS优化算法完整教程:Python组合优化终极指南

你是否正在寻找解决复杂组合优化问题的高效方法?ALNS(自适应大邻域搜索)算法正是你需要的终极工具!🚀 ALNS是一种强大的元启发式算法,专门用于解决旅行商问题、车辆路径问题等经典的组合优化难题。这个Python实现的ALNS库为你提供了完整的算法框架,让你能够专注于问题本身,而不是算法实现。 ## 什么是ALNS优化算法? ALNS是自适应大邻域搜索算法的简称,它结合了多种启发式算子来系

gitblog_01178的博客 752

芯片设计流程中的def文件

在实际的DEF文件中,每个部分都包含了与实际设计相关的详细信息,这个模板只展示了每个部分的基本结构。在实际应用中,DEF文件通常由EDA(电子设计自动化)工具在完成布局(Placement)和布线(Routing)步骤后自动生成,在集成电路设计中,DEF(Design Exchange Format)文件的模板具体内容会依设计的复杂性和特定需求而变化。简而言之,LEF文件提供了单元的物理特性和规则,而DEF文件使用这些规则来确定单元。)文件描述了特定设计中所有物理元素的精确放置和连线信息。

qq_36045093的博客 4863
上一篇: plot4gmns:面向通用建模网络范式(GMNS)的快速可视化【v0.1.1】
下一篇: 软件工具 | Python调用运筹优化求解器(一):以CVRP&VRPTW为例
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论 3
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值