【改进篇】Python实现VRP常见求解算法——蚁群算法(ACO)

蚁群算法解决TSP(旅行商)问题 文章目录一、前言蚁群算法的基本原理:其中的基本过程二、状态问题1.城市被选择的概率由距离和信息素浓度共同决定2.信息素更新三、整体实现 一、前言 蚁群算法(Ant Colony Optimization,ACO)是一种模拟自然界中蚂蚁觅食行为的优化算法。在蚁群算法中,蚂蚁寻找食物的方式被模拟为一种通过信息素通信来协作搜索解空间的算法。 蚁群算法要求考虑到多个蚂蚁之间相互交流信息的影响,因此也称作反向分布式系统中的元启发式,并已经成功用于旅行商问题(TSP)、车辆路径规划问题(VRP)等优化领域。它利用蚁群 阅读详情

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

往期优质资源

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

1. 适用场景

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

2. 改进效果对比

这里做了简单的参数敏感性分析,比较不同参数组合下两个版本code的最优值与求解时间的差异。具体为:1)设定信息素挥发因子为0.1,0.3三个不同等级;2)设定信息启发式因子为1,2,3,4,5不同值;3)设定期望启发式因子为1,2,3,4,5不同值,其他参数固定不变:最大迭代次数为300,车辆容量为80。

2.1实验结果

rho=0.1:
在这里插入图片描述
rho=0.3:
在这里插入图片描述

2.2 改进前后算法性能对比

求解时间对比(红色为改进后,蓝色为改进前):
在这里插入图片描述
行驶距离对比(红色为改进后,蓝色为改进前):
在这里插入图片描述

可以直观看出,改进后算法求解时间略有增加, 平均增加3.10%,目标函数平均优化1.38%。

3. 求解结果

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

(2)车辆路径
在这里插入图片描述
(3)输出文件

在这里插入图片描述

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.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 movePosition(model):
    sol_list=[]
    local_sol=Sol()
    local_sol.obj=float('inf')
    for _ in range(model.popsize):
        #随机初始化蚂蚁为止
        node_no_seq=[random.randint(0,len(model.demand_id_list)-1)]
        all_node_no_seq=copy.deepcopy(model.demand_id_list)
        all_node_no_seq.remove(node_no_seq[-1])
        #确定下一个访问节点
        while len(all_node_no_seq)>0:
            next_node_no=searchNextNode(model,node_no_seq[-1],all_node_no_seq)
            node_no_seq.append(next_node_no)
            all_node_no_seq.remove(next_node_no)
        sol=Sol()
        sol.node_no_seq=node_no_seq
        sol.obj,sol.route_list,sol.route_distance=calObj(node_no_seq,model)
        sol_list.append(sol)
        if sol.obj < local_sol.obj:
            local_sol = copy.deepcopy(sol)
    model.sol_list=copy.deepcopy(sol_list)
    if local_sol.obj<model.best_sol.obj:
        model.best_sol=copy.deepcopy(local_sol)
# 搜索下一移动节点
def searchNextNode(model,current_node_no,SE_List):
    if len(SE_List) == 1:
        return SE_List[0]
    prob=np.zeros(len(SE_List))
    for i,node_no in enumerate(SE_List):
        eta=1/model.distance_matrix[current_node_no,node_no]
        tau=model.tau[current_node_no,node_no]
        prob[i]=((eta**model.alpha)*(tau**model.beta))
    #采用轮盘法选择下一个访问节点
    cumsumprob=(prob/sum(prob)).cumsum()
    cumsumprob -= np.random.rand()

    return SE_List[list(cumsumprob > 0).index(True)]

