329. 矩阵中的最长递增路径c_建模案例 | 洒水车作业路径规划 (多旅行商问题)...

de26da4d240617b9708c045fa6515995.png

前言

最优化问题一直是国赛及各地区小比赛的热点问题。本题是线性规划、启发式算法的典型应用案例,结合地图类型数据,需要考虑的问题更加复杂。阅读本文前,建议读者掌握一定的编程基础、运筹学基础,并且配置好 python3 及 gurobi 环境。相关内容及其他案例可以参考以下文章:

Suranyi:gurobi 高效数学规划引擎 | python3 配置、使用及建模实例​zhuanlan.zhihu.com
823b7b90125311a35d671e46d9e53dbe.png

1 问题描述

某城市共有绿化喷洒车20台,分为A、B两类。其中A、B类喷洒车分别有12辆、8辆,执行喷洒任务前平均部署在2个停靠点(D1,D2)。所属域内有6个给水站(Z01~ Z06)、60个喷洒作业点(F01~ F60),每一个喷洒作业点只需一台喷洒车进行一次作业。各给水站最多可以给八台喷洒车加水,不计加水时间。相关道路情况如图1所示(道路节点J01~J62),相关要素的坐标数据如“相关的要素名称及位置坐标数据”所示。图中红线主干道路,黑线是普通道路。A、B两类喷洒车在主干道路上的平均行驶速度分别是 60公里/小时、50公里/小时,在其他道路上的平均行驶速度分别是45公里/小时、30公里/小时。喷洒车装满水停靠在停靠点,接到喷洒任务后驶向喷洒作业点喷洒作业。一次喷洒作业A、B两类喷洒车分别需要用时20分钟、15分钟。每辆喷洒车完成一次喷洒任务后,需要到给水站加水再进行下次喷洒作业。

9c30eab9d9b6325ff26f89652556b3ca.png

请建立数学模型研究下列任务相关问题:

(1) 任务一:每辆喷洒车只执行一次喷洒作业。请给出完成任务一的最短时间及相应的最优喷洒作业方案。

(2) 任务二:每辆喷洒车执行两次次喷洒作业。请给出完成任务二的最短时间及相应的最优喷洒作业方案。

(3) 任务三:完成所有60个喷洒作业点(F01~ F60)的喷洒任务。请给出完成任务三的最短时间及相应的最优喷洒作业方案。

(4) 如果在道路节点J01~J62中的某两个节点处分别增建一个给水站,请重新考虑问题(3)。并给出增建给水站的最佳位置。

2 问题分析

本题是路径调度方面的算法设计问题 (经典的多旅行商问题),与 98 年国赛灾情巡视问题十分相似。由于其背景是真实世界中的交通网道,需要结合图论知识进行相关的数据处理工作 (如邻接关系表示、获取最短路径、分群等)。在建模中,满足分配路径的前提下尽可能符合某些背景下的 “高效”,是本题的重点。

附件提供了图中各要素的坐标,并以图片形式描述点之间的连接情况。在图论中,常用邻接矩阵表示图结构。例如:

0bf3d85666ea7cbb90bfaf07dc054859.png

因此,可以考虑先将图中的节点连接信息转化为 0-1 矩阵

。这样的表示方法是对图形重现、计算图距离的基础。假如拥有这样的邻接矩阵,可以实现如下功能:
  • 在绘图时,根据附件中点的坐标可以标记出点的位置,再遍历矩阵中的元素,遇到
    ,则将点
    相连。
  • 在计算距离时,可以直接任意两点间的欧式距离,得到 “点 - 点 距离矩阵”。但这样的距离矩阵并不能真实反应两点之间的图距离。因此,在计算点
    与点
    的距离时,同时检查
    是否等于1,如果不等于1,则将该处的距离修改为 inf,即两点不相连。
  • 计算任意两点间的图距离,可以使用图论中的最短距离算法 (如Dijkstra、Floyd-Warshall算法)。题目中要求 “最短时间”,因此在给定两点
    求路径时,应该
    求这两点之间的最短路径

获取邻接矩阵是必要的工作,最简单的操作就是人工标注法 (在excel中填写,或代码写两层 for 循环 + if 标注)。此处要注意,由于主道与支道车速不同,需要构造两份邻接矩阵。

import 

由于题目中涉及不同车型速度、作业时间不同,而最终的优化目标是耗费时间尽可能短。因此需要将 “距离” 统一转化为使用的时间,作为边权值,构造 “A车 时间矩阵”,“B车 时间矩阵”。

考虑问题的“时间最短”,可以从以下两个角度出发:

  • 总时间最短:
    ,它与平均用时最短是等价的;
  • 最长用时最短:

“最长用时最短“反映该地区全部洒水任务完成所需的最长时间最小化,这两种优化目标都是符合题意的,考虑到第一种优化目标可能造成部分车用时过长的问题,因此这里选择第二种作为第一级优化目标,第一种作为第二级优化目标。(多目标优化问题)

