缓解拥堵的高速公路

  又是一个晴朗的假日,居住在A城市的上班族打算到附近的B城市看看自然风光。当大家将车开到高速上时,又一次遇到了毫无悬念的拥堵,两个城市间的收费站成了拥堵的重灾区。下图展示了两个城市间高速公路的网络模型。

  图1

  每个顶点代表一个收费站,v1是A城市的出口,v6是B城市的入口,边的权重代表高速公路的运力c(v1)~c(v6) 代表每个收费站的容量,该容量和高速公路的运力单位相同。为了缓解拥堵,两个城市向每个收费站加派了交警,以便引导司机走相对快速的路线。交警该以怎样的方案调度车辆呢?

带有容量的顶点

  交通流正好可以规约成网络流模型,但由于加入了顶点的容量,问题似乎也变得更加复杂。回顾流网络的定义,G=(V,E,s,t,C)并没有包括顶点的容量,想要将图1规约成网络流模型,需要先想办法去掉顶点的容量。

  我们的解决方案是用边代替顶点,具体做法是对每个有容量顶点v,都添加一个新的顶点v’,连接vv’,使c(v→v’)=c(v),并将v的流出边转移到v’上:

  图2

交警的指挥方案

  图2已经将带有容量的顶点转换成了一个普通的st-网,只要更改一下输入,就可以使用最大流的相关算法找出车辆调度方案。程序中将顶点v的值乘以10作为v’。

 1 import network_flow as nf23 V = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]4 E = [nf.Edge(0, 1, 18), nf.Edge(0, 2, 18), nf.Edge(0, 3, 18), nf.Edge(1, 4, 9), nf.Edge(1, 5, 9),5      nf.Edge(2, 5, 9), nf.Edge(2, 6, 9), nf.Edge(3, 6, 9), nf.Edge(3, 7, 9), nf.Edge(4, 8, 3),6      nf.Edge(4, 9, 12), nf.Edge(5, 9, 6), nf.Edge(5, 10, 14), nf.Edge(6, 10, 7), nf.Edge(6, 11, 5),7      nf.Edge(7, 11, 10), nf.Edge(7, 12, 12), nf.Edge(8, 13, 8), nf.Edge(9, 13, 8), nf.Edge(10, 13, 8),8      nf.Edge(11, 13, 8), nf.Edge(12, 13, 8)]9 s, t = 0, 13
10 G = nf.Network(V, E, s, t)
11 ford_fullkerson = nf.FordFulkerson(G)
12 ford_fullkerson.start()
13 ford_fullkerson.display()

  可以看到,最大流除了受边的容量影响外,还受到节点容量的影响。

匹配飞行员

  第二次世界大战期间,英国皇家空军从沦陷国征募了大量外籍飞行员。在执行飞行任务时,由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的两名飞行员,其中一名是英国飞行员,另一名是外籍飞行员,每一名英国飞行员都可以与若干名外籍飞行员很好地配合。在一次大规模战略任务中,如何匹配飞行员才能使皇家空军一次能派出最多的飞机?

不加思索的答案

  假设有m个英国飞行员和n个外籍飞行员,一个不加思索的答案是可以派出min(m, n)架飞机。事实并非如此,可以用图3轻易地反驳。

  图3

  a1~a4和b1~b5表示有4名英国飞行员和5名外籍飞行员,其中能够匹配a1、a3、a4的只有b2和b5,因此无法派出4架飞机。

二部匹配

  图3的模型称为二部图,也叫二分图。二部图的顶点分属于两个集合A和B,对于图中的每无向条边vw来说,都有v属于A且w属于B。基于二部图模型的匹配方案称为二部匹配。

  一种找到匹配的方案是使用穷举搜索,但是这种方案太过低效,找出最佳匹配可能要搜索所有的匹配方案。假设A集合中有m个顶点,每个顶点都能够发出k条边,那么穷举法在极端情况下需要执行km次才能得出结果,这种指数爆炸级的效率显然是不可接受的。

  网络流可以有效地处理二部匹配,再此基础上加上超级源点和超级汇点,并令每条边的容量为1,这就把一个二部图变成了一个流网络:

  由于每条边的容量都是1,因此网络流总是能够提供一个合法的匹配,使每个内部顶点至多只有一个单位的流,这相当于A中的顶点至多只能和B中的一个顶点相匹配。现在可以很容易地找到飞行员的匹配方案了。

 1 import network_flow as nf23 V_EN = ['a1', 'a2', 'a3', 'a4']4 V_FN = ['b1', 'b2', 'b3', 'b4', 'b5']5 s, t = 's', 't'6 V = [s] + V_EN + V_FN +  [t]7 E = [nf.Edge(s, pilot, 1) for pilot in V_EN] + [nf.Edge(pilot,t, 1) for pilot in V_FN]8 E += [nf.Edge('a1', 'b2', 1), nf.Edge('a1', 'b5', 1), nf.Edge('a2', 'b1', 1), nf.Edge('a2', 'b3', 1),9       nf.Edge('a2', 'b5', 1), nf.Edge('a3', 'b2', 1), nf.Edge('a4', 'b2', 1), nf.Edge('a4', 'b5', 1)]
10
11 class FordFulkerson_Pilot(nf.FordFulkerson):
12     def display(self):
13         print('最大网络流 = ', self.max_flow)
14         print('%-10s%-8s%-8s' % ('边', '容量', '流'))
15         for e in self.G.E:
16             if e.flow == 1:
17                 print('%-10s%-10d%-8s' % (e, e.cap, str(e.flow) + '*'))
18
19 G = nf.Network(V, E, s, t)
20 ford_fullkerson = FordFulkerson_Pilot(G)
21 ford_fullkerson.start()
22 ford_fullkerson.display()

  


   作者:我是8位的

  出处:http://www.cnblogs.com/bigmonkey

  本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!

  扫描二维码关注公众号“我是8位的”