(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
基于ACO蚁群优化实现VRPTW问题求解 ACO算法是一种模拟自然界蚂蚁寻找食物路径的方法,在旅行商问题、图着色、调度、路由等领域中有着广泛的应用,而蚁群优化则是将ACO算法引入优化问题,通过不断地迭代更新蚂蚁的路径信息,最终寻找到一个最优的解决方案。其中,车辆路径规划问题中的VRPTW问题尤为重要,它是指在满足客户需求和车辆容量限制的情况下,找到一组路径方案,使得所有客户服务时间最短,旅行距离最短,并且在给定的时间窗口内完成配送。车辆路径规划:通过蚁群中的每一只蚂蚁寻找最优路径,当所有蚂蚁完成任务后,更新信息素浓度和挥发系数。 阅读详情

相关推荐

【VRPD问题】基于蚁群算法求解运钞车运输问题VRPD

蚁群算法的基本思想: 蚁群算法的基本原理: 1、蚂蚁在路径上释放信息素。 2、碰到还没走过的路口,就随机挑选一条路走。同时,释放与路径长度有关的信息素。 3、信息素浓度与路径长度成反比。后来的蚂蚁再次碰到该路口时,就选择信息素浓度较高路径。 4、最优路径上的信息素浓度越来越大。 5、最终蚁群找到最优寻食路径。 人工蚁群与真实蚁群对比: 基于TSP问题的基本蚁群算法: TSP求解中,假设蚁群算法中的每只蚂蚁是具有以下特征的简单智能体: 每次周游,..

qq_59747472的博客 350

蚁群算法讲解python

1.简单介绍蚁群算法 2.讲解了蚁群算法做路径规划的运行策略 3.讲解ACO进行函数优化时策略

abc1234abcdefg的博客 1万+

Python中蚁群算法Ant Colony Optimization的设计与实现

在开发蚁群算法的过程中,定义问题结构是一个关键步骤。准确地将实际问题转化为算法能够理解的模型是成功实施算法的前提。本章节将详细介绍如何在Python中构建问题模型,并选择合适的数据结构来支撑算法运行。目标函数是衡量解好坏的标准,其定义依赖于具体问题。在Python中定义目标函数,需要将其表达为一个可计算的函数,该函数接受一定数量的参数(通常是决策变量),并返回一个表示目标值(如成本、利润或适应度)的数值。# 示例:定义一个简单的二次目标函数# 这里solution为决策变量数组。

weixin_31591833的博客 1160

蚁群算法Python实现

蚁群算法Python实现

abc1234564546的博客 6334

蚁群优化 (ACO) 算法和模拟退火优化 (SAO) 算法两种优化方法进行建模附matlab代码.zip

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

【SLAM论文笔记】SplaTAM论文小结

参考方法有ORB-SLAM3、Point-SLAM、NICE-SLAM、Kintinuous、ElasticFusion,测试数据集有ScanNet++、Replica、TUM-RGBD、Orig-ScanNet,SpaTAM并未在全部对比均为第一,表现最佳的是在ScanNet++、Replica,ScanNet++上SplaTAM方法位姿精度比第2名ORB-SLAM3高两个数量级,在TUM。上无稀疏SLAM结果,NICE-SLAM与Point-SLAM占优。SplaTAM基本做到了SOTA。

持之以恒 1011

Python实现VRP常见求解算法——蚁群算法(ACO)

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

Better.C的博客 8844

随机截距交叉滞后模型RI-CLPM:原理、Mplus实现与结果解读

纵向面板数据分析中,传统交叉滞后模型(CLPM)常被用于探索变量间的时序关系,但其估计结果可能混淆了个体间稳定差异与个体内短期波动,导致交叉滞后路径出现偏差。随机截距交叉滞后模型(RI-CLPM)通过引入随机截距因子,将个体特质层面的差异与个体内动态过程分离,从而提供更纯净的个体内效应估计。该模型在组织心理学、发展心理学、成瘾行为等研究领域迅速普及,并成为顶级期刊审稿时常见的稳健性检验要求。本文从原理出发,系统讲解RI-CLPM的模型构建、识别条件、Mplus实操代码、输出解读及常见陷阱,并结合协变量处理、

weixin_33525298的博客 279

【进阶二】Python实现VRPTW常见求解算法——蚁群算法(ACO)

基于python语言,实现经典蚁群算法(ACO)对带有时间窗的车辆路径规划问题(VRPTW )进行求解。

Better.C的博客 3895

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712

LT8711UX是一款高性能C/DP1.2型至HDMI2.0转换器,用于将USB Type-C源或DP1.2源连接到HDMI2.0接收器。该LT8711UX集成了一个DP1.2兼容的接收器,和一个HDMI2.0兼容的发射器。此外,还包括两个CC控制器,用于CC通信,以实现DP Alt模式和功率传输功能,一个用于上游Type-C端口和另一个用于下游端口。

weixin_63518914的博客 1641

Kappa函数:测量一致性并计算置信区间的R语言包

Kappa函数是一种常用的统计量,用于衡量两个评估者之间的一致性。在R语言中,有一个名为"vcd"的包提供了计算Kappa函数以及相应的置信区间的功能。本文将介绍如何使用"vcd"包来计算Kappa函数的值,并进一步计算置信区间。Kappa函数的值介于-1和1之间,值越接近1表示评估者之间的一致性越高,值越接近-1表示评估者之间的一致性越低,值接近0表示评估者之间的一致性接近于随机。通过以上步骤,我们成功地使用R语言中的"vcd"包计算了Kappa函数的值和置信区间。接下来,我们可以使用"vcd"包中的。

2301_79331230的博客 1876

4. 【进阶】Python实现VRP常见求解算法——蚁群算法(ACO)

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

qq_36744449的博客 2395

使用Simulink对氢燃料电池与锂电池的混合储能系统进行建模

本文介绍了基于Simulink的氢燃料电池与锂电池混合储能系统建模与协同控制方法。系统通过氢燃料电池提供稳定能源,锂电池实现快速响应,结合DC-DC变换器和负载管理器实现动态调控。详细阐述了从模型创建、关键模块配置到控制器设计的完整流程,重点说明了功率分配算法和充放电控制策略的实现。通过仿真分析验证了系统在不同负载条件下的性能表现,包括响应速度、工作效率和稳定性等指标。该方案为新能源混合储能系统的设计与优化提供了实用指导,有助于提升系统可靠性和延长电池寿命。

amy_mhd的博客 315

Python实现蚁群算法求解VRP问题(附完整代码)

Python实现蚁群算法求解VRP问题(附完整代码)

corn1949的博客 1900

真格量化——GFTD策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import numpy as np import math #开始时间,用于初始化一些参数 def OnStart(context) : print "I\'m starting..." #设置全局变量 g.signalcount = 0 g.signal_list = [] g.buysignal = 0 .

qq_26742269的博客 1285

YOLOv13优化Faster_Block:卷积(Partial Convolution)、多层感知机(MLP)结构和残差连接

Faster_Block 代表了现代深度学习中效率与性能平衡的一个典型案例。它通过部分卷积技术巧妙地减少了计算开销,同时通过精心设计的架构保持了强大的特征学习能力。这种设计思想对于移动端部署、实时应用和大规模模型训练都具有重要意义。 未来的发展方向可能包括更智能的动态分割策略、与新兴硬件的深度适配,以及与其他先进技术(如自注意力机制、神经架构搜索等)的结合。Faster_Block 的成功展示了在深度学习领域,创新往往来自于对问题本质的深刻理解和巧妙的工程实现。

FJN110的博客 429

【进阶六】Python实现SDVRPTW常见求解算法——蚁群算法(ACO)

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

Better.C的博客 1384

国自然基金申请书撰写新思路:如何合理利用AI提高本子竞争力?

最后给大家推荐的400多所高校教师都在用的AI平台——高级学术版专业应用平台,集成了国际主流学术应用,以及ChatGPT、Claude、Gemini、Grok等Al大模型的高级版本平台,还有,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。创新点、技术路线、前期基础,但是我们也可以把写好的初稿交给AI,让它扮演资深研究员,帮我们精炼表述、优化段落结构,并揪出可能被评审追问的逻辑漏洞。,我们需要的是让它帮我们理清楚思路,而不是让它替我们完成内容。

智能AI让学术科研更容易 665

4. Python实现VRP常见求解算法——蚁群算法(ACO)

参考笔记 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的博客 1692

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

温度PID控制PLC程序

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

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——蚁群算法(ACO)

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

Better.C的博客 1154

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

蚁群算法(ACO)解决旅行商(TSP)问题的python实现

蚁群算法在组合优化问题中表现出色,尤其是在动态变化的问题环境中。它已被应用于各种实际问题,如物流配送、网络路由优化、图像处理等领域。优势与局限性优势:蚁群算法具有强大的全局搜索能力,能够在大规模搜索空间中有效找到解决方案;同时具备良好的并行性和适应性。局限性:蚁群算法可能需要较多的迭代次数才能收敛,且有可能陷入局部最优解。此外,算法参数的设置对结果影响较大,需要根据具体问题仔细调整。

qq_49370210的博客 2638

探索群体智慧:蚁群算法(ACO)从原理到实践——python实现

蚁群算法通过模拟简单的个体行为涌现出复杂的群体智能,为解决复杂的组合优化问题提供了一种强大而灵活的工具。其分布式、自组织的特性使其具有很强的鲁棒性和扩展性。

Rick_Theseusr的博客 1050

蚁群算法求解VRPTW问题

蚁群算法求解VRPTW问题

2301_79574522的博客 1668

蚁群算法(Ant Colony Optimization, ACO)

蚁群算法(Ant Colony Optimization, ACO)介绍。

欢迎学习交流! 2142

3种改进蚁群算法对比:求解冷链VRP问题,收敛速度提升40%

本文对比了三种改进蚁群算法(混合A*-蚁群算法、知识型精英蚁群算法和动态信息素蚁群系统)在冷链物流路径优化(VRP)中的应用。通过Python实现和标准数据集测试,这些算法将收敛速度提升40%以上,有效解决了传统方法收敛慢和局部最优问题。实验结果显示,改进算法在成本、碳排放和计算时间上均有显著优化。

an4455的博客 347

蚁群算法(ACO)实战:从原理到Python代码实现

本文深入解析了蚁群算法(ACO)的核心原理,即模拟蚂蚁觅食行为,通过信息素正反馈机制解决组合优化问题。文章提供了从参数解析到Python代码实现的完整实战教程,以旅行商问题(TSP)为例,手把手指导读者完成算法部署与可视化,并探讨了算法优化技巧与更广泛的应用场景。

nn3456的博客 746
上一篇: 【改进篇】Python实现VRP常见求解算法——禁忌搜索算法(TS)
下一篇: plot4gmns:面向通用建模网络范式(GMNS)的快速可视化【v0.1.1】
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论 7
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值