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

cvrp-python:基于遗传算法的车辆容量限制问题(CVRP) CVRP 使用遗传算法的车辆容量限制问题(CVRP) 立即下载

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

往期优质资源

1. 适用场景

  • 求解MDCVRP 问题
  • 车辆类型单一
  • 车辆容量不小于需求节点最大需求
  • 多车辆基地
  • 各车场车辆总数满足实际需求

2. 求解效果

(1)收敛曲线
在这里插入图片描述
(2)车辆路径
在这里插入图片描述

3. 代码分析

车俩路径规划问题按照车场数量可分为单一车场路径规划问题和多车场路径规划问题。针对单一车场条件下仅考虑车辆容量限制的路径规划问题前边帖子中已实现ACO算法求解,本文采用ACO算法对多车场条件下仅考虑车辆容量限制的路径规划问题进行求解。为了保持代码的延续性以及求解思路的一致性,这里对上述ACO算法代码进行如下主要修正实现MDCVRP问题的求解。

  • Model数据结构类中采用demand_dict属性存储需求节点集合,depot_dict属性储存车场节点集合,demand_id_list属性储存需求节点id集合,distance_matrix属性储存任意节点间的欧式距离;
  • Node数据结构类中去掉node_seq属性,增加depot_capacity属性记录车场的车队限制
  • splitRoutes函数中分割车辆路径时分配最近车场作为其车辆提供基地(满足车场车队数量限制)

4. 数据格式

以csv文件储存数据,其中demand.csv文件记录需求节点数据,共包含需求节点id,需求节点横坐标,需求节点纵坐标,需求量;depot.csv文件记录车场节点数据,共包含车场id,车场横坐标,车场纵坐标,车队数量。需要注意的是:需求节点id应为整数,车场节点id任意,但不可与需求节点id重复。 可参考github主页相关文件。

5. 分步实现

(1)数据结构
为便于数据处理,定义Sol()类,Node()类,Model()类,其属性如下表:

  • Sol()类,表示一个可行解
属性描述
node_id_list需求节点id有序排列集合,对应TSP的解
obj优化目标值
routes车辆路径集合,对应CVRP的解
  • Node()类,表示一个网络节点
属性描述
id物理节点id,可选
x_coord物理节点x坐标
y_coord物理节点y坐标
demand物理节点需求
depot_capacity车辆基地车队规模
  • Model()类,存储算法参数
属性描述
best_sol全局最优解,值类型为Sol()
demand_dict需求节点集合(字典),值类型为Node()
depot_dict车场节点集合(字典),值类型为Node()
demand_id_list需求节点id集合
sol_list可行解集合,值类型为Sol()
opt_type优化目标类型,0:最小车辆数,1:最小行驶距离
vehicle_cap车辆容量
distance_matrix网络弧距离
popsize蚁群规模
alpha信息启发式因子
beta期望启发式因子
Q信息素总量
rho信息素挥发系数
tau网络弧信息素
tau0路径初始信息素

(2)文件读取

def readCsvFile(demand_file,depot_file,model):
    with open(demand_file,'r') as f:
        demand_reader=csv.DictReader(f)
        for row in demand_reader:
            node = Node()
            node.id = int(row['id'])
            node.x_coord = float(row['x_coord'])
            node.y_coord = float(row['y_coord'])
            node.demand = float(row['demand'])
            model.demand_dict[node.id] = node
            model.demand_id_list.append(node.id)

    with open(depot_file,'r') as f:
        depot_reader=csv.DictReader(f)
        for row in depot_reader:
            node = Node()
            node.id = row['id']
            node.x_coord=float(row['x_coord'])
            node.y_coord=float(row['y_coord'])
            node.depot_capacity=float(row['capacity'])
            model.depot_dict[node.id] = node

(3)计算距离矩阵、初始化路径信息素

def initDistanceTau(model):
    for i in range(len(model.demand_id_list)):
        from_node_id = model.demand_id_list[i]
        for j in range(i+1,len(model.demand_id_list)):
            to_node_id=model.demand_id_list[j]
            dist=math.sqrt( (model.demand_dict[from_node_id].x_coord-model.demand_dict[to_node_id].x_coord)**2
                            +(model.demand_dict[from_node_id].y_coord-model.demand_dict[to_node_id].y_coord)**2)
            model.distance_matrix[from_node_id,to_node_id]=dist
            model.distance_matrix[to_node_id,from_node_id]=dist
            model.tau[from_node_id,to_node_id]=model.tau0
            model.tau[to_node_id,from_node_id]=model.tau0
        for _,depot in model.depot_dict.items():
            dist = math.sqrt((model.demand_dict[from_node_id].x_coord - depot.x_coord) ** 2
                             + (model.demand_dict[from_node_id].y_coord -depot.y_coord)**2)
            model.distance_matrix[from_node_id, depot.id] = dist
            model.distance_matrix[depot.id, from_node_id] = dist