网络流(4)——带有容量的顶点和二部匹配相关推荐

  1. SIGIR 2020 | 相似问题判定的二次匹配模型

    ©PaperWeekly 原创 · 作者|金金 单位|阿里巴巴研究实习生 研究方向|推荐系统 论文标题:Match²: A Matching over Matching Model for Simil ...

  2. 鸿蒙二部曲之一,网文封神之作,“鸿蒙二部曲”和“斗罗四部曲”你选择站哪边?...

    谈到网络小说,绕不过的就是辰东的"遮天三部曲".酒徒的"隋唐三部曲".西红柿的"鸿蒙二部曲".冰清玉洁唐三少的"斗罗四部曲&quo ...

  3. 二部六层电梯程序西门子1200二部六层电梯程序,无需eet可直接仿真使用

    二部六层电梯程序西门子1200二部六层电梯程序,无需eet可直接仿真使用,含有联控功能,有简单方案说明. 另有三部六层电梯程序 YID:1348645720626558笑叹红尘丨

  4. 二部六层电梯程序西门子1200二部六层电梯程序

    二部六层电梯程序西门子1200二部六层电梯程序,无需eet可直接仿真使用,含有联控功能,有简单方案说明. 现有:7438645720626558笑叹红尘丨

  5. 听普罗科菲耶夫的二部小提琴协奏曲

    我一直对后浪漫主义和现代派的音乐作品没有太高的兴致.昨天半夜从床上爬起来找CD听,无意间发现一张斯特恩演奏的普罗科菲耶夫的二部小提琴协奏曲,当时因为喜欢其封面设计买了回来,一直没好好听过.于是打算听这 ...

  6. 【我的保研经验】从中科院--计算所--到--自动化所--再到--空天院(电子所)二部--保研一路走来的欢乐与辛酸~《公开版》

    机缘巧合,博二遇到了实验室重组,俺现在在空天院七室哈,一个非常好的地方!导师们都非常nice!233333~欢迎学弟学妹们来看看~ 本篇是我此次保研经验的公开版,主要是笔者觉得之前有些东西过于详细,写 ...

  7. vue 生成二维码 并 可以下载带有边框背景颜色的二维码

    项目需求:需要生成一个可以下载且带有边框背景的二维码 如果只用qrcode.js只能实现下载二维码,但是下载下来的二维码没有边框背景,可识度非常低,所以需要给下载的二维码加个边框,白色灰色之类的 首先 ...

  8. 用QRCode生成带有中间logo图的二维码

    1.qrcode.jar下载的地址是:http://download.csdn.net/download/ilovejavas/6767365 2.下面是代码实现: 2.1.用来设置二维码一些基本参数 ...

  9. 研发二部二组-问题点归纳

    组内问题点+知识点 说明 大标题 #### 小标题 + 作者: chena chenj dengzb huangzs miaoyz zhux 文章目录 组内问题点+知识点 1.POI 的Excel处理 ...

  10. 多目标跟踪数据关联的二部图解:CVPR18多目标跟踪开创性深度端到端二部图匹配佳作《Deep Learning of Graph Matching》读后有感

    多目标跟踪算法的核心以及瓶颈之处,即是在得到两个set的DR(detection response,其中一个前序set可能是tracklets,但也由DR来表征)之后如何实现二部图匹配.传统的Hung ...

最新文章

  1. 如何高效的管理团队?提高组织能力是关键!
  2. 中间件中渲染Razor视图
  3. 施一公的另一位女弟子:4年8篇CNS论文,入选“未来女科学家”,未来有望比肩颜宁...
  4. kmeans算法学习2
  5. node.js下npm安装太慢,如何解决
  6. Python网络爬虫学习笔记(十):PyQuery库的使用
  7. OpenCV-向上采样cv::pyrUp向下采样cv::pyrDown
  8. angularjs绑定属性_AngularJS指令和数据绑定示例教程
  9. Java 随机数,可变参数,JDBC,访问控制
  10. spring是java ee框架吗,Java EE和Spring框架之间的区别
  11. 键盘按键用硅胶材料更好
  12. CSS安全字体的写法
  13. java学习心得---循环结构
  14. 时间序列模型ARIMA -- 唐宇迪
  15. mysql中数据字典_MySQL8.0之数据字典
  16. Java是什么?Java到底能干嘛?
  17. QEMU-KVM设备热插拔机制简析
  18. Cypress自动化测试:type
  19. [安卓按键精灵]彩色图片转黑白图(二值化)
  20. cuDNN免官网创建账户登陆迅雷下载网址

热门文章

  1. 《2020-2021中国开发者调查报告》发布了!
  2. 代码原理 webkit WebKit-利用百度siteapp开发网站App-(IOS和Android版本)
  3. Git设置代理服务器
  4. 苹果保修期查询_保修期还有6个月的IPhone X 换个“新”主板变“过保”了 维修点这样回应...
  5. JNCIE考试准备指南(ITAA 2014版)
  6. PermissionError: [Errno 1] Operation not permitted: '../middle_result/df_cleaned.csv'
  7. 【Windows Server 2019】企业虚拟专用网络服务的配置和管理(上)
  8. CAN bus 基础知识
  9. 第五篇 python计算新版个人所得税
  10. openffice安装(windows和linux)