【修改ing】基于pyscipopt库求解带时间窗车辆路径问题VRPTW

2024-04-11 10:28

本文主要是介绍【修改ing】基于pyscipopt库求解带时间窗车辆路径问题VRPTW,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 问题定义
  • 2. VRPTW 数学模型
    • 2.1 决策变量
    • 2.2 约束条件
    • 2.3 目标函数


本文章启发于 南军Opt 的相关文章,模型引自 Guy Desaulniers 等人的《Column Generation》,具体将会对已有模型和程序进行详细介绍和扩展。

1. 问题定义

前面我们介绍了带容量限制的车辆路径问题(Capacitated vehicle routing problem, CVRP),在CVRP的基础上,限制车辆到达各个客户点的时间范围,即客户点的时间窗,它限制了车辆到达该客户点的最早和最晚时间,称为带时间窗的车辆路径问题(Vehicle routing with time windows, VRPTW),该时间维度上的约束条件使得车辆的运输方案要考虑在途时间和到达时间之间的关系,极大地增加了模型的复杂性,该约束是VRP问题的典型约束。

处理时间窗的方式很简单,但都需要定义车辆到达客户点的时间变量,通过约束该时间变量的范围,实现时间窗约束,而车辆到达每个客户点的时间具有相互依赖关系,在同一车辆路线上的前后节点的到达时间相距时间不小于节点间的转运时间。时间窗约束的常见分类有两种:

  • 硬时间窗:即车辆到达客户点的时间必须在指定的时间窗内,提前到达则在客户点处等待,而晚于时间窗到达则不被允许(方案不可行);
  • 软时间窗:即车辆到达客户点的时间应尽量在指定时间窗范围内,如果不在指定时间窗范围内则会进行一定的惩罚,一般而言,晚于时间窗到达会有一个较大的惩罚系数,而早于时间窗到达是否惩罚则需要进行一定的声明。

2. VRPTW 数学模型

VRPTW 模型常常建立为多商品网络流模型(multi-commodity network flow model)的形式 ,在一定目标下考虑商品流量在网络结构中的流动。具体到 VRPTW 问题的数学模型,则引用参考教材《Column Generation》的第三章节,其中的时间窗约束为硬约束。

2.1 决策变量

根据 VRPTW 问题的描述可知,我们需要直接决策的变量是派那一辆车去配送哪一段的路线,而简介的变量则是车辆到达某个客户点的到达时间,需要限制在一定范围内。变量以及参数如下:

  • 模型决策变量:
    1. x i j k x_{ijk} xijk 布尔变量,车辆 k k k 是否负责节点 i i i 和节点 j j j 之间的直接配送,若是则取值为 1 1 1,否则取值为 0 0 0
    2. s i k s_{ik} sik 连续型变量,表示车辆 k k k 到达节点 i i i 的时间。由于这里出现了相当于车辆分配的问题,即节点 i i i 是否是由车辆 k k k 配送,在优化结果出来之前并不知道,因此有个关键问题是,既然我们要对所有的节点和车辆对建立变量,那如果节点 i ′ i' i 不是由车辆 k ′ k' k 配送的, s i ′ k ′ s_{i'k'} sik 的值应该取什么?不同的约束写法是否会对目标有影响? 这个问题后文会进行解答。

这个问题具体得结合目标函数考虑(一般情况下,不同的约束形式只要不影响最终目标值,则认为模型是等价的)。

The inequalities (3.7) establish the relationship between the vehicle departure time from a customer and its immediate successor.
不等式(3.7)建立了车辆从顾客出发时间与其直接后继车辆出发时间之间的关系。
Finally constraints (3.8) affirm that the time windows are observed, and (3.9) are the integrality constraints.
最后,约束(3.8)确认时间窗被观察到,(3.9)是完整性约束。
Note that an unused vehicle is modeled by driving the “empty” route (0, n +1).
请注意,未使用的车辆通过行驶“空”路线(0,n +1)来建模。

2.2 约束条件

The constraints (3.2) ensure that each customer is visited exactly once, and (3.3) state that a vehicle can only be loaded up to it’s capacity.
约束条件(3.2)确保每个客户只访问一次,并且(3.3)规定车辆只能装载到其容量。
Next, equations (3.4), (3.5) and (3.6) indicate that each vehicle must leave the depot O;
由式(3.4)、(3.5)和式(3.6)可知,每辆车必须离开O站;
after a vehicle arrives at a customer it has to leave for another destination;
车辆到达客户处后,必须离开前往另一个目的地;
and finally, all vehicles must arrive at the depot n +1.
最后,所有车辆必须到达仓库n +1。

2.3 目标函数

The objective function (3.1) minimizes the total travel cost.
目标函数(3.1)使总旅行成本最小化。

这篇关于【修改ing】基于pyscipopt库求解带时间窗车辆路径问题VRPTW的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/893814

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指