(4)目标值计算

适应度计算依赖" splitRoutes “函数对TSP可行解分割得到车辆行驶路线和所需车辆数,在得到各车辆行驶路线后调用” selectDepot “函数,在满足车场车队规模条件下分配最近车场,” calDistance "函数计算行驶距离。

def selectDepot(route,depot_dict,model):
    min_in_out_distance=float('inf')
    index=None
    for _,depot in depot_dict.items():
        if depot.depot_capacity>0:
            in_out_distance=model.distance_matrix[depot.id,route[0]]+model.distance_matrix[route[-1],depot.id]
            if in_out_distance<min_in_out_distance:
                index=depot.id
                min_in_out_distance=in_out_distance
    if index is None:
        print("there is no vehicle to dispatch")
    route.insert(0,index)
    route.append(index)
    depot_dict[index].depot_capacity=depot_dict[index].depot_capacity-1
    return route,depot_dict

def splitRoutes(node_id_list,model):
    num_vehicle = 0
    vehicle_routes = []
    route = []
    remained_cap = model.vehicle_cap
    depot_dict=copy.deepcopy(model.depot_dict)
    for node_id in node_id_list:
        if remained_cap - model.demand_dict[node_id].demand >= 0:
            route.append(node_id)
            remained_cap = remained_cap - model.demand_dict[node_id].demand
        else:
            route,depot_dict=selectDepot(route,depot_dict,model)
            vehicle_routes.append(route)
            route = [node_id]
            num_vehicle = num_vehicle + 1
            remained_cap =model.vehicle_cap - model.demand_dict[node_id].demand

    route, depot_dict = selectDepot(route, depot_dict, model)
    vehicle_routes.append(route)

    return num_vehicle,vehicle_routes

def calRouteDistance(route,model):
    distance=0
    for i in range(len(route)-1):
        from_node=route[i]
        to_node=route[i+1]
        distance +=model.distance_matrix[from_node,to_node]
    return distance

def calObj(node_id_list,model):
    num_vehicle, vehicle_routes = splitRoutes(node_id_list, model)
    if model.opt_type==0:
        return num_vehicle,vehicle_routes
    else:
        distance = 0
        for route in vehicle_routes:
            distance += calRouteDistance(route, model)
        return distance,vehicle_routes

(5)位置更新

在更新蚂蚁位置时,调用 " searchNextNode "函数,依据网络弧信息素浓度及启发式信息搜索蚂蚁下一个可能访问的节点。

def movePosition(model):
    sol_list=[]
    local_sol=Sol()
    local_sol.obj=float('inf')
    for k in range(model.popsize):
        #随机初始化蚂蚁为止
        nodes_id=[int(random.randint(0,len(model.demand_id_list)-1))]
        all_nodes_id=copy.deepcopy(model.demand_id_list)
        all_nodes_id.remove(nodes_id[-1])
        #确定下一个访问节点
        while len(all_nodes_id)>0:
            next_node_no=searchNextNode(model,nodes_id[-1],all_nodes_id)
            nodes_id.append(next_node_no)
            all_nodes_id.remove(next_node_no)
        sol=Sol()
        sol.node_id_list=nodes_id
        sol.obj,sol.routes=calObj(nodes_id,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_id,SE_List):
    prob=np.zeros(len(SE_List))
    for i,node_id in enumerate(SE_List):
        eta=1/model.distance_matrix[current_node_id,node_id]
        tau=model.tau[current_node_id,node_id]
        prob[i]=((eta**model.alpha)*(tau**model.beta))
    #采用轮盘法选择下一个访问节点
    cumsumprob=(prob/sum(prob)).cumsum()
    cumsumprob -= np.random.rand()
    next_node_id= SE_List[list(cumsumprob > 0).index(True)]
    return next_node_id

(6)信息素更新

