【进阶六】Python实现SDVRPTW常见求解算法——差分进化算法(DE)

遗传算法求解时间窗车辆路径规划问题(附python代码) 本研究提出了一种基于遗传算法的车辆路径规划(VRP)问题求解框架,它能够有效地处理一系列复杂约束,包括软时间窗硬时间窗行驶距离限制车辆最大载重量多个配送中心的协调特定的配送顺序以及多种车型的选择。该框架的一个关键特点在于其与其他算法的结合潜力,特别是可以快速与模拟退火、领域搜索等算法快速结合,以便开发出混合优化算法,这一能力将进一步加强搜索效率和解的质量。本文主要介绍算法框架的编码、解码以及交叉变异等内容,并以一个简单实例论证框架的可行性。车辆路径问题(VRP)涉及服务一组客户,每个客户都有某些货物的需求。 阅读详情

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

往期优质资源


经过一年多的创作,目前已经成熟的代码列举如下,如有需求可私信联系,表明需要的 **问题与算法**,原创不宜,有偿获取。
VRP问题GAACOALNSDEDPSOQDPSOTSSA
CVRP√√√√√√√√
VRPTW√√√√√√√√
MDVRP√√√√√√√√
MDHVRP√√√√√√√√
MDHVRPTW√√√√√√√√
SDVRP√√√√√√√√
SDVRPTW√√√√

1. 适用场景

  • 求解SDVRPTW
  • 车辆类型单一
  • 车辆容量小于部分需求节点需求
  • 单一车辆基地
  • 带硬时间窗

2. 代码调整


2.1 需求拆分


与SDVRP问题相比,SDVRPTW问题不仅允许客户需求大于车辆载重,而且考虑了客户节点的时间窗约束。为了使得每个客户的需求得到满足,必须派遣一辆或多辆车辆在规定时间窗内对客户进行服务。对于需求节点的拆分,这里依然采取先验拆分策略,本文采用文献[1]提出的先验分割策略,表述如下:

(1)20/10/5/1拆分规则

  • m20 =max{ m ∈ Z + ∪ { 0 } ∣ 0.20 Q m < = D i m\in Z^+ \cup \{0\} | 0.20Qm <= D_i m∈Z+∪{0}∣0.20Qm<=Di​ }
  • m10 =max{ m ∈ Z + ∪ { 0 } ∣ 0.10 Q m < = D i − 0.20 Q m 20   m\in Z^+ \cup \{0\} | 0.10Qm <= D_i-0.20Qm_{20}~ m∈Z+∪{0}∣0.10Qm<=Di​−0.20Qm20​  }
  • m5 =max{ m ∈ Z + ∪ { 0 } ∣ 0.05 Q m < = D i − 0.20 Q m 20 − 0.10 Q m 10 m\in Z^+ \cup \{0\} | 0.05Qm <= D_i-0.20Qm_{20}-0.10Qm_{10} m∈Z+∪{0}∣0.05Qm<=Di​−0.20Qm20​−0.10Qm10​ }
  • m1 =max{ m ∈ Z + ∪ { 0 } ∣ 0.01 Q m < = D i − 0.20 Q m 20 − 0.10 Q m 10 − 0.05 Q m 5 m\in Z^+ \cup \{0\} | 0.01Qm <= D_i-0.20Qm_{20}-0.10Qm_{10}-0.05Qm_{5} m∈Z+∪{0}∣0.01Qm<=Di​−0.20Qm20​−0.10Qm10​−0.05Qm5​ }

(2)25/10/5/1拆分规则

  • m25 =max{ m ∈ Z + ∪ { 0 } ∣ 0.25 Q m < = D i m\in Z^+ \cup \{0\} | 0.25Qm <= D_i m∈Z+∪{0}∣0.25Qm<=Di​ }
  • m10 =max{ m ∈ Z + ∪ { 0 } ∣ 0.10 Q m < = D i − 0.25 Q m 25   m\in Z^+ \cup \{0\} | 0.10Qm <= D_i-0.25Qm_{25}~ m∈Z+∪{0}∣0.10Qm<=Di​−0.25Qm25​  }
  • m5 =max{ m ∈ Z + ∪ { 0 } ∣ 0.05 Q m < = D i − 0.25 Q m 25 − 0.10 Q m 10 m\in Z^+ \cup \{0\} | 0.05Qm <= D_i-0.25Qm_{25}-0.10Qm_{10} m∈Z+∪{0}∣0.05Qm<=Di​−0.25Qm25​−0.10Qm10​ }
  • m1 =max{ m ∈ Z + ∪ { 0 } ∣ 0.01 Q m < = D i − 0.25 Q m 25 − 0.10 Q m 10 − 0.05 Q m 5 m\in Z^+ \cup \{0\} | 0.01Qm <= D_i-0.25Qm_{25}-0.10Qm_{10}-0.05Qm_{5} m∈Z+∪{0}∣0.01Qm<=Di​−0.25Qm25​−0.10Qm10​−0.05Qm5​ }

