【改进篇】Python实现VRP常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

智能算法实战指南:从模拟退火到全局优化,解决NP难题 在计算机科学和运筹学中,面对NP难题和复杂优化问题,传统精确算法往往因计算复杂度而失效。此时,元启发式算法作为一种高效的近似求解策略应运而生。其核心原理是放弃对全局最优解的绝对保证,通过模拟自然现象或物理过程,在庞大的解空间中进行有导向的随机搜索,以在可接受时间内找到高质量满意解。这类算法的技术价值在于为解决组合优化、函数寻优等实际问题提供了通用且强大的工具箱。典型的应用场景包括旅行商问题、资源调度、机器学习超参数调优等。本文以模拟退火算法为例,深入剖析其如何通过引入概率性接受差解的Metropolis准则 阅读详情

基于python语言,实现经典禁忌搜索(TS)+模拟退火(SA)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数

往期优质资源

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

1. 适用场景

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

2. 改进效果对比

这里做了简单的参数敏感性分析,量子粒子群算法的参数较少,只有一个 创新参数 alpha,参数调整范围为:[0.1,0.95],步长为0.05其他参数:最大迭代次数为300,车辆容量为80。

2.1 实验结果汇总

(1)SA
在这里插入图片描述

(2)TS
在这里插入图片描述

3. 求解结果

3.1 SA

(1)收敛曲线
在这里插入图片描述

(2)车辆路径

在这里插入图片描述

3.2 TS

(1)收敛曲线
在这里插入图片描述

(2)车辆路径

在这里插入图片描述

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 createActions(n):
    action_list=[]
    nswap=n//2
    #第一种算子(Swap):前半段与后半段对应位置一对一交换
    for i in range(nswap):
        action_list.append([1,i,i+nswap])
    #第二中算子(DSwap):前半段与后半段对应位置二对二交换
    for i in range(0,nswap,2):
        action_list.append([2,i,i+nswap])
    #第三种算子(Reverse):指定长度的序列反序
    for i in range(0,n,4):
        action_list.append([3,i,i+3])
    return action_list
# 执行邻域搜索
def doAction(node_no_seq,action):
    node_no_seq=copy.deepcopy(node_no_seq)
    if action[0]==1:
        index_1=action[1]
        index_2=action[2]
        temporary=node_no_seq[index_1]
        node_no_seq[index_1]=node_no_seq[index_2]
        node_no_seq[index_2]=temporary
        return node_no_seq
    elif action[0]==2:
        index_1 = action[1]
        index_2 = action[2]
        temporary=[node_no_seq[index_1],node_no_seq[index_1+1]]
        node_no_seq[index_1]=node_no_seq[index_2]
        node_no_seq[index_1+1]=node_no_seq[index_2+1]
        node_no_seq[index_2]=temporary[0]
        node_no_seq[index_2+1]=temporary[1]
        return node_no_seq
    elif action[0]==3:
        index_1=action[1]
        index_2=action[2]
        node_no_seq[index_1:index_2+1]=list(reversed(node_no_seq[index_1:index_2+1]))
        return node_no_seq

5. 完整代码

如有错误,欢迎交流。

私信,有偿

参考

  1. A simple and effective evolutionary algorithm for the vehicle routing problem
禁忌搜索算法求解VRP问题的MATLAB实现 虽然经典的车辆路径规划(Vehicle Routing Problem,简称VRP)问题已被广泛研究和解决,但在实际中,由于复杂的路况、需求量变动、距离限制等因素,车辆路径规划问题仍然具有很高的实用价值。VRP问题描述的是如何安排多辆车辆,完成一系列客户的配送任务,使得每个客户得到满足,并且所有车辆的行驶距离最短。禁忌搜索算法是一种经典的组合优化演算法,主要思想是避免陷入局部最优解,通过设置“禁忌表”来记录历史状态信息,从而跳出山峰。转移:根据候选集中的解转移到新的解,并更新禁忌表。 阅读详情

相关推荐

【VRP问题】基于禁忌搜索求解带时间窗的TWVRP问题.md