对于第一问、第二问,20辆车在60个地点中选择20个地点、40个地点进行洒水作业,可以考虑转化为指派问题,使用线性规划类方法进行求解;也可以使用遗传算法进行求解。由于本题规模较小,使用线性规划进行求解。

对于第三问,由于没有强制规定每辆车都需要洒水3个地点。引申出两种假设:

  • 洒水车没有洒水次数限制。即允许有的车前往作业点密集区执行多个洒水任务,有的车执行较少的洒水任务;
  • 每辆车都执行3次洒水任务。

显然,如果使用第一种假设,动态仿真的思路更容易进行;第二种假设更适合遗传算法、线性规划等静态类模型。此外,由于补水站只能为 48 次作业任务补水,而完成 60 个点作业任务需要 60 次补水。因此认为最后 20 次任务完成后返回停靠点。

对于第四问,结合题意及实际背景,在给水站充足下,洒水车可以完成任务后停留在给水站,等待第二天 (下一轮) 作业任务。题目可以转为在

这68个点中设置8个给水站,只是后面6个点是固定必选点。最佳给水站的设置应该满足整体完成任务的用时最短。因此,第一种想法是遍历取两个给水站,在给定了 8 个给水站下进行第三问的优化过程,以最终耗时作为评价指标,尽管这样会大大增加问题求解规模。结合实际考虑,洒水车往往不会跨越整个街区进行洒水作业,大多数车辆都只在局部地区进行洒水作业。因此,第二种想法便是转为图的聚类问题,设置合理的“聚类中心”,对其附近的作业点进行打包,使得整体用时 (类间距离) 尽可能小,具体求解方案在正文中展示。

3 数据预处理

3.1 获取边接邻矩阵

数据预处理的第一个工作是获取边邻接矩阵,我们采用基于人体 ATP 消耗的手工标记法进行 (找个学弟帮你画一下就行了!)。获得的标记数据分为邻接矩阵1、邻接矩阵2,前者是整个道路信息图,后者是主道图。两个矩阵按位进行异或运算即可得到支道图。

3.2 重构网络图

网络图 (节点图) 有多种绘制方式,Pyecharts、Matplotlib、python-igraph 都可以实现。这里我们使用 pygraphviz 进行绘图。快速入门及相关案例参考:

Suranyi:PyGraphviz (几何图形可视化工具) 简单入门​zhuanlan.zhihu.com
442fb397eed756606e370dad4a1a082a.png
import 

8ab21cea9c046f985e834d33e6cc2f4a.png
代码效果

3.3 获取代价矩阵

图的最短路径可以使用 Dijkstra算法实现,算法细节可以自行搜索,本文基于 python-igraph,实现更便捷的 Jgraph 模块 (快速入门参考:社区网络分析学习笔记 —— 算法实现及 igraph 介绍,本文使用的 Jgraph 见文末附录),调用该工具实现。将得到的A车代价矩阵、B车代价矩阵、距离矩阵分别记为

import 

7e6bb9516ca1c0d1e6f9151730c23bdb.png

4 模型建立与求解

4.1 第一问:20 作业点作业路径规划

设 20 辆洒水车集合

,1-6 为停靠在 D1 地的A车,7-10 为停靠在 D1 地的B车,11-16 为停靠在 D2 地的A车,17-20 为停靠在 D2 地的B车。为方便表示,我们以
表示
车的车型,
表示
车的起点,
表示
车的固定作业时间。

决策变量:每辆车只能从一个地方出发,前往一个地方进行洒水作业,再回到其中一个给水站,完成一次洒水作业。定义 0-1 决策变量

如下:

约束条件:每辆车都要进行一次作业、每个地点至多有一辆车为其进行作业、每个给水站至多为 8 辆车补水,约束如下:

此时,车

完成一次洒水作业所需的时间为:

优化目标:根据问题分析,本题的第一级优化目标为

,但这种目标不利于求解,引入辅助变量
满足如下约束:

此时,第一级优化目标转化为:

第二级优化目标为:

求解结果:

dd21706043bd128ce3b25b7992306c83.png
import 

4.2 第二问:40 作业点作业路径规划

4.2.1 联合决策模型 (建议先看 4.2.2)

决策变量:每辆车只能从一个地方出发,前往一个地方进行洒水,再回到其中一个给水站进行补水,随后再前往一个地方洒水,最后回到给水站。定义 0-1 决策变量

如下:

约束条件:每辆车只能选择其中一条路径、每个地点至多有一辆车为其进行作业、每个给水站至多为 8 辆车补水,约束如下:

此时,车

完成一次洒水作业所需的时间为:

优化目标:根据问题分析,本题的第一级优化目标为

,但这种目标不利于求解,引入辅助变量
满足如下约束:

此时,第一级优化目标转化为:

