【改进篇】Python实现VRP常见求解算法——禁忌搜索算法(TS)

禁忌搜索(Tabu Search)算法及python实现 禁忌搜索(Tabu Search)算法解决及python实现 禁忌搜索(Tabu Search,TS,又称禁忌搜寻法)是一种现代启发式算法,由美国科罗拉多大学教授Fred Glover在1986年左右提出的,是一个用来跳脱局部最优解的搜索方法。其先创立一个初始化的方案;基于此,算法“移动”到一相邻的方案。经过许多连续的移动过程,提高解的质量。本Markdown编辑器使用StackEdit修改而来... 阅读详情

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

往期优质资源

1. 适用场景

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

2. 改进效果对比

这里做了简单的参数敏感性分析,比较不同参数组合下两个版本code的最优值与求解时间的差异。具体为:依次设定禁忌长度为10,20,30,其他参数固定不变:最大迭代次数为300,车辆容量为80。具体实验结果如下表:

在这里插入图片描述

可以看出,改进后的code,目标函数优化 3% 至 7% 不等,但牺牲了5倍左右的计算时间。这里计算时间以秒为单位。【在进行实验室计算机在同步执行其他程序,所以实验条件不能保证完全相同,但可反应总体情况】

3. 求解结果

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

(2)车辆路径
在这里插入图片描述

4. 改进内容

本期代码在前期代码的基础上做了以下改进:

  • 增加距离矩阵,减少代码中重复计算节点间距离代码
  • 引入文献中基于图论的Split方法,在给定节点id序列时,可求得最优分割方案

除了以上关键改动之外,还对代码做了细小调整。

5. 部分代码