在实现过程中,对于需求超过车辆容量的客户必须进行需求拆分,而对于未超过车辆容量的客户可以拆分也可以不拆分,这里设置了参数比例进行限制。

2.2 需求拆分后的服务时长取值问题


节点的服务时长会影响车辆的行进时间,进而会影响与节点时间窗的匹配问题。一般来说,节点的服务时长与需求量成正比关系,在进行节点需求拆分后,新节点的需求量降低,其服务时长理应也降低。但从标准数据集来看,各需求节点的服务时长均采用同一数值。因此本文在代码实现过程中也采用固定值,不考虑新节点服务时长的变化。当然,如有需要,也可以设置单位货物的服务时长,根据拆分后节点的具体需求量设置相应的服务时长。


3. 求解结果


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

(2)车辆路径

在这里插入图片描述

(3)输出内容

在这里插入图片描述


4. 代码片段


(1)数据结构

import math
import random
import numpy as np
import copy
import xlsxwriter
import matplotlib.pyplot as plt
import csv
import time
# 数据结构:解
class Sol():
    def __init__(self):
        self.obj=None # 目标函数值
        self.node_no_seq=[] # 解的编码
        self.route_list=[] # 解的解码
        self.timetable_list=[] # 车辆访问各点的时间
        self.route_distance_list = None
# 数据结构:需求节点
class Node():
    def __init__(self):
        self.id=0 # 节点id
        self.x_coord=0 # 节点平面横坐标
        self.y_coord=0  # 节点平面纵坐标
        self.demand=0 # 节点需求
        self.start_time=0 # 节点开始服务时间
        self.end_time=1440 # 节点结束服务时间
        self.service_time=0 # 单次服务时长
        self.vehicle_speed = 0 # 行驶速度
# 数据结构:车场节点
class Depot():
    def __init__(self):
        self.id=0 # 节点id
        self.x_coord=0 # 节点平面横坐标
        self.y_coord=0  # 节点平面纵坐标
        self.start_time=0 # 节点开始服务时间
        self.end_time=1440 # 节点结束服务时间
        self.v_speed = 0 # 行驶速度
        self.v_cap = 80 # 车辆容量
# 数据结构:全局参数
class Model():
    def __init__(self):
        self.best_sol=None # 全局最优解
        self.sol_list=[] # 解的集合
        self.demand_dict = {}  # 需求节点集合
        self.depot = None  # 车场节点集合
        self.demand_id_list = [] # 需求节点id集合
        self.distance_matrix = {}  # 距离矩阵
        self.time_matrix = {}  # 时间矩阵
        self.number_of_demands = 0 # 需求点数量
        self.demand_id_list_ = []  # 经先验需求分割后的节点集合
        self.demand_dict_ = {}  # 需求分割后的节点需求集合
        self.distance_matrix_ = {}  # 原始节点id间的距离矩阵
        self.time_matrix_ = {}  # 原始节点id间的时间矩阵
        self.mapping = {}  # 需求分割前后的节点对应关系
        self.split_rate = 0.5 # 控制需求分割的比例(需求超出车辆容量的除外)
        self.popsize = 100 # 种群规模
        self.Cr=0.5 # 差分交叉概率
        self.F=0.5 # 差分变异概率

(2)距离矩阵

