网络优化4|网络流问题|路径规划问题|车辆路径问题

news2024/9/20 10:46:48

网络流问题

网络最大流问题

研究网络通过的流量也是生产管理中经常遇到的问题
例如:交通干线车辆最大通行能力、生产流水线产品最大加工能力、供水网络中最大水流量等。这类网络的弧有确定的容量,虽然常用 c i j c_{ij} cij表示从节点 i i i到节点 j j j的弧的最大流量,但实际上通过该弧的流量不一定能达到最大流量,因此常用 f i j f_{ij} fij,表示通过弧的实际流量。

对于网络最大流研究,主要是下面两个问题

  1. 从网络的起点出发到网络终点所能达到的最大流量;
  2. 当求解网络最大流量后,分析限制网络流量最大化的关键弧,通过某些方法增加该弧的容量,使网络最大化流量增加更多。
    ![[Pasted image 20240827074926.png]]

通过对网络流的分析,网络最大流有以下三个基本特点:

  1. 起点的流出量和终点的流入量相等,
  2. 每个节点的流入量和流出量相等;
  3. 每条弧的实际流量不能超过最大容量
网络最大流问题的线性规划模型

根据网络最大流的三个基本特点,很容易建立起网络最大流的线
性规划模型。
m a x   V = ∑ i = 1 n f s i = ∑ i = 1 n f i t max\ V=\sum_{i=1}^{n}f_{si}=\sum_{i=1}^{n}f_{it} max V=i=1nfsi=i=1nfit
s . t . { ∑ v f i v = ∑ v ′ f v ′ i ,   i ≠ s , e 0 ≤ f i j ≤ c i j , 1 ≤ i , j ≤ n s.t.\quad\left\{\begin{matrix} \sum_{v}f_{iv}=\sum_{v'}f_{v'i},\ i\ne s,e \\ 0\le f_{ij}\le c_{ij},\quad 1\le i,j\le n \end{matrix}\right. s.t.{vfiv=vfvi, i=s,e0fijcij,1i,jn
其中,s表示起点编号,e表示终点编号
f i j f_{ij} fij表示弧 i j ij ij的流量, c i j c_{ij} cij表示弧 i j ij ij的最大容量

根据容量网络的拓扑结构,每个弧的最大容量,起点和终点,我们通过求解线性规划就可以得到从网络的起点出发到网络终点所能达到的最大流量。

网络最大流问题的Matlab求解
%计算从起点1到终点6的最大流量
s = [1 1 1 2 3 3 4 4 5]; 
t = [2 3 4 6 4 5 5 6 6];
weights = [70 100 90 80 40 70 40 100 90]; 
G = digraph(s, t, weights);
H = plot(G, 'EdgeLabel', G.Edges.Weight);
[mf, GF] = maxflow(G, 1, 6); 
H.EdgeLabel = {};
highlight(H, GF, 'EdgeColor', 'r', 'Line Width', 2); 
st = GF.Edges.EndNodes;
labeledge(H, st(:, 1), st(:, 2), GF.Edges.Weight);
formatSpec= '从起点1到终点6的网络最犬流量为:%4.0f\n'; fprintf(formatSpec, mf);

![[Pasted image 20240827080058.png]]

路径规划问题

路径规划问题

首先,我们简单了解下运动规划问题:在给定的位置A与位置B之间为机器人找到一条符合约束条件的路径。这种问题常出现在机器人、汽车导航等工业应用中。而路径规划则是运动规划里的重要研究内容。
所谓路径规划,就是指在一张已知的地图上,规划出一条位置A到位置B的路径。而运动规划里也有很多不知地图的情形,需要机器人自主去构建地图、自主摸索规划路径
而对于游戏程序的运动规划问题,更多(甚至绝大部分)都是路径规划问题因为游戏地图几乎总是已知的。用Dijkstra算法求解单源最短路问题,但类似的算法思想在二维坐标中代价过高,通常用A* 算法来求解路径规划问题

路径规划寻路计算

![[Pasted image 20240827080457.png]]
![[Pasted image 20240827080510.png]]

下面分析A*算法如何规划路径:

  1. A是起点,将A放入closeList;
  2. 与A相邻的八个节点都不是障碍物,可达,放入openList,把A设为它们的父节点;
  3. 从openList选一个与A相邻的节点,选最小f值的节点:
    f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n) f(n)=g(n)+h(n)
    f ( n ) f(n) f(n)是节点n的综合优先级; g ( n ) g(n) g(n)是节点n距离起点A的代价(距离); h ( n ) h(n) h(n)是节点n距离终点B的预估代价(距离);
  4. 下一步路径的产生:反复遍历openList,选f值最小的节点。

g ( n ) g(n) g(n)可以直接计算;
h ( n ) h(n) h(n)的计算:
本问题只能上下左右对角线八个方向移动,选择曼哈顿距离;如果能向任意方向移动,可以用欧式距离;计算h(n)时忽略障碍物,不考虑对角线距离,这是对剩余距离的估计值,不是实际值。
![[Pasted image 20240827080816.png]]
![[Pasted image 20240827080825.png]]

检查 n 22 n_{22} n22周围节点,忽略障碍物节点,将可达节点加入到openList中,并将 n 22 n_{22} n22设置为这些新增节点的父节点,重新计算各个节点的f值。
通过观察,发现节点的路径1 A→ n 32 n_{32} n32比路径2 A→ n 22 n_{22} n22 n 32 n_{32} n32的f值更优,此时路径可变更为A→ n 32 n_{32} n32。因为A→ n 12 n_{12} n12与A→ n 32 n_{32} n32的f值是相同的,在编程过程中一般选最后加入openList的节点。
![[Pasted image 20240827081121.png]]
![[Pasted image 20240827081130.png]]

接下来 n 32 n_{32} n32加入closeList,检查 n 32 n_{32} n32周围节点,忽略障碍物节点,将可达节点加入到openList中,并将 n 32 n_{32} n32设置为这些新增节点的父节点,重新计算各个节点的 f值。选择最小的 n 43 n_{43} n43加入到closeList。
![[Pasted image 20240827081331.png]]
![[Pasted image 20240827081339.png]]

重复上面的过程,直至把终点B加入openList。
从终点开始,根据箭头方向向父节点移动,回到起点,就获得了最终的路径。
![[Pasted image 20240827081414.png]]

车辆路径问题(VRP问题)

车辆路径问题

VRP(VehicleRoutingProblem,车辆路径问题)是TSP问题的扩展,是交通运输、物流供应链领域的研究热点。
例如,某配送中心对一定区域内的客户(需求点)进行货物配送服务,每个客户的货物配送量小于车辆的最大装载量,且每个客户距离配送中心,以及各个客户之间的距离是已知的,通常不存在只需要一辆车跑一趟就满足全部客户的配送需求(如果存在这种情况,VRP退化到TSP)。
一般来说,需要多辆车或一辆车跑多趟才能满足全部客户的配送需求。此时要解决的问题是:

  1. 哪些客户的货物应该分配到同一辆车上
  2. 每辆车对客户的服务次序是什么。
车辆路径问题建模

问题:设某配送中心有m辆车,需要对k个客户(节点)进行货物配送服务

  1. 每个客户的货物需求量是 d i ( i = 1 , 2 , … , k ) d_{i}(i=1,2,\dots,k) di(i=1,2,,k)
  2. 每辆配送车的最大装载量是Q;
  3. c i j c_{ij} cij表示客户 i i i到客户 j j j的运输成本(时间、路程、花费等);
  4. 配送中心编号为0,客户编号为 i ( i = 1 , 2 , … , k ) i(i=1,2,\dots,k) i(i=1,2,,k)
    设下面两组0-1决策变量
    x i j s = { 1 ,  车 s 从 i 行驶到 j 0 ,  否则 x_{ijs}=\left\{\begin{matrix} 1,\ 车s从i行驶到j \\ 0,\ 否则 \end{matrix}\right. xijs={1, si行驶到j0, 否则
    y i s = { 1 ,  客户 i 的货物由车 s 完成 0 ,  否则 y_{is}=\left\{\begin{matrix} 1,\ 客户i的货物由车s完成 \\ 0,\ 否则 \end{matrix}\right. yis={1, 客户i的货物由车s完成0, 否则
    由此建立如下的数学模型
    目标函数
    m i n   Z = ∑ i = 0 k ∑ j = 0 k ∑ s = 0 k c i j x i j s min\ Z=\sum_{i=0}^{k}\sum_{j=0}^{k}\sum_{s=0}^{k}c_{ij}x_{ijs} min Z=i=0kj=0ks=0kcijxijs
    约束条件
  5. 车辆的装载量不能超过最大装载量
    s u n i = 0 k d i y i s ≤ Q , ( s = 1 , 2 , … , m ) sun_{i=0}^{k}d_{i}y_{is}\le Q,(s=1,2,\dots,m) suni=0kdiyisQ,(s=1,2,,m)
  6. 每个客户的配送任务仅由其中一辆车完成,所有任务由m辆车协同完成
    s u n s = 0 m y i s = { 1 ,   i = 1 , 2 , … , k m ,   i = 0 sun_{s=0}^{m}y_{is}=\left\{\begin{matrix} 1,\ i=1,2,\dots,k \\ m,\ i=0 \end{matrix}\right. suns=0myis={1, i=1,2,,km, i=0
  7. 到达某一客户的车辆有且仅有一辆,从某一客户离开的车辆有且仅有一辆
    ∑ i = 0 k x i j s ≤ y j s ,   ( j = 1 , 2 , … , k ; s = 1 , 2 , … , m ) \sum_{i=0}^{k}x_{ijs}\le y_{js},\ (j=1,2,\dots ,k;s=1,2,\dots,m) i=0kxijsyjs, (j=1,2,,k;s=1,2,,m)
    ∑ j = 0 k x i j s ≤ y i s ,   ( i = 1 , 2 , … , k ; s = 1 , 2 , … , m ) \sum_{j=0}^{k}x_{ijs}\le y_{is},\ (i=1,2,\dots ,k;s=1,2,\dots,m) j=0kxijsyis, (i=1,2,,k;s=1,2,,m)
    显然,上面VRP问题的模型是一个经典的整数规划模型,或者称为0-1规划模型,我们可以借助Matlab中求解线性规划的函数,或用Lingo软件求解,
    但是,当问题规模比较大时,上述工具不一定能有效求解,通常我们会利用智能优化算法如遗传算法来求解,或者通过构造合适的模型结构,通过列生成算法求解大规模整数规划问题

VRP(VehicleRoutingProblem,车辆路径问题)是运筹优化中一类普通又重要的问题,Google开源的运筹优化求解器Ortools针对这类问题有专门的调用接口,前面示例中的VRP问题就是车辆容量限制的CVRP问题;如果是时间窗约束,如寄快递会指定快递员上门取件的时间段,这就是时间窗口约束的 VRP问题,即VRPTW问题
在配货场景中,因仓库装卸能力有限,只能同时对两辆车进行装卸,那么其他车辆就需要等待前面的车装卸完成。
类似场景还有飞机场的飞机调度问题,由于飞机场的机位是有限的,如何安排飞机的起降时间和顺序就显得无为重要,这类问题就是资源约束的VRP问题,即VRPC问题。
这些常见的VRP问题,Ortools提供了现成的解决方案

利用求解器Ortools求解车辆容量限制的CVRP问题的实例
配送中心标号0,客户编号1-16,车辆数4,最大载重量15
客户需求1,1,2,4,2,4,8,8,1,2,1,2,4,4,8,8 配送中心与客户,客户之间的距离矩阵
![[Pasted image 20240827083311.png]]
![[Pasted image 20240827083321.png]]

结果
车辆0:
0累积装载(0)->1累积装载(1)->4累积装载(5)->3累积装载(7)->15累积装载(15)->0累积装载(15)
总行驶距离:2192m
总装载量:15
车辆1:
0累积装载(0)->14累积装载(4)->16累积装载(12)->10累积装载(14)->2累积装载(15)->0累积装载(15)
总行驶距离:2192m
总装载量:15
车辆2:
0累积装载(0)->7累积装载(8)->13累积装载(12)->12累积装载(14)->11累积装载(15)->0累积装载(15)
总行驶距离:1324m
总装载量:15
车辆3:
0累积装载(0)->9累积装载(1)->8累积装载(9)->6累积装载(13)->5累积装载(15)->0累积装载(15)
总行驶距离:1164m
总装载量:15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2080741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写,它是一个允许计算机短期存储数据以更快访问的组件。众所周知,操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时,CPU 会将数据传输到 RAM 中进行计…

安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南?Jenkins怎么配置服务器? Jenkins作为一个流行的自动化服务器,其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能,以实现自动化通知。 Jenkins发邮件&#xf…

NVI技术创新联盟成立,BOSMA博冠IP轻量化制播已运用

2024年北京国际广播电影电视展览会(BIRTV)首日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV 2024超高清全产业链发展研讨会上宣布正式成立。作为国产8K摄像机先行者,BOSMA博冠受邀加入NVI技术…

Flowable BPMN bpmnjs 设计器

最近半年我一直在打造一款行业顶尖的流程设计器,适配了flowable所有的组件,美观,大方,灵活,好用。所有的组件都进行严格的测试并在生产环境上线了。 1、在线预览 2、整体框架布局 3、组件分组 4、完整模式切换 给大…

若依,前后端分离项目,部署到服务器

1.后端项目用maven打包 正式服的话,测试不用加。 application.yml加上context-path: /prod-api 一定要选择root的ruoyi,他会把你自动打包其他模块的依赖 全部成功。然后去ruoyi-admin拿到这个包,java -jar ruoyi-admin.jar就可以了 将jar上…

STM32嵌套向量中断控制器—NVIC

NVIC简介: NVIC,即Nested Vectored Interrupt Controller(嵌套向量中断控制器),是STM32中的中断控制器。它负责管理和协调处理器的中断请求,是STM32中处理异步事件的重要机制。 NVIC提供了灵活、高效、可扩…

IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与讨论会!

再获权威顶会认可 8 月 26 日至 8 月 30 日,数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 三篇论文的最新研发成果被本次大会录用,这其中也包括 TsFile 成为 Apache Top-Level 项目后发表的第一篇顶会论文。 同时,在国际权威数据库…

博弈论详解 2(SG函数 和 SG定理)

传送门:博弈论详解 1(基本理论定义 和 Nim 游戏) 什么是 SG 函数 接着上次的讲解,我们来了解一个更通用的模型。我们把每一个状态变成一个点(在 Nim 游戏里就代表 a a a 数组),如果可以从一种…

008、架构_分布式事务

分布式事务控制 对于一个分布式写事务,计算节点会向GTM申请全局事务GTID,GTID申请成功后,称当前GTID对应的事务是活跃事务,处于未提交状态。如果涉及数据更新,则将GTID信息同步更新到该事务要更新的事务中。成功提交事务后,这里的成功是指分布式事务涉及所有数据节点均提…

C++入门基础知识37——【关于C++ 运算符——关系运算符】

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

Day24 第11站 出发 c++!

1> 思维导图 2> 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 string s1;cout << "请输入一个字符串" << endl;getline(cin,s1);int len s1.length();char buf[128]"";strcpy(buf,s1…

如何使用Smart-Doc高效生成Java WebSocket接口文档

前言 Smart-Doc 是一款强大的文档生成工具&#xff0c;可以帮助开发者轻松地为Java 项目生成清晰、详细的 API 文档。随着WebSocket技术的普及&#xff0c;Smart-Doc 在3.0.7版本开始也增加了对 WebSocket 接口的支持。本文将详细介绍如何使用 Smart-Doc 生成 Java WebSocket …

DIY 300以上fps游戏 台式机 2024年8月(cpu)

组装台式机 CPU处理器 前言&#xff1a;因特尔霸榜&#xff0c;目前cpu全部都是国外产&#xff0c;锐龙是国外在中国的代理。 2024双十一cpu销量 首推cpu&#xff1a;性价比第三名 Intel 酷睿i5 12600KF 1149元 &#xff08;瓦死斗帧率在200-400之间&#xff0c;300上下浮动…

浅谈SpringMvc的核心流程与组件

一、SpringMvc的核心流程 当发起请求时被前置的控制器(DispatcherServlet)拦截到请求&#xff0c;根据请求参数生成代理请求&#xff0c;找到请求对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制…

vue3子组件修改父组件传来的值

概述 vue3子组件修改父组件的值 不需要父组件传给子组件函数的形式&#xff0c;而是直接在子组件中通过emit修改父组件传来的值 效果图 修改前 修改后 示例代码 父组件Parent.vue <template><Childv-model:txt"state.txt"/> </template> <…

桥接模式-多类型登录方式的思考

桥接模式-SSO单点登录 背景:(业务细节已脱敏)需求:问题:解决方式: OAuth2.0 实现单点登录四种授权模式桥接模式优化问题代码实现 背景:(业务细节已脱敏) 基于实习期间的一个代码重构的思考——业务细节已脱敏 基于内部旧框架实现业务toB管理系统&#xff0c;需要迁移数据并新的…

ABB巨资收购一家电气龙头,为当年卖给日立电气业务回血

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 战略扩张&#xff1a;ABB携SEAM集团深耕电气服务市场 在电气服务领域&#xff0c;ABB再次展现了其强大的市场扩张能力。近日&#xff0c;ABB宣布…

ARP诈骗

学习资料&#xff1a; arpspoof安装和5分钟基于linux-kali的arp攻击防御示例&#xff08;保姆级图文&#xff09;【网络工程】_arspoof工具 linux无网络环境安装-CSDN博客 arp欺骗原理_arp欺骗攻击原理-CSDN博客 ARP欺骗_arp欺骗复现-CSDN博客 ARP欺骗原理及实现-CSDN博客 kali…