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

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

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

往期优质资源

1. 适用场景

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

2. 改进效果对比

这里做了简单的参数敏感性分析,比较不同参数组合下两个版本code的最优值与求解时间的差异。具体为:依次设定交叉概率为0.7,0.8,0.9,其他参数固定不变:最大迭代次数为500,种群规模为100,选择个体为80,变异概率0.2。具体实验结果如下表:
在这里插入图片描述

可以看出,改进后的code,目标函数优化 3% 至 7% 不等,但牺牲了40%左右的计算时间。这里计算时间以秒为单位,所以改进后的代码运算时间还是可以接受的。

3. 求解结果

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

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

4. 改进内容

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

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

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

5. 部分代码

(1)数据结构

# 数据结构:解
class Sol():
    def __init__(self):
        self.node_no_seq = None # 解的编码
        self.obj_val = None # 目标函数
        self.fitness = None  # 适应度
        self.route_list = 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.pc = 0.5 # 交叉概率
        self.pm = 0.2 # 变异概率
        self.n_select = 80 # 种群选择数量
        self.popsize = 100 # 种群规模

(2)距离矩阵

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

(5)车辆路径

def plotRoutes(model):
    for route in model.best_sol.route_list:
        x_coord = [model.depot.x_coord]
        y_coord = [model.depot.y_coord]
        for node_no in route[1:-1]:
            x_coord.append(model.demand_dict[node_no].x_coord)
            y_coord.append(model.demand_dict[node_no].y_coord)
        x_coord.append(model.depot.x_coord)
        y_coord.append(model.depot.y_coord)
        plt.plot(x_coord, y_coord, marker='s', color='b', linewidth=0.5)
    plt.show()

(6)主程序

def run(filepath,epochs,pc,pm,popsize,n_select,v_cap):
    """
    :model filepath: Xlsx文件路径
    :model epochs: 迭代次数
    :model pc: 交叉概率
    :model pm: 变异概率
    :model popsize: 种群规模
    :model n_select: 优秀父代保留数量
    :model v_cap: 车辆容量
    :model opt_type: 优化目标,0:最小化车辆数,1:最小化总行驶距离
    :return:
    """
    model=Model()
    model.vehicle_cap=v_cap
    model.pc=pc
    model.pm=pm
    model.popsize=popsize
    model.n_select=n_select
    readXlsxFile(filepath,model)
    cal_distance_matrix(model)
    genInitialSol(model)
    history_best_obj = []
    best_sol=Sol()
    best_sol.obj_val=float('inf')
    model.best_sol=best_sol
    start = time.time()
    for ep in range(epochs):
        calFit(model)
        selectSol(model)
        crossSol(model)
        muSol(model)
        history_best_obj.append(model.best_sol.obj_val)
        print("%s/%s, best obj: %s time : %s" % (ep,epochs,model.best_sol.obj_val,time.time()-start))
    plotObj(history_best_obj)
    plotRoutes(model)
    outPut(model)

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)涉及服务一组客户,每个客户都有某些货物的需求。

weixin_38442390的博客 2549

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

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

qq_42250782的博客 1106

Python VRP遗传算法优化解决方案

遗传算法是一种启发式搜索算法,受自然选择机制启发,用于解决优化问题。车辆路径问题(VRP)是物流和运输领域中的经典问题,涉及如何高效安排车辆的行驶路径以减少成本或时间。通过将遗传算法应用于VRP问题,我们可以构建高效的路径规划模型,降低物流成本,提高资源利用率。车辆路径问题(Vehicle Routing Problem,简称VRP)是组合优化领域的一个重要问题,广泛应用于物流和运输行业。

weixin_31860973的博客 1224

2. Python实现VRP常见求解算法——遗传算法(GA)

参考笔记 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-0

qq_36744449的博客 4371

使用遗传算法实现 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)。 第二部分:标准遗传算法的变体 修改上一步中开发的遗传算法的标准版本,仅选择以下选项之一: 具有不同种群大小的遗传算法 该想法是将“

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

Python实现VRP常见求解算法——遗传算法(GA)

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

Better.C的博客 1万+

欧姆龙多PLC串行链接模式的应用