(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.tabu_list=None # 禁忌表
        self.TL=30 # 禁忌长度
        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

        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 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

(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()

6. 完整代码

如有错误,欢迎交流。
有偿获取

参考

  1. A simple and effective evolutionary algorithm for the vehicle routing problem
写一个用遗传算法解决VRP问题的代码 下面是一个使用 Python 实现的遗传算法解决 VRP 问题的代码示例: ``` import random import numpy as np class VRP: def init(self, num_customers, vehicle_capacity, demand, distance_matrix): self.num_customers = num_cus... 阅读详情

相关推荐

Python-运筹优化领域常见问题模型-VRP

在运筹优化领域,车辆路径问题(VRP)是一个经典且重要的问题。VRP 一般指的是对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下,力争实现一定的目标。最基本的 VRP 问题叫做带容量约束的车辆路径规划问题(Capacitated Vehicle Routing Problem,CVRP)。在 CVRP 中,需要考虑每辆车的容量约束、车辆的路径约束和装载量约束。

百态·数智思维 | 聚焦大数据、量化与未来AI 456

【改进篇】Python实现VRP常见求解算法——遗传算法(GA)

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

Better.C的博客 3684

深入解析禁忌搜索算法及其Python实现

禁忌搜索由 Glover 提出,是一种基于局部搜索的优化方法。它通过禁忌表的引入避免循环搜索已访问过的解,并通过多样化搜索策略探索解空间,适用于解决复杂的优化问题,如旅行商问题(TSP)、车辆路径规划问题(VRP)和生产调度问题。本文详细介绍了禁忌搜索算法及其 Python 实现,并通过结合工厂模式、策略模式和模板方法模式解决了 TSP、调度问题等实际案例。通过设计模式的灵活应用,我们可以扩展禁忌搜索框架以适应更多问题场景,提升代码的复用性与可维护性。

闲人编程的博客 376

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

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

qq_42250782的博客 1106

Python 利用遗传算法、模拟退火和禁忌搜索算法解决车辆路径问题(VRP)的详细项目实例

车辆路径问题(Vfhiclf ITouting Pitoblfm,VITP)她运筹学和物流管理领域中一个重要她组合优化问题,其目她她在满足一系列约束条件她前提下,找到最优她车辆路线。例如,遗传算法她模拟退火算法她结合可以有效避免局部最优解她问题,禁忌搜索她遗传算法她结合能够提升搜索效率并加速收敛。在项目她实她过程中,我们充分考虑了算法她多样她和灵活她,确保不同她优化需求能够得到满足。通过不断她实验她调优,我们不仅提升了算法她收敛速度,还确保了系统她高效她和稳定她。这个代码用她绘制不同算法她她能对比图。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1098

车辆路径问题的Python与MATLAB解决工具包

车辆路径问题(Vehicle Routing Problem,VRP)是运筹学中一类重要的组合优化问题,主要关注如何高效地分配车辆对客户进行服务,以便最小化运输成本并满足一系列约束条件。此问题广泛存在于物流、配送、调度等领域,对于提高运输效率、降低成本具有显著的意义。禁忌搜索算法(Tabu Search, TS)是由Fred Glover于1986年提出的一种用于解决组合优化问题的启发式搜索算法。算法的命名来源于其核心机制——一个“禁忌表”,用于记录搜索过程中已经访问过的解,以避免搜索陷入局部最优解。

weixin_31486261的博客 830

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

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

Better.C的博客 1638

使用遗传算法实现 TSP 和 VRP算法_python_代码_下载

使用遗传算法实现 TSP 和 VRP 算法 TSP 和 VRP 的遗传算法 解决旅行商问题和车辆路线问题(TSP,VRP)的遗传算法这个实际作业需要使用 Python 开发遗传算法的实现,以解决旅行商问题 - TSP 和车辆路线问题 - VRP (至少应该包括TSP) 旅行推销员问题。为需要访问一组城市的推销员找到最佳行程,每个城市只访问一次,除了旅行开始的城市,那必须是最后一个访问的城市。车辆路线问题。寻找将供应品运送给具有不同需求的一组客户的路线。路线应根据可用的卡车车队进行调整,以获得最低成本。 第一部分:遗传算子 一个完整的标准遗传算法应该在 Python 中实现,包括几个(至少一个)特定于排列的运算符。例如: 部分映射交叉 (PMX)(幻灯片 41 和 42)。 边缘交叉(幻灯片 45、46 和 47)。 订单交叉(幻灯片 39 和 40)。 插入突变(幻灯片 34)。 交换突变(幻灯片 35)。 反向突变(幻灯片 36)。 第二部分:标准遗传算法的变体 修改上一步中开发的遗传算法的标准版本,仅选择以下选项之一: 具有不同种群大小的遗传算法 该想法是将“

Python实现VRP常见求解算法——禁忌搜索(TS)

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

Better.C的博客 5448

数据助力行业发展:BJTU-RAO转向架数据集介绍

BJTU-RAO转向架数据集是完全公开的,何研究人员皆可以通过后文的下载链接免费下载数据,且在标注数据来源的前提下,研究人员可以自由使用BJTU-RAO转向架数据集。因此,聚焦各类列车转向架传动系统在途安全保障新技术研究和新算法开发,实现牵引电机、驱动齿轮箱和轴箱等关键部件的实时状态监测与智能故障诊断,对保障列车安全可靠运行具有重要的现实意义。BJTU-RAO转向架数据集包含51种健康状态的样本,涵盖正常状态、部件级单一故障、部件级复合故障以及系统级关联复合故障,数据量达116GB。

2401_88870554的博客 3502

【AI概念】迁移学习 vs. 域自适应 vs. 域泛化|定义、核心原理、数学表达、易混淆点与工程选择建议|实际案例、工程实现细节、未来研究趋势、实际应用场景

大家好,我是爱酱。本篇将会详细梳理迁移学习(Transfer Learning)、域自适应(Domain Adaptation)、域泛化(Domain Generalization)三大常被混淆的核心概念,结合数学公式、典型算法与实际应用场景,帮助你厘清它们的本质区别、联系与工程意义。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 2471

3. Python实现VRP常见求解算法——禁忌搜索(TS)

参考笔记 https://github.com/PariseC/Algorithms_for_solving_VRP TS算法原理详解 禁忌搜索(Tabu Search)算法及python实现 邻域 对于组合优化问题,给定任意可行解x,x∈D,D是决策变量的定义域,对于D上的一个映射:N:x∈D→N(x)∈2(D) 其中2(D)表示D的所有子集组成的集合,N(x)成为x的一个邻域,y∈N(x)称为x的一个邻居。 候选集合 候选集合一般由邻域中的邻居组成,可以将某解的所有邻居作为候选集合,也可以通过最优提取

qq_36744449的博客 4227

【低空经济】森林火情高精度监测与早期预警无人机巡护方案

在全球范围内,森林火灾已成为一个严重的生态和社会问题。它不仅对自然生态系统造成了毁灭性的影响,还对人类的生命财产安全构成了极大的威胁。根据国际森林发展组织的统计,全球每年因森林火灾造成的经济损失高达数百亿美元,甚至在某些年份,火灾损失占到某些国家国民经济总量的相当一部分。因此,开展高效的森林火情监测与早期预警工作显得尤为重要。随着科技的发展,无人机作为新兴的监测工具,以其高效、灵活和经济的特点在森林火灾监测领域展现出了巨大的潜力。

2502_92579126的博客 1213

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万+

MATLAB实战:利用扫频数据重构系统伯德图的关键步骤

本文详细介绍了如何利用MATLAB处理扫频数据并重构系统伯德图的完整实战流程。内容涵盖数据导入与清洗、增益与相位的精确计算、频率响应数据对象(frd)的构建、数据平滑与插值处理,以及最终生成专业伯德图并进行关键参数(如相位裕度)标注的方法。文章重点解决了从实测“黑盒子”系统数据出发,获取直观频率响应特性曲线的核心问题,为控制系统分析与设计提供了实用指南。

weixin_29098117的博客 399

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

禁忌搜索算法完整指南(python)

在实际生活中,很多问题都可以转化为优化问题,比如生产调度、物流配送、旅行商问题等等。对于这些问题,我们需要找到一个最优解或者接近最优解的解。然而,传统的一些优化算法,如贪心算法、动态规划等,往往只能找到局部最优解,而不能保证全局最优解。这时候,我们需要一些更强大的算法来帮助我们解决问题,禁忌搜索算法就是其中一种。

bgfffg的博客 3607

为什么idea已经改了UTF-8还是乱码,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1577

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

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

Better.C的博客 1376

手机VPN的连接方法分享

6、返回到VPN页面,可以看到刚刚新添加的VPN,点击开启VPN后面的开关。5、在打开的添加VPN的页面中输入VPN的信息后点击右上角的“保存”按钮。7、待VPN开关开启后,可以看到添加的VPN正在连接的提示信息了。2、在打开的小米手机设置页面中点击“更多连接方式”的菜单项。3、然后在打开的更多连接方式页面中点击VPN的菜单项。4、在打开的VPN设置页面中点击“添加VPN”的按钮。1、首先在手机屏幕左右的滑动,找到手机的设置图标。

惠惠软件 3万+

Vibe coding 氛围编程:编程就像聊天一样,低代码开发时代来了?

Vibe coding:编程就像聊天一样,低代码开发时代来了!

Code_流苏:在代码中寻诗意,在实践中觅真知 4804

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

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

Better.C的博客 1431

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【群智能算法】TS-TSP 基于禁忌搜索的车辆路径优化方法-Python

禁忌搜索(Tabu Search, TS)是一种基于局部搜索的优化算法,它通过引入禁忌表来避免陷入局部最优解。禁忌表存储了在当前解的邻域中不可选的解,以此来避免在短期内重复选择相同的解,从而拓宽搜索空间,提高算法的全局搜索能力。随机选择一个初始解。通过对当前解进行一些小的变动(如交换、插入、翻转等)生成邻域解。从生成的邻域解中选择最优解。将选择的解加入禁忌表,避免在短期内重复选择相同解。在一定迭代次数下,算法不断迭代更新当前解,逐步优化目标函数。达到最大迭代次数或者找到满意的解时,终止算法。

2303_77200324的博客 1068

VC中sqlite的使用

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

参考笔记 https://github.com/PariseC/Algorithms_for_solving_VRP 1. 适用场景 求解MDCVRP 问题 车辆类型单一 车辆容量不小于需求节点最大需求 多车辆基地 各车场车辆总数满足实际需求 1. 适用场景 求解MDCVRP 问题 车辆类型单一 车辆容量不小于需求节点最大需求 多车辆基地 各车场车辆总数满足实际需求 2. 代码分析 车俩路径规划问题按照车场数量可分为单一车场路径规划问题和多车场路径规划问题。针对单一车场条件下仅考虑车辆容量限制的路径

qq_36744449的博客 494

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

禁忌搜索算法(Tabu Search,TS)在组合优化中的实战应用与Python/MATLAB代码解析

本文深入解析了禁忌搜索算法(Tabu Search)在组合优化问题中的实战应用。通过对比传统爬山算法,阐释了TS通过引入禁忌表和藐视准则来跳出局部最优的核心机制。文章以旅行商问题(TSP)为例,提供了完整的Python和MATLAB代码实现,并详细拆解了算法四大核心部件与关键调参技巧,为读者提供了从理论到实践的全面指南。

weixin_29212867的博客 308

Python实现禁忌搜索算法:从原理到实战优化TSP问题

组合优化是运筹学和计算机科学中的核心问题,旨在从海量可行解中找到最优或近似最优的方案。其原理在于通过设计高效的搜索策略,在可接受的时间内探索解空间。禁忌搜索作为一种经典的元启发式算法,通过引入禁忌表和藐视准则,巧妙地平衡了局部搜索与全局探索,有效避免了陷入局部最优陷阱,具有重要的技术价值。该算法广泛应用于旅行商问题、车辆路径规划、调度排班等复杂场景。本文以旅行商问题为例,详细解析了禁忌搜索的Python实现,并深入探讨了邻域结构、参数调优和增量计算等关键优化技巧,为数学建模和工程实践提供了可直接复用的代码框

weixin_30591551的博客 320
上一篇: 【改进篇】Python实现VRP常见求解算法——遗传算法(GA)
下一篇: 【改进篇】Python实现VRP常见求解算法——蚁群算法(ACO)
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论 1
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值