第二级优化目标为:

求解结果:

c37d35b704d114c699df5371ffd63ac7.png
import 

4.2.2 分段决策模型

上述模型随着问题规模增加,求解难度极速增大。仅对本题而言,仍然能够较快求解 (笔者电脑约 15 分钟)。为方便第三问处理,可以考虑将第一阶段、第二阶段分开进行处理。

对于联合决策模型,建立的变量数为:20 * 60 * 6 * 60 * 6;而在分段决策模型,建立的变量数为:20 * 60 * 6 + 20 * 6 * 60 * 6;

决策变量:第一阶段决策变量定义如下:

第二阶段决策变量定义如下:

注:此处可以对
进一步细分为
这两个变量,再使用示性变量表示同时取值为1的情形。但由于如上 (14, 15) 分段决策后问题规模较小,求解速度显著提高,就不再细分!

约束条件:第一阶段与第二阶段每辆车只能选择一条路径:

对同一辆车,需要保证第一阶段决策终点与第二阶段决策起点一致,需要有:

每个地点至多有一辆车为其进行作业、每个给水站至多为 8 辆车补水,约束如下:

此时,车

完成一次洒水作业所需的时间为:

优化目标:根据问题分析,本题的第一级优化目标为

,但这种目标不利于求解,引入辅助变量
满足如下约束:

此时,第一级优化目标转化为:

第二级优化目标为:

求解结果:

cc486ca1c9899f50029492056ba31d94.png
与联合决策模型结果一致,但这种方法速度更快,能在10s内求解完成
import 

4.3 第三问:60 作业点作业路径规划

完成前面 40 个补水作业时,给水站只能再为 8 辆车补水。此处认为完成最后 20 个作业点任务后,返回停靠点。此处采用三阶段决策模型进行处理。

决策变量:第一阶段决策变量定义如下:

第二阶段决策变量定义如下:

第三阶段决策变量定义如下:

约束条件:第一阶段、第二阶段、第三阶段每辆车只能选择一条路径:

对同一辆车,需要保证第一阶段决策终点与第二阶段决策起点一致、第二阶段决策终点与第三阶段决策起点一致,需要有:

每个地点都有一辆车为其进行作业、每个给水站至多为 8 辆车补水,约束如下:

此时,车

完成一次洒水作业所需的时间为:

优化目标:本题只设置一级优化目标,并约束求解时间限制为 1000s (在300s时已经很接近全局最优解)。

优化目标为

,但这种目标不利于求解,引入辅助变量
满足如下约束:

此时,优化目标转化为:

求解结果:

67217ff5e9923a0db0bd2a74beb3f3a6.png
import 

4.4 第四问:分配最佳给水站

结合实际考虑,在给水站充足条件下,洒水车可以围绕该给水站附近进行洒水作业,绕行固定路径,最后再回到停靠点。为使得整体作业时间最短,洒水车完成作业后,应当尽可能返回距离它最近的补水点。因此,第一步就是确定哪些给水站应该归属于哪些洒水点,但由于每个给水站能补水的次数有限,若每一次都选择距离它最近的补水点,可能造成个别洒水车需要超远距离补水。站在全局最优的角度,需要预先指定作业点对应的给水站。

本题分为 2 部分求解:

  • 基于社群分割 (图聚类) 思想分配最佳给水站位点
  • 洒水车初始位置分配与洒水车最佳路径选择

4.4.1 基于社群分割 (图聚类) 思想分配最佳给水站位点

为候选给水站集合。

决策变量:给水站设置点决策变量:

设类归属决策变量

约束条件:洒水点

归属于
的前提是
为给水站:

总共设置 8 个给水站,其中 6 个已经固定:

每个类别至多包含 8 个洒水作业点:

每个洒水点都唯一归属于一个给水站:

优化目标:聚类的思想是类内间距尽可能小,类间间距尽可能大。由于不知道将会分配哪一类型的洒水车,此处使用距离矩阵

代表节点间误差矩阵。对于聚类簇
,其类内误差为:

设定如下优化目标:

结果:J21J27 是最佳给水站位置。令
为最终给水站集合。

1d40d86065a75b71d465f5eac1956e6f.png
本质上是固定规模社区划分
import 

4.4.2 洒水车初始位置分配与洒水车最佳路径选择

在 4.4.1 求得新增补水点情况下,将 4.3 模型中

的取值范围扩充为
,再进行求解。
若将 4.4.1 与 4.4.2 合并计算,创建的变量数太多、约束规模大,难以求解。

求解结果:

36c8a3e8f0f19d649138e95df9d27bc4.png
import 

附录

本文使用的 Jgraph:

import 

作者:张柳彬

如有疑问,请联系QQ:965579168

不接论文代做, 转载请声明出处

本文材料:https://pan.baidu.com/s/16uyZiqhp7bb8flXb_XohjQ

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值