网络流基础:理解最大流/最小割定理 蒋炎岩

  • 课程链接
  • 有向图的基本概念:
  • 问题引入
  • 直观感受反例
  • 引入重要概念:
  • 割的示例
    • 小结
  • 再来一个问题
  • 例子
    • 可以找到一条路径的情况
    • 可以找到两条路径的情况
    • 问题的转化
    • 那就试试问题的反面
    • 小结
  • 不相交路径问题的求解
    • 从一个错误的算法开始
  • 算法的改进
    • FORD-FULKERSON算法
    • 算法的进一步改进
    • 路径寻找与反向边
    • 小结
      • 残差网络的例子
    • 小结
  • 正式谈最大流最小割算法
    • 问题引导
    • 带权重的图与不带权重的图的转化
    • 关于网络流的定义
  • 结尾
  • 番外

课程链接

网络流基础:理解最大流/最小割定理 (蒋炎岩)
https://www.bilibili.com/video/BV1Q7411R7ie

有向图的基本概念:

问题引入

给定一个有向图,给定起点s和终点t,我们能否找到一条路径:So easy!

我们可以使用DFS,BFS找到路径,只是找到,但是没有给出证明;
也就是为什么路径不存在?DFS和BFS只是方法,并没有在理论上严格证明路径是不存在,我们希望理论上严格证明。

直观感受反例

在下面的图里求解s–>t是否存在路径:
不存在

为了给出严格证明,先给出所有s开头,t结尾的路径排列:

而在这里面,有些路径是不存在的,比如s->t的有向边
如果存在合法路径,一定满足上述排列

这个证明是严格的,但是存在问题:

再来看一下DFS/BFS是怎么找不到路径的

在这个问题中,我们利用DFS和BFS的算法,最后是可以把原图上的点分割为S和T的两个集合,如果不存在所求路径,则红色的边是一定不存在,即出发点在S集合,终点在T集合的点,但是可以有反向边。

引入重要概念:

割的示例


这个图的割为2

这个图的割为3

小结

所以我们之所以找不到一条路径是因为图中存在一个大小为0的割

再来一个问题

DFS和BFS可以帮助我们找到路径,找到1条路径,so easy!
找到k条路径,k>=2呢?BFS和DFS还能解决吗?

例子

可以找到一条路径的情况

可以找到两条路径的情况

问题的转化

求解它存在多少条路径的问题,可以等价转化为求解下面验证性的判定问题

首先验证k=1;
成立,则验证k=2;
成立,则验证k=3;
………………
………………
直到k=m+1不成立,这样,我们就求解得到了k的最小值m
这是一种好思路,但是怎么做呢?It is difficult!

那就试试问题的反面

小结

图中所有割的大小 L决定了可以找到k条路径的上限
我们目前已经找到的路径数m决定了可以找到k条路径的下限

不相交路径问题的求解

从一个错误的算法开始


我们可以使用贪心算法,在图中找到一条路径以后,就去掉这条路径,然后接着找下一条,但是问题是,贪心算法去掉的算法是正确的吗?会不会丢了不该丢的?
比如这样


这是同一个图
所以我们在错误的算法

算法的改进

FORD-FULKERSON算法

L. R. FORD, JR. AND D. R. FULKERSON MAXIMAL FLOW THROUGH A NETWORK 原文链接
http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/FordFulkerson1956.pdf

算法的进一步改进

非蒋炎岩老师提及内容
对FORD-FULKERSON算法进行了改进
提出了Boykov-Kolmogorov算法,提高求解速度,求解问题的本质没有变化
Yuri Boykov and Vladimir Kolmogorov An Experimental Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision:
https://www.csd.uwo.ca/~yboykov/Papers/pami04.pdf
回到正题
这个算法的重点:就是纠正过去的错误

路径寻找与反向边

左图:
错误的走法与正确的走法实质上只是差了那条被多次走过的边,因此只要调整这些反向边就可以了。
右图:
第一步:任意找到一条路径 L1 ,并将这条路径的边调整为反向边;
第二步:在原图的基础上,再找一条路径L2,并将这条路径的边调整为反向边;
…………
…………
直到DFS/BFS 算法终止
DFS/BFS算法会终止,是因为图中出现了大小为0的割。