这里采用蚁周模型对网络弧信息素进行更新,在具体更新时可根据可行解的node_id_list属性(TSP问题的解)对所经过的网络弧信息素进行更新。

def upateTau(model):
    rho=model.rho
    for k in model.tau.keys():
        model.tau[k]=(1-rho)*model.tau[k]
    #根据解的node_id_list属性更新路径信息素(TSP问题的解)
    for sol in model.sol_list:
        nodes_id=sol.node_id_list
        for i in range(len(nodes_id)-1):
            from_node_id=nodes_id[i]
            to_node_id=nodes_id[i+1]
            model.tau[from_node_id,to_node_id]+=model.Q/sol.obj

(7)绘制收敛曲线

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

(8)绘制车辆路线

def outPut(model):
    work=xlsxwriter.Workbook('result.xlsx')
    worksheet=work.add_worksheet()
    worksheet.write(0,0,'opt_type')
    worksheet.write(1,0,'obj')
    if model.opt_type==0:
        worksheet.write(0,1,'number of vehicles')
    else:
        worksheet.write(0, 1, 'drive distance of vehicles')
    worksheet.write(1,1,model.best_sol.obj)
    for row,route in enumerate(model.best_sol.routes):
        worksheet.write(row+2,0,'v'+str(row+1))
        r=[str(i)for i in route]
        worksheet.write(row+2,1, '-'.join(r))
    work.close()

(9)输出结果

def plotRoutes(model):
    for route in model.best_sol.routes:
        x_coord=[model.depot_dict[route[0]].x_coord]
        y_coord=[model.depot_dict[route[0]].y_coord]
        for node_id in route[1:-1]:
            x_coord.append(model.demand_dict[node_id].x_coord)
            y_coord.append(model.demand_dict[node_id].y_coord)
        x_coord.append(model.depot_dict[route[-1]].x_coord)
        y_coord.append(model.depot_dict[route[-1]].y_coord)
        plt.grid()
        if route[0]=='d1':
            plt.plot(x_coord,y_coord,marker='o',color='black',linewidth=0.5,markersize=5)
        elif route[0]=='d2':
            plt.plot(x_coord,y_coord,marker='o',color='orange',linewidth=0.5,markersize=5)
        else:
            plt.plot(x_coord,y_coord,marker='o',color='b',linewidth=0.5,markersize=5)
    plt.xlabel('x_coord')
    plt.ylabel('y_coord')
    plt.show()

(10)主函数

def run(demand_file,depot_file,Q,tau0,alpha,beta,rho,epochs,v_cap,opt_type,popsize):
    """
    :param demand_file: demand file path
    :param depot_file: depot file path
    :param Q:信息素总量
    :param tau0: 路径信息素初始值
    :param alpha:信息启发式因子
    :param beta:期望启发式因子
    :param rho:信息挥发因子
    :param epochs:迭代次数
    :param v_cap:车辆容量
    :param opt_type:优化类型:0:最小化车辆数,1:最小化行驶距离
    :param popsize:蚁群规模
    :return:
    """
    model=Model()
    model.vehicle_cap=v_cap
    model.opt_type=opt_type
    model.alpha=alpha
    model.beta=beta
    model.Q=Q
    model.tau0=tau0
    model.rho=rho
    model.popsize=popsize
    sol=Sol()
    sol.obj=float('inf')
    model.best_sol=sol
    history_best_obj = []
    readCsvFile(demand_file,depot_file,model)
    initDistanceTau(model)
    for ep in range(epochs):
        movePosition(model)
        upateTau(model)
        history_best_obj.append(model.best_sol.obj)
        print("%s/%s, best obj: %s" % (ep,epochs, model.best_sol.obj))
    plotObj(history_best_obj)
    plotRoutes(model)
    outPut(model)

6. 完整代码

代码和数据文件可获取:

https://download.youkuaiyun.com/download/python_n/37365542

【VRP问题】基于模拟退火算法求解CVRP问题.md 【VRP问题】基于模拟退火求解CVRP问题 立即下载

相关推荐

蚁群算法代码python 详解版

蚁群算法代码python 详解版 博文链接:https://blog.youkuaiyun.com/quinn1994/article/details/80324308

蚁群算法(ACO)求解CVRP问题

蚁群算法求解CVRP问题(python)

m0_60805357的博客 1298

基于车辆路径问题opt优化后的蚁群算法_22个城市的CVRP问题_cvrp_改进算法_改进蚁群_ANTCOLONYCVRP_