# 初始化参数:计算距离矩阵时间矩阵
def calDistanceTimeMatrix(model):
    for i in range(len(model.demand_id_list)):
        from_node_id = model.demand_id_list[i]
        for j in range(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.time_matrix[from_node_id,to_node_id] = math.ceil(dist/model.depot.v_speed)
        dist = math.sqrt((model.demand_dict[from_node_id].x_coord - model.depot.x_coord) ** 2 +
                         (model.demand_dict[from_node_id].y_coord - model.depot.y_coord) ** 2)
        model.distance_matrix[from_node_id, model.depot.id] = dist
        model.distance_matrix[model.depot.id, from_node_id] = dist
        model.time_matrix[from_node_id,model.depot.id] = math.ceil(dist/model.depot.v_speed)
        model.time_matrix[model.depot.id,from_node_id] = math.ceil(dist/model.depot.v_speed)

(3)邻域搜索

#初始解
def genInitialSol(model):
    node_no_seq=copy.deepcopy(model.demand_id_list_)
    for _ in range(model.popsize):
        random.shuffle(node_no_seq)
        sol=Sol()
        sol.node_no_seq=copy.deepcopy(node_no_seq)
        sol.timetable_list, sol.obj, sol.route_distance,sol.route_list=calObj(sol.node_no_seq,model)
        model.sol_list.append(sol)
        if sol.obj<model.best_sol.obj:
            model.best_sol=copy.deepcopy(sol)
#调整解的可行性
def adjustRoutes(node_no_seq,model):
    all_node_id_list=copy.deepcopy(model.demand_id_list_)
    repeat_node=[]
    for id,node_no in enumerate(node_no_seq):
        if node_no in all_node_id_list:
            all_node_id_list.remove(node_no)
        else:
            repeat_node.append(id)
    for i in range(len(repeat_node)):
        node_no_seq[repeat_node[i]]=all_node_id_list[i]
    return node_no_seq
#差分变异;变异策略:DE/rand/1/bin
def muSol(model,v1):
    x1=model.sol_list[v1].node_no_seq
    while True:
        v2=random.randint(0,model.popsize-1)
        if v2!=v1:
            break
    while True:
        v3=random.randint(0,model.popsize-1)
        if v3!=v2 and v3!=v1:
            break
    x2=model.sol_list[v2].node_no_seq
    x3=model.sol_list[v3].node_no_seq
    mu_x=[min(int(x1[i]+model.F*(x2[i]-x3[i])),model.number_of_demands-1) for i in range(model.number_of_demands) ]
    return mu_x
#差分交叉
def crossSol(model,vx,vy):
    cro_x=[]
    for i in range(model.number_of_demands):
        if random.random()<model.Cr:
            cro_x.append(vy[i])
        else:
            cro_x.append(vx[i])
    cro_x=adjustRoutes(cro_x,model)
    return cro_x

参考

【1】 A novel approach to solve the split delivery vehicle routing problem

深入解析:如何使用改进的PSO(粒子群优化)算法高效地解决VRPTW问题 - Python实现指南 PSO算法是一种群体智能优化技术,它是通过模拟鸟群觅食行为来找到问题的最优解的。在PSO中,每个“鸟”被称为一个“粒子”,每个粒子在搜索空间中代表一个可能的解。通过追踪每个粒子的最佳位置和整个群体的最佳位置,粒子可以更新其速度和位置,从而向最优解靠近。通过本文,我们深入探讨了如何使用改进的PSO算法来解决具有时间窗约束的车辆路径问题。我们介绍了VRPTW的基础知识,传统的PSO算法,以及如何对其进行改进以获得更好的性能。通过Python的实现,我们展示了如何将这些理论应用到实践中。 阅读详情

相关推荐

python实现VRPTW求解禁忌搜索算法

python实现VRPTW求解禁忌搜索+变邻域搜索代码,完美支持所罗门算例!

如何写代码实现VRP问题中车辆容量限制及时间窗要求(python)

卸货点1-10的时间限制理解如下:卸货点1要求在下午1点至下午4点配送,卸货点1要求的服务时间是半个小时;卸货点2要求在下午4点至下午6点配送,卸货点2要求的服务时间是1个小时,以此类推其他的卸货点的配送及服务时间限制。当首次配送的需求点为卸货点10时,最早到达时间要求是下午5点,配送中心开门是上午七点,关门是下午七点,两点之间的路径长度是160公里,车辆每小时的车速是40公里/小时,所以最佳的方案是不考虑先去卸货点10完成配送任务,因为车辆返回时赶不上配送中心的关门时间。从配送中心出发立即回到配送中心。

Logintern09的博客 777

基于遗传算法的具有时间窗的车辆路径问题解决方案的Python实现

基于遗传算法的具有时间窗的车辆路径问题解决方案的Python实现

带时间窗和载重约束的路径优化问题丨改进遗传算法:以算例RC108为例

有时间窗口和载重约束的路径优化问题

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

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

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

Android音频输出流实战:从AudioFlinger到HAL层的完整调用链解析

本文深入解析了Android音频输出流的完整调用链,从应用层的AudioTrack和AAudio API,到系统服务AudioFlinger的混音调度,最终抵达硬件抽象层(HAL)。文章结合实战经验,探讨了如何利用底层机制优化音频延迟、处理设备切换,并提供了性能调优与问题排查的具体方法,是开发高性能音频应用的实用指南。

weixin_29208327的博客 252

【进阶三】Python实现(MD)HFVRPTW常见求解算法——离散粒子群(DPSO)

基于python语言,实现经典遗传算法(GA)对多车场(Multi-depot)、异构固定车辆(heterogeneous fixed fleet)、带有服务时间窗(time window)等限制约束的车辆路径规划问题((MD)HFVRPTW)进行求解。 目录往期资料1. 适用场景2. 求解效果3. 代码分析4. 数据格式5. 分步实现6. 完整代码参考 往期资料 python实现6种智能算法求解CVRP问题 python实现7种智能算法求解MDVRP问题 python实现7种智能算法求解MDVRPT.

Better.C的博客 1539

无源定位入门(二):FDOA(2)信号模型和原理

信号模型 假设地面固定目标信号源位置为 ,有M架飞机随机分布在空中,并作匀速直线运动。时刻t的时候第i架飞机的位置为,飞行速率为 , 假设目标的信号中心频率为 ,电磁波的传播速度为 ,则此时每个飞机接收目标信号的频率为 以第1架飞机为参考基站,目标信号到达第n架飞机和参考基站之间的FDOA 测量值可表示为 ...

syy_1797的博客 5956

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

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

Better.C的博客 1547

车道线检测(传统基于Opencv的方法)

传统车道线检测方法主要是使用颜色选择、高斯平滑、边缘检测、ROI区域选择、霍夫变换、标定车道边界等Opnecv图像处理操作去检测道路上的车道线,我自己对很多用这类处理对很多道路场景车道线进行过实验,这类算法往往需要人工根据不同街道场景手动去反复调整各算法参数,从而才能使检测效果最佳。

Yangxiaoaijiejie的博客 2073

手把手教你接入京东购物小程序:从领券到下单的全流程解析

本文详细解析了如何从API申请到领券下单,手把手教你接入京东购物小程序的全流程。涵盖京东联盟账号注册、商品信息获取、优惠券链接转换等关键技术实践,帮助开发者高效实现电商功能集成,提升用户购物体验。

g5h6i的博客 911

ALNS求MDHVRPTW问题 python实现

ALNS python实现 VRP MDHVRPTW 自适应大邻域搜索

anthea_luo的博客 1775

Ubuntu20.04下Docker无缝升级实战指南

本文提供了一份在Ubuntu20.04系统上安全、无缝升级Docker的实战指南。文章详细阐述了升级前的版本检查、数据备份等准备工作,逐步演示了通过APT包管理器进行升级或指定版本安装的操作步骤,并强调了升级后的验证与常见问题回滚方案,确保业务容器平稳过渡。

postgres8guard的博客 481

python分支切割法求解VRPTW整数规划

其中引入了如下几个决策变量:其中,Q 为车容量,为第 i 个顾客的需求:目标函数是为了最小化所有车辆的总行驶成本(距离)约束1~4保证了每辆车必须从仓库出发,经过一个点就离开那个点,最终返回仓库约束5为车辆的容量约束约束6~7是时间窗约束,保证了车辆到达每个顾客点的时间均在时间窗内,点n+1是起点的一个备份,最后要回到起点。

hhhhjjjjijh的博客 1446

信号转换为图像 时域频域分析

一维信号如何转化为图像?深度学习如何学习 1.当然,直接1d卷积也是可以的。 2. 以信号强度的数值作为纵坐标,以时间为横坐标绘制信号点就可以了。 周霖那个即是 要看看代码是如何做的, 即使是单导联 5000个点,怎么变成50005000的分辨率的 3. 直接把多通道的一维信号合并成二维图像,然后直接按图像卷积的方法去做~~ 2225000这样一个图 ~可以看看语音处理的相关Net,其中比较...

王不留行嘿呦嘿 2万+

华为ENSP完整安装教程

华为ENSP完整安装教程

Hnm456756的博客 7340

【VRP问题】基于蚁群算法求解带时间窗的车辆路径规划VRPTW问题附matlab代码

针对目前物流配送过程中客户对于送货准时性要求日益提升的问题,对每个客户采用时间窗管理约束,作为NP-Hard问题,启发式算法常被用于解决VRPTW问题.本文选取somolon数据集进行研究,运用蚁群算法进行路径规划研究,研究表明蚁群算法作为启发式算法中的一种能够有效用于解决VRPTW问题。

matlab_dingdang的博客 201

【WRFDA第三期】OBSPROC namelist 变量总结

OBSPROC namelist 变量总结

WW、forever的博客 1120

带时间窗的车辆路径规划问题(VRPTW)

车辆路径规划问题是运筹学中经典的NP难问题,本文将选取其变种问题,结合实际生产中遇到的配送问题进行综合考虑,给出了相应的解决算法。 一 VRP问题 车辆路径规划问题(Vehicle Routing Problem,VRP)一般指的是:对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下(例如:货物的需求量与发货量,交发货时间,车辆容量限制,行驶里程限制,行驶时间限制等),力争实现一定的目标(如车辆空驶总里程最短,运输总费用最低,车辆按一定时间到达

qq_44776064的博客 2万+

efm32 入门.pdf

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

一种VRPTW初始解构造方法(含惩罚时间)

在使用智能算法(本文以邻域搜索为例)求解VRPTW问题时,想要构造一个可行的满足所有约束的初始解较为复杂,为了构造方便以及避免后续需要对所有产生的新解进行可行性判断,一般引入两个惩罚因子,一个是对重叠时间进行惩罚,一个是对超载进行惩罚。在使用智能算法求解带时间窗的车辆路径规划问题(VRPTW)时,面临的第一个问题就是初始解的构造,不同与旅行商问题(TSP)只要将所有客户打乱顺序即可得到一个初始解。

Lyyyp的博客 2326

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

Better.C的博客 9932

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于电动汽车的带时间窗的路径优化(Python&Matlab代码实现)

(1)本文结合电动汽车的特点构建了以总配送成本最小为目标的带有惩罚函数的基于电动汽车的带时间窗的车辆路径优化问题(VRPTW )模型。(2)对求解车辆路径优化问题的各种方法进行比较之后,本文采用遗传算法,设计了适合求解本文模型的染色体编码方式和遗传算子。算例分析结果验证了模型及算法的有效性。某物流配送中心为25个客户点提供配送服务,每个客户的货物需求量、时间窗不同。配送中心拥有3辆同一类型的电动汽车,其续驶里程dis为160km,额定载重量Q为5t。

weixin_46039719的博客 1702

【VRP问题】基于自适应遗传算法求解带时间窗车辆路径规划问题(VRPTW)附matlab代码

带时间窗约束的vRP问题(VRPTW)属于NP-hard问题,采用改进遗传算法探索最优方案。首先分析了带时间窗VRP问题的一般数学模型,并采用罚函数的方法对时间窗约束进行处理;设计了带权重的适应度函数,并采用了基于基因库的跨世代精英选择算子、PMX交叉算子和局部爬山变异算子;最后通过仿真实验与传统遗传算法和自适应遗传算法进行了对比研究,仿真结果表明改进遗传算法在解决带时间窗VRP问题中具有较高收敛速度和全局搜索能力。

matlab_dingdang的博客 354

【VRP问题】基于自适应遗传算法求解带时间窗车辆路径规划问题(VRPTW)附matlab代码...

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 ????个人主页:Matlab科研工作室????个人信条:格物致知。⛄ 内容介绍带时间窗约束的vRP问题(VRPTW)属于NP-hard问题,采用改进遗传算法探索最优方案。首先分析了带时间窗VRP问题的一般数学模型,并采用罚函数的方法对时间...

m0_57702748的博客 502
上一篇: 【进阶六】Python实现SDVRPTW常见求解算法——自适应大邻域算法(ALNS)
下一篇: 【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)
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、付费专栏及课程。

余额充值