将左下的图和右下的图进行对比,方向相悖的边就是我们要找的路径

小结

增广路径

残留网络

残差网络的例子

problem:已经找到三条路径P1,P2,P3,尝试再找到一条路径


当算法终止时,右图为残留网络
蓝色边为原来的边
绿色边是我们处理过的边
利用之前的假设,我们可以反证法证明,
当不存在s–>t的路径时,残差网络的割为0,原网络的割恰好为路径数,因为从T出发,到达S的边不可能穿过两次,穿过两次就会出现矛盾!!


因为割的大小决定了路径的上界,而实际上限制路径数的上界的关键,是所有的割中最小的那个割!
也就是说,我们求得的最小的那个割,实际上就是我们可以找到的最大的路径数

小结

目前我们就得到了***最小割和最大流定理的离散版本***

正式谈最大流最小割算法

问题引导


求解这样的问题,你可以得到一个带权重的有向图,本部分over,非蒋老师的课件内容

带权重的图与不带权重的图的转化

原图

可以在原图中允许两个点之间存在同向边,这样就可以理解为,权值为多大,边就有多少条。然后使用之前的算法求解,可以证明,这种情况下,算法仍然有效。

也可以直接求解x

引入之前的《算法导论》中的流的概念:
这里将权值视作路径上的容量,不允许有超过容量的路径存在
x1:表示s−>a−>b−>t的路径数x2:表示s−>a−>b−>c−>d−>t的路径数………………x_1:表示s->a->b->t的路径数\\ x_2:表示s->a->b->c->d->t的路径数\\ ……………… x1​:表示s−>a−>b−>t的路径数x2​:表示s−>a−>b−>c−>d−>t的路径数………………
对于权重的约束条件,应满足:
对边s−>a来说,应满足:x1+x2+x3+x4+…………<=20对边s->a来说,应满足:\\ x_1+x_2+x_3+x_4+…………<=20 对边s−>a来说,应满足:x1​+x2​+x3​+x4​+…………<=20
同时我们也得到我们要求解问题的最优表达式:
maxx1+x2+x3+………………+xpmax \space{ }x_1+x_2+x_3+………………+x_pmax x1​+x2​+x3​+………………+xp​

这样我们就得到了网络流问题的原始表达的线性规划问题
但是这样的线性规划的问题,如果使用一般的方法去求解,计算量巨大,十分不现实,所以,可以这样理解:
通过对这样的线性规划问题的图化,使得将它转化为图论问题,然后利用FORD-FULKERSON算法和Boykov-Kolmogorov算法求解,大大降低算法求解难度;

关于网络流的定义


对每条边的权重,认为是它的流量
概括起来就是,除了源点S和汇点T外,流入必定等于流出
可以证明:在满足约束条件的前提下,从s流出的流量一定全部流入t
所以为了求得最大流,只要最大化流出S的流:
所以我们可以得到更加简洁的线性规划表达式,从而降低复杂度.

最后简要提及了最大流问题和最小割问题的等价性
这里叙述的不是很清楚,建议直接查找《运筹学》的 对偶理论。

结尾

好了,蒋炎岩老师用了将近1个小时为你打开了最大流最小割算法的冰山一角,最后推荐了一本参考资料Jeff Erickson:《Algorithms》(可以下载pdf版本)
在此送上链接:
http://jeffe.cs.illinois.edu/teaching/algorithms/

番外

求解最大流最小割问题,在python语言里并不是难事,因为你总是可以

pip install PyMaxflow

然后接着

import maxflow

一个简单的例子:

import maxflow# Create a graph with integer capacities.
g = maxflow.Graph[int](2, 2)
# Add two (non-terminal) nodes. Get the index to the first one.
nodes = g.add_nodes(2)
# Create two edges (forwards and backwards) with the given capacities.
# The indices of the nodes are always consecutive.
g.add_edge(nodes[0], nodes[1], 1, 2)
# Set the capacities of the terminal edges...
# ...for the first node.
g.add_tedge(nodes[0], 2, 5)
# ...for the second node.
g.add_tedge(nodes[1], 9, 4)

pypi:
https://pypi.org/project/PyMaxflow/

帮助文档:

http://pmneila.github.io/PyMaxflow/tutorial.html

学习笔记:网络流基础:理解最大流/最小割定理 (蒋炎岩)相关推荐

  1. 【TensorFlow-windows】学习笔记一——基础理解

    前言 因为Theano已经停止更新了,所以在前面学完Theano搭建RBM,CNN,RNN相关结构以后,还是得选择一个主流框架的,由于我自身的学习最终是向强化学习靠近,可能用到的仿真环境是openai ...

  2. [ZJOI2009]狼和羊的故事【网络流】【最大流(最小割)】

    >Description 羊狼圈是一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.在羊狼圈中再加入一些篱笆,将羊狼分开.狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非 ...

  3. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  4. Java学习笔记之基础篇

    Java学习笔记之基础篇 目录 Java如何体现平台的无关性? 面向对象(OO)的理解 面向对象和面向过程编程的区别 面向对象三大特征 静态绑定和动态绑定(后期绑定) 延伸:类之间的关系 组合(聚合) ...

  5. HTML5学习笔记 —— JavaScript基础知识

    HTML5学习笔记 -- JavaScript基础知识 标签: html5javascriptweb前端 2017-05-11 21:51 883人阅读 评论(0) 收藏 举报 分类: JavaScr ...

  6. python input 拖入路径 去除转义 空格_python学习笔记(基础-2)(转载)

    1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 2.输入 如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变 ...

  7. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  8. ROS学习笔记五:理解ROS topics

    ROS学习笔记五:理解ROS topics 本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具. 例子展示 roscore 首先运行roscore系列服务,这是使用R ...

  9. Python入门学习笔记1-Python基础

    Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...

最新文章

  1. css媒体查询标准,CSS 媒体查询 - 实例
  2. Linux下的top命令
  3. 小手拍拍机器人_幼儿园互动儿歌游戏,小朋友瞬间变听话!
  4. RedHat5.2下Linux Oracle 10g ASM 安装详细实录-第二篇-ASM安装
  5. leetcode 142. 环形链表 II(set/快慢指针)
  6. Java并发编程之线程池ThreadPoolExecutor解析
  7. 如何低格台式计算机的硬盘,最新[电脑如何格式化]台式机如何格式化本地磁盘.doc...
  8. strip(),replace()和re.sub()用法
  9. H264之sps解析分辨率
  10. Cisco无线AP在复杂企业环境配置指南
  11. 高级商务办公软件应用【14】
  12. 大数据实训:实验二-基本SQL练习
  13. 中小企业监控体系构建实战--案例分享(内附传送门)
  14. Git使用小记——复制粘贴快捷键的修改
  15. Metricbeat监控Docker进程
  16. 图像区块分割与采样YUV4:2:0
  17. 详解Mysql执行计划explain
  18. Julia学习笔记:使用GLM包进行一元回归分析及模型拟合度检验
  19. 酷酷资源社网站同款xiuno模板/知乎蓝魔改版源码/附多个插件
  20. ZedBoard+Vivado(一)——纯PL实现流水灯

热门文章

  1. 四国军棋界面开发(4) 行棋规则和工兵路径
  2. 博文The Illustrated Transformer 的PDF格式
  3. 快播侵权上榜登北京互联网十大版权事件
  4. 3D相册动态桌面制作
  5. 基于jeesite+android开发 电子商务系统免费教程
  6. Cortex-A8与STM32的区别
  7. ESD静电不用怕,本文告诉你一些解决方法
  8. leaflet地图原理_Leaflet地图库
  9. 2013年主流小尺寸Android平板终极横评
  10. 计算机毕业论文5000字Word文档,计算机专业毕业论文格式范例