改进后的CVRP问题的蚁群算法的实现代码

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

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理(北京师范大学朱文泉教授)课程各章博文笔记汇总,及各章节思维导图

甜子yu的博客 2623

10X Genomics单细胞数据分析实战:从FASTQ到UMAP可视化的完整流程

本文详细介绍了10X Genomics单细胞数据分析的完整流程,从FASTQ原始数据处理到UMAP可视化。通过Seurat工具包实现数据质量控制、标准化、降维聚类和细胞注释,特别适合生物信息学新手学习。文章包含可复现的代码示例和常见问题解决方案,帮助研究者快速掌握单细胞测序数据分析的核心技术。

weixin_30952535的博客 535

蚁群算法及其应用

产生背景 20世纪90年代初,意大利科学家Marco Dorigo等受蚂蚁觅食行为的启发,提出蚁群算法(Ant Colony Optimization,ACO)。 一种应用于组合优化问题的启发式搜索算法。 在解决离散组合优化方面具有良好的性能。 基本思想 信息素跟踪: 按照一定的概率沿着信息素较强的路径觅食。 信息素遗留: 会在走过的路上会释放信息素,使得在一定的范围内的其他蚂蚁能够觉察到并由此影响它们的行为。 (1)环境: 有障碍物、有其他蚂蚁、有信息素。 (2)觅食规则: 范围内寻找是否有食物,否则看

学习日常分享 7738

STM32 SPI驱动TFT LCD实战:时序配置与硬件协同

SPI(串行外设接口)是一种高速、全双工、同步串行通信协议,广泛应用于微控制器与显示模组等外设的数据交互。其核心依赖时钟极性(CPOL)与时钟相位(CPHA)组合定义的四种工作模式,直接影响数据采样可靠性;而片选(NSS)与MOSI/SCLK等信号的硬件映射,则决定了多设备共总线下的通信稳定性。在TFT LCD驱动场景中,SPI凭借低开销、高吞吐优势成为主流选择,尤其适配ST7789、ILI9341等集成显示控制器的模块。本文聚焦STM32L系列MCU通过SPI2驱动1.3寸LCD的完整链路,涵盖Mode

php55的博客 1211

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

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

qq_36744449的博客 2395

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1067

软件自动化测试脚本如何编写,编写自动化测试脚本的几点注意事项

我们需要自动化测试脚本的原因:1、验收测试是一项非常复杂和费力的被用来确保软件质量的环节。它的目的就是使软件能得到充分运行并且能使其符合原始需求。2、测试的目的无非就是满足了两个结果:测试通过或测试不通过。为了能实现每个测试结果,必须要明确每个测试用例。并且对于整个系统而言在合同中必须定义测试用例的失败标准,而且这个失败标准数必须是可接受的。3、测试用例的通过条件必须有一个清晰的标准,标准可以被定...

weixin_39575775的博客 2251

多车场路径优化丨遗传算法求解MDCVRP问题

python语言编写遗传算法求解多车场有载重约束的路径优化问题MDCVRP

喜欢玩算法的老学长,致力于运筹优化算法的研究 3764

深入解析璞致PZ-ZU47DR RFSoC核心板:硬件架构与多通道ADC/DAC设计实战

本文深入解析璞致PZ-ZU47DR RFSoC核心板的硬件架构与多通道ADC/DAC设计实战。作为Xilinx Zynq UltraScale+ RFSoC系列的代表产品,PZ-ZU47DR集成了8通道5GSPS ADC和8通道9.85GSPS DAC,支持直接射频采样,大幅简化射频链路设计。文章详细介绍了其技术优势、设计挑战及实战技巧,为5G小基站、毫米波等应用场景提供高效解决方案。

meat5的博客 842

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

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

Better.C的博客 3895

勇闯dify v1.0.0之设置模型供应商。解决:Reached maximum retries (3) for URL https://marketplace.dify.ai/

朋友们,大家好,今天带大家来勇闯dify v1.0.0。为什么叫勇闯呢?我就这么说吧,本来我昨天就想带大家勇闯v1.0.0的。但是dify的marketplace访问不了。公司的网和手机热点都试了,就是访问不了。我们连个模型都没有,还勇闯个球啊,对吧,就搁置了。今天,我赶紧看看这个marketplace好了没。一看,可以了。赶紧写下这篇博客,帮助同志们走出困境。