欧姆龙多PLC串行链接模式的应用 一、如何将两台CP1H进行串行PLC连接(PLC串行链接) 主机侧设定 从机侧设定 二、 如何实现编程通信 主机侧的【PC连接模式】为【全部】的时候 ① 主机会把自己的地址从3100开始,按照【链接字】设定的字数个数发送到每个从机的3100开始进行存储。 ② 从机会把自己的地址从31n0开始,按照主机侧参数【链接字】设定的字数个数发送到主机的31n0开始进行存储。 注:(n为从机的地址号,若从机号不连续,则该编号的地址将不被定义..

u014202847的博客 3090

【进阶三】Python实现(MD)HFVRPTW常见求解算法——遗传算法(GA)

基于python语言,实现经典遗传算法(GA)对多车场(Multi-depot)、异构固定车辆(heterogeneous fixed fleet)、带有服务时间窗(time window)等限制约束的车辆路径规划问题((MD)HVRPTW)进行求解。

Better.C的博客 3942

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

深入解析MTK平台hang_detect机制:从原理到实战调试

本文深入解析了MTK平台hang_detect机制的工作原理与实战调试技巧。作为系统健康监测的核心机制,hang_detect通过多层级监控体系检测应用层和内核层异常,结合Kernel_exception等日志信息快速定位问题。文章详细介绍了典型问题案例、调试方法及预防措施,帮助开发者提升MTK平台系统稳定性调试能力。

purple的博客 1005

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言,采用经典遗传算法(GA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1547

如何设计ADAS系统功能状态机(一)

状态机模块在自动驾驶系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。今天我们来聊聊如何设计自动驾驶系统的状态机。

supass2018的博客 1617

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——遗传算法(GA)

基于python语言,采用经典遗传算法(GA)对 需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1552

Python 爬虫实战:爬取豆瓣电影 Top250 完整数据

本文基于Python技术实现了豆瓣电影Top250榜单数据的合规爬取与分析。针对豆瓣电影页面的分页结构、反爬机制等特点,采用requests库获取数据,结合BeautifulSoup解析HTML节点,并通过正则表达式提取电影名称、评分、导演等核心字段。爬虫实现了随机User-Agent、请求间隔控制等反爬规避策略,严格遵守豆瓣社区使用规范。最终数据经清洗后存储为结构化Excel文件,并提供了数据可视化与增量更新方案。该方案为影视研究提供了可靠的数据获取方法,同时确保符合非商业使用、适度爬取等合规要求。

2503_91057718的博客 3460

【Bug已解决】Failed to fetch version ECONNREFUSED 解决方案

方案适用场景推荐指数难度方案一:NODE_EXTRA_CA_CERTS代理/企业网关证书⭐⭐⭐⭐⭐低方案二:浏览器导出证书不知证书在哪⭐⭐⭐⭐中方案三:使用系统证书macOS 用户⭐⭐⭐⭐中方案四:关闭代理直连快速验证⭐⭐⭐低方案五:更新 Node.js证书列表过时⭐⭐⭐低方案六:同步系统时间时间偏差导致⭐⭐⭐低根本原因。

博客 9975

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

QQ也能连接OpenClaw啦!手机QQ远程操控本地AI保姆级教程

2026年最新OpenClaw与QQ连接教程发布,支持手机远程操控本地AI。腾讯官方推出QQ Bot插件,无需服务器即可实现三步绑定。教程提供三种连接方案:新手首选的扫码连接(10分钟搞定)、稳定的QQ群机器人方案,以及公网接入方案。详细步骤包括版本更新、插件安装、扫码绑定和功能测试,并附常见问题解决方案。该功能让用户通过QQ指令即可实现文件整理、文档生成等电脑操作,真正实现"手机发指令,电脑自动干"。

通俗易懂学IT 594

视频讲解|Python遗传算法GA在车辆路径规划VRP数据优化中的应用

遗传算法的灵感来自达尔文自然选择理论,简单说就是“让好的解留下来,再通过组合变异产生更好的解”,最终找到满足业务需求的最优路径。先看它的核心逻辑示意图:编码表示:把“运输路径”变成计算机能识别的“基因序列”。比如用城市编号表示路线,让复杂路径转化为简单的数字组合。初始种群:随机生成几十甚至上百条可能的路径。这一步是为了避免“一开始就局限在某条路径里”,保证解的多样性。适应度评估:给每条路径“打分”。在物流场景里,打分规则很直接——路径越短、越符合车辆容量约束,得分越高。进化操作。

大数据部落 875

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

遗传算法求解多车型VRP问题

客户排列 + 分割点”(Giant Tour + Split)方法。该方法通过将客户ID与分隔符(如0)结合形成染色体,解码时根据分隔符划分路线,并检查容量、时间窗等约束条件进行车辆分配。其优点在于结构简单,可直接应用经典遗传算法算子,但缺点是解码复杂,容易产生不可行解,且分隔符位置对解质量影响较大。

博客简介 1411

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【进阶四】Python实现(MD)HVRP常见求解算法——遗传算法(GA)

遗传算法+Split求解异构车辆路径规划问题

Better.C的博客 2118

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

2.【进阶】Python实现MDCVRP常见求解算法——遗传算法(GA)

参考笔记 https://github.com/PariseC/Algorithms_for_solving_VRP 1. 适用场景 求解MDCVRP 问题 车辆类型单一 车辆容量不小于需求节点最大需求 多车辆基地 各车场车辆总数满足实际需求 2. 代码分析 车俩路径规划问题按照车场数量可分为单一车场路径规划问题和多车场路径规划问题。 针对单一车场条件下仅考虑车辆容量限制的路径规划问题前边帖子中已实现GA算法求解,本文采用GA算法对多车场条件下仅考虑车辆容量限制的路径规划问题进行求解。为了保持代码的延续

qq_36744449的博客 1404

路径规划算法 代码代做 算法改进 多目标优化算法 遗传算法 智能优化算法 数学建模

【摘要】本研究提出一个基于改进遗传算法的多车场冷链VRP与无人机协同配送优化方案,采用MATLAB实现完整算法框架。系统包含3个配送中心、20个客户点(含冷链需求与时间窗约束),通过混合遗传算法(结合变邻域搜索)优化卡车-无人机协同配送路径。算法最小化总成本(燃油+冷链耗能+时间惩罚),提供可扩展的代码结构(支持选址-路径联合优化)。案例演示显示,该方法有效处理多约束条件下的物流配送问题,为智能物流系统提供优化解决方案。

2501_90824910的博客 973

[基因遗传算法]进阶之三:sko.GA的实践TSP

即路线距离函数路线routine举例为: 共31个城市的路线顺序.起点与终点的为同一个city.def cal_total_distance(routine) : '''计算总距离:输入路线,返回总距离.

panbaoran913的博客 4468
上一篇: 《Python助力交通》公众号说明
下一篇: 【改进篇】Python实现VRP常见求解算法——禁忌搜索算法(TS)
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、付费专栏及课程。

余额充值