【VRP问题】基于禁忌搜索求解带时间窗的TWVRP问题

启发式算法-禁忌搜索(Python)

启发式算法-禁忌搜索 python实现

qq_42250782的博客 1106

python实现VRPTW求解禁忌搜索算法.rar_VRP 禁忌_python实现vrptw_sleptwfl_vrp_时间

采用禁忌搜索算法解决问题,解决带时间窗的VRP问题

2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法

文章的来源:【图文】智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库https://wenku.baidu.com/view/335c56e94afe04a1b071de13.html声明:知识总结方便以后的查阅1.遗传算法2.局部搜索算法-----自己觉的是梯度下降的方法3.禁忌搜索法4.模拟退火算法...

luolang_103的博客 1994

步进电机原理及梯形加速算法

步进电机重理解与梯形加速算法

weixin_39912966的博客 1324

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 376

【进阶六】Python实现SDVRPTW(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

基于python语言,采用经典禁忌搜索(TS)+模拟退火(SA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。

Better.C的博客 1376

aruco_ros实战:从USB摄像头到Marker位姿检测全流程解析

本文详细解析了使用aruco_ros从USB摄像头实现ArUco Marker检测与位姿估计的全流程。内容涵盖环境搭建、核心launch文件配置、可视化调试、位姿数据解析以及深度优化技巧,帮助开发者快速掌握ROS下的视觉定位关键技术,并集成到机器人项目中。

weixin_29230805的博客 265

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

基于python语言,采用经典禁忌搜索(TS)+模拟退火(SA)对 需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1431

LIGGGHTS颗粒模拟入门:从DEM原理到工程实践

离散元法(DEM)是一种用于模拟颗粒物质行为的数值方法,其核心原理是通过计算每个颗粒的运动和相互作用来预测颗粒系统的宏观行为。该方法基于牛顿第二定律和接触力学模型,能够精确描述颗粒间的碰撞、摩擦和粘结等微观机制。在工程实践中,DEM技术为优化工业设备设计、预测材料流动和减少实验成本提供了重要价值。它广泛应用于制药造粒、矿石破碎、粉体输送和农业加工等领域,帮助工程师和研究人员深入理解颗粒系统的复杂动力学。LIGGGHTS作为一款基于LAMMPS的开源DEM软件,继承了其高效的并行计算架构,并针对颗粒模拟进行了

weixin_33979203的博客 419

川崎机器人总线通信_三菱PLC和发那科机器人进行CCLINK总线通信

三菱CCLINK主站模块采用QJ61BT11N,该模块用在Q系列PLC上,如果是5U或3UPLC,可用FX5-CNV-BUS加FX3U-16CCL-M或FX5-CCL-M模块。本教程以Q系列为例CCLINK接线方法如下模块拨码含义如下接线和拨码设置好后,接着在编程软件上设置CCLINK通信参数打开编程软件,在工程导航栏打开参数——网络参数,选中CCLINK打开。打开如下画面起始IO为模块本体占用I...

weixin_42300398的博客 7554

VRP问题

最近一个物流配送车辆调度系统的项目要求带VRP的功能,以下是一些开源框架、API,和重点尝试的禁忌搜索。 用c-w节约启发式算法解决的单车型送货非满载vsp问题 https://www.write-bug.com/article/173.html API: http://demo.smartvrp.com/eu https://georepublic.info/en/product...

越开源越幸运 1万+

基于Keil软件实现对射式红外传感器计次 (江协科技HAL库)

用HAL库复现江协科技,让嵌入式学习之路更顺畅。

2401_82728381的博客 800

数学建模竞赛实战:从VRP问题到启发式算法求解全流程解析

车辆路径问题(VRP)是运筹学与组合优化领域的经典问题,其核心目标是在满足一系列约束条件下,为多辆车规划访问多个客户点的最优行驶路线,以最小化总成本或最大化效率。该问题属于NP-hard难题,无法在多项式时间内求得精确最优解,因此在实际工程中广泛采用启发式与元启发式算法进行近似求解。这类算法,如模拟退火、遗传算法和禁忌搜索,通过模拟自然过程或利用历史搜索信息,在可接受的时间内寻找高质量可行解,在物流配送、供应链管理、网络路由等场景具有极高的技术价值。本文以数学建模竞赛为背景,深入探讨了模拟退火算法在求解带时

weixin_34356555的博客 309

基于多传感器融合的智身四足机器狗楼梯环境SLAM系统设计与实现

本文设计了一种基于多传感器融合的四足机器狗楼梯环境SLAM系统。系统采用Jetson Orin NX为主控制器,集成RealSense D435i深度相机和Livox Mid360激光雷达,在ROS2框架下实现平面定位精度<5cm、楼梯环境下导航不漂移的目标。通过多层次传感器融合策略、运动学约束优化和状态切换机制,解决了楼梯环境下的定位累积误差问题,实现了平面与楼梯环境的自动识别切换及精度复位功能。硬件设计注重传感器布局优化和精确标定,软件架构采用分层设计,确保实时性能。该系统为四足机器人在复杂地形中

huanghm88的专栏 244

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神经网络(SOM)的TSP算法研究附Python代码

旅行商问题(TSP)是组合优化领域中一个经典的 NP 难问题,其核心是寻找一条最短的闭合路径,使旅行商能够遍历所有给定城市并回到起点。由于 TSP 问题在物流配送、电路设计、路径规划等实际场景中具有广泛应用,众多智能优化算法被用于求解该问题。本文将深入探讨遗传算法(GA)、粒子群优化(PSO)、模拟退火(SA)、禁忌搜索(TS)、蚁群算法(ACO)和自组织神经网络(SOM)在 TSP 问题中的应用原理、实现方法及性能特点。TSP 问题的数学建模各类算法在 TSP 中的实现原理与步骤结论与展望。

matlab_daizuo的博客 587

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

从邮路规划到VRP:运筹学经典问题的建模与求解实战

车辆路径问题(VRP)是运筹学与组合优化领域的核心问题之一,旨在为多辆车辆规划访问一系列客户点的最优路线,以最小化总成本。其核心原理是在满足车辆载重、行驶时间等约束条件下,对节点进行高效聚类与路径排序。该问题的技术价值在于其广泛的工程应用背景,是解决物流配送、快递调度、共享出行等“最后一公里”难题的通用数学模型。本文以经典的带容量约束车辆路径问题(CVRP)为例,深入剖析了如何将“邮车调度”等具体业务抽象为VRP模型,并详细探讨了节约算法、模拟退火等启发式算法的求解策略与工程实现技巧,为应对数学建模竞赛及实

weixin_34110749的博客 407

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MathorCup A题备战:资源调度与路径优化建模与算法实战

资源调度与路径优化是运筹学与计算机科学交叉领域的经典问题,其核心在于如何在满足多种约束条件下,高效分配有限资源并规划执行路径。其基本原理通常通过构建混合整数规划模型来描述,目标是最小化总成本或最大化效率,同时处理如容量、时间窗等复杂约束。该技术的价值在于能显著提升物流、配送、生产排程等系统的运营效率,降低成本,是智能决策系统的关键组成部分。在实际应用中,常面临多需求点、异构资源、动态信息等挑战,需借助元启发式等算法求解。本文以MathorCup高校数学建模挑战赛为背景,深入探讨了带时间窗的车辆路径问题,详细

weixin_30256901的博客 466

资源调度与路径优化:从建模框架到启发式算法实战

资源调度与优化是运筹学和工业工程中的核心问题,旨在将有限的资源(如车辆、算力、人力)高效地分配给一系列任务。其基本原理是通过建立数学模型,在满足各种约束(如容量、时间窗)的前提下,优化目标(如成本最低、时间最短)。这项技术的价值在于能显著提升物流配送、应急响应、数据中心管理等场景的运营效率。实现优化通常涉及精确算法(如混合整数规划)和启发式算法(如遗传算法、模拟退火)的权衡。针对大规模动态调度问题,融合经典启发式与元启发式的混合策略,例如先用节约算法生成初始解,再通过模拟退火进行邻域搜索优化,已成为平衡求解

weixin_30552811的博客 410

数学建模竞赛实战:从LRP问题解析到遗传算法代码实现

数学建模是将复杂现实问题抽象为可计算数学模型的核心方法,其关键在于问题分解与模型构建。在运筹学领域,经典的组合优化问题如设施选址问题(FLP)和车辆路径问题(VRP)常被集成研究,形成选址-路径问题(LRP)。解决此类NP-hard问题,需在精确算法与启发式算法间权衡:精确算法如混合整数规划(MIP)能保证小规模问题的最优解,而面对大规模数据,元启发式算法如遗传算法(GA)则凭借其全局搜索能力成为工程实践的首选。遗传算法通过模拟自然选择过程,利用选择、交叉、变异等操作迭代优化解的质量,常与局部搜索(如2-o

weixin_34238633的博客 381

数学建模竞赛实战指南:从团队构建到论文撰写的全流程解析

数学建模是将实际问题抽象为数学模型,并通过算法求解的核心技术,广泛应用于优化、预测、评价等工程与科研领域。其核心价值在于通过数学工具量化分析复杂系统,为决策提供科学依据。在车辆路径规划、资源调度、数据分析等场景中,数学建模能有效提升效率与精度。本文以“五一杯”数学建模竞赛为背景,深入探讨团队协作中建模手、编程手与写手的角色分工,并详细解析了从赛题拆解、模型建立到算法实现的全流程。通过引入优化模型与遗传算法等热词,结合快递投放等案例,系统阐述了如何将数学模型转化为可执行的解决方案,并强调了论文撰写与结果分析在

weixin_34391445的博客 371

数学建模赋能旅游产品设计:从多目标优化到商业实战

多目标优化是运筹学与数据分析中的核心方法,旨在同时优化多个相互冲突的目标,并在约束条件下寻找最优平衡解。其原理通常涉及构建目标函数与约束体系,并运用启发式算法(如遗传算法)进行求解。该技术在工程与商业领域价值显著,能有效处理资源分配、路径规划等复杂决策问题。在应用场景上,多目标优化广泛用于物流调度、金融投资组合及产品设计等领域。本文聚焦于旅游套餐设计这一具体场景,探讨如何通过聚类分析、车辆路径问题(VRP)建模及遗传算法求解,实现家庭满意度与公司利润的双重优化,为数据驱动决策提供完整的技术实现路径与商业洞察

weixin_33881140的博客 528

数学建模国赛B题解题框架:从问题转化到算法实现

数学建模是将现实世界复杂问题转化为可量化、可求解数学模型的过程,其核心在于抽象与转化。其基本原理是通过定义决策变量、目标函数和约束条件,构建描述系统行为的数学结构。这一过程的技术价值在于为资源调度、路径规划、系统优化等经典运筹学问题提供了科学决策依据。在车辆路径问题、设施选址等应用场景中,参赛者常需运用整数规划、启发式算法等工具进行求解。本文聚焦于数学建模国赛B题,深入剖析如何将场景化描述精准识别为如带容量约束的车辆路径问题等经典模型,并提供从模型选择、遗传算法编码到参数调优的完整工程实践路径,助力构建从问

keke1314520的博客 384

禁忌搜索(Tabu Search)算法及python实现

https://blog.youkuaiyun.com/adkjb/article/details/81712969/ https://blog.youkuaiyun.com/weixin_39124421/article/details/85158330 https://www.dazhuanlan.com/2019/12/27/5e04edab27ade/

phymat.nico的专栏 917

【进阶一】Python实现MDCVRP常见求解算法——禁忌搜索(TS)

基于python语言,实现禁忌搜索算法(TS)对多车场车辆路径规划问题(MDCVRP)进行求解。

Better.C的博客 2063
上一篇: 【改进篇】Python实现VRP常见求解算法——量子粒子群算法(QDPSO)
下一篇: 【CVRP测评篇】 算法性能如何?来测!
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、付费专栏及课程。

余额充值