xiezhipu的博客 4617

【OpenClaw从入门到精通】第48篇:企业“养虾”合规手册——审批备案+专网隔离+全流程管控(2026企业版)

随着OpenClaw在企业场景的规模化应用,“无审批部署、无备案运行、无隔离防护”已成为安全事件的主要诱因。本文基于启明星辰《OpenClaw类智能应用安全指引V0.1》,结合金融、能源行业头部企业落地实践,构建“审批-评估-备案-管控”全流程合规框架。核心内容包括四步审批备案流程、专网隔离部署规范、3套可直接复用的合规文档模板(使用申请单、安全评估报告、备案登记表),以及个人使用备案简化方案。通过本文,企业可建立“有据可依、有章可循”的OpenClaw管理体系,实现“专网部署、数据隔离、最小权限、全程监控

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 462

智能算法系列之蚁群算法(详细补充版)

本篇是[智能算法(Python复现)]专栏的第六篇文章,主要是对蚁群算法的补充。在上篇博客中对蚁群算法的原理进行了简单的介绍,并用`python`实现蚁群算法在求函数极值方面的应用,但仔细研读一番发现重点没有突出来,而且与原始`TSP`问题中的蚁群算法又较大区别,感觉只涉及到蚁群算法的外壳,并没有触及灵魂。因此,在本篇中对蚁群算法在求函数极值方面的应用进行一个详细补充,并尽可能的触及蚁群算法的灵魂。

夏小悠的博客 1018

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

Better.C的博客 2063

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

多车场路径优化丨复现论文:改进蚁群算法求解MDCVRP问题

多车场车辆路径问题可描述为:多个配送中心、每个中心有若干配送车辆、存在若干需求点、车辆从配送中心往需求点进行服务。文章是用概率矩阵轮盘赌选择每个需求点,初始信息素矩阵为103×103的矩阵,矩阵的值都是1,从某个需求点到任意需求点的概率都相等。2、 用车的载重去匹配需求量,载重约束下多个可行点轮盘赌选择一个,如果没有可行点,车回到配送中心,换下一辆车;因为100个点需求量接近2000,假设每个车场有10辆车,共30辆车,每量车载重约束是70,代码有介绍。(2)配送车辆从配送中心出发,最终返回配送中心。

喜欢玩算法的老学长,致力于运筹优化算法的研究 3263

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

GitHub上疯传数万次的蚂蚁内部绝密分布式高可用算法笔记太香了

GitHub上疯传数万次的蚂蚁内部绝密分布式高可用算法笔记太香了!!这份笔记包含10章的内容,每一章都分为若干小节,每个小节里面都包含更多细节化的内容。

公众号:该用户快成仙了 234

蚁群算法

最近要数学建模所以查了一些算法。以下为转载内容 这是原创博客链接https://blog.youkuaiyun.com/fanxin_i/article/details/80380733 # -*- coding: utf-8 -*- import random import copy import time import sys import math import tkinter # //GUI模块 i...

巨星不易,努力前行 508

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

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

qq_36744449的博客 1404

论文复现详解丨多车辆路径优化问题:粒子群+模拟退火算法求解

多车场车辆路径问题 (MDVRP)是基本车辆路径问题(VRP)的扩展,指的是有数个车场同时对多个用户进行服务,各用户有一定的货物需求,每个车场都可提供货物,并有车队负责执行运输任务,要求对各车场的车辆和行驶路线进行适当的安排,在保证满足各用户的需求的前提下,使总的运输成本最低。step1:遍历该车场的所有车辆,如果至少有一辆车的剩余载重满足该需求点,计算对应车辆的最后一个点到该需求点的距离,再加上该需求点到对应回归车场的距离,转入步骤3,如果没有车辆的剩余载重满足,转入step2。交换两个位置的编码。

喜欢玩算法的老学长,致力于运筹优化算法的研究 4564

CVRP建模与求解-基于粒子群算法(python实现)

本文为单配送中心、单车型、车辆封闭、非满载、需求不可拆分的VRP场景建立数学模型,并设计粒子群算法进行求解。

_2312 1万+
上一篇: 【进阶一】Python实现MDCVRP常见求解算法——禁忌搜索(TS)
下一篇: 【进阶一】Python实现MDCVRP常见求解算法——离散粒子群(DPSO)
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论 24
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值