PUNCH算法

第一步:找naturalcuts, 将图分成很多个cell,同一个cell里的点捏成一个点,仅保留naturalcuts作为边。

把连接较为松散的区域切开。

输入:无向图

输出:cells

目标:连接边数最少(权重最小)

步骤:

1)广度优先遍历

定义参数U为理想的cell大小。随机选取一个点v,做广度优先遍历,遍历到U个点的时候停止。前十分之一的点位core,最外面一圈的点的邻接点为ring。找core和ring之间的mincut。

继续随机选不在core里面的点重复这一步,直到所有的点都至少在一个core里面。

找到所有cut边之后,将连通区域捏起来,这样就得到了若干个点,每个点的size都小于U。新的图上每个点和边的权重都是组成它的点和边的权重之和。

2)Greedy

将联系比较紧密的点继续合并。贪婪的过程。

选一条边的两个端点捏成一个点,选取的标准是:要合并那些相对小而联系很紧密的点,因此边的权重要大,点的权重要小。对每条边打分:



重复这一过程,直到继续合并任何一条边的端点都大于size U 了就不能再合并了。

3)Local search

随机将一个条边的两个端点解开,其它的点不解开在进行第二步greedy的过程。如果找到更优的结果则保存。继续迭代进行此步。

 

难点:

计算mincut,采用pushrelabel算法。


pushrelabel算法简介:

目标是求最大流。最大流等于最小割,求出了最大流,自然就求出了min cut.

把网络想象成一个给定容量的管道系统,源点s可以提供无限的水流出来,往汇点t流。中间的节点想象成一个蓄水池,在中间状态下,蓄水池可以蓄无限多的水,但是到最终的稳定状态,中间节点上是不能有水的。如果往汇点流不过去了,得退回到源点。

该算法规定,流只能从高点往低点流。开始时,源点S的高度为V(点的个数)。汇点T的高度为0。中间点的高度也为0.

每个点上要存储两个变量,高度h,余流e。 初始时,源点余流为无穷大,其它点的余流为0.

首先从源点s输送尽可能多的流出去,也就是先把s的邻接边充满,s的邻接点的余流e更新。接下来s的邻接点要把自身的余流继续往下压。对于点A,当它的邻接点的高度没有低于它自身的高度的时候,就压不出去了,这时就进行重标记操作,也就是把A的高度赋值成它邻接点的最低高度加1。  (问题:邻接边如果都充满了呢?)

最终,有可能s发出来的所有流都到达了汇点,也有可能到不了,因为管道容量有限制,通过任何割的流量收到割的容量的限制。继续进行重标记压入操作,将中间点的余流流回源点S


要证明两个问题:

1 这个算法能够终止

2 算法终止时,能找出最大流

 

提高效率:

残余网路的概念:如果一条边(u,v)的容量是C(u,v),上面个已经有流f(u,v)了,那么残余容量就是c(u,v)-f(u,v). 残余网络上的边的权全是正数。

算法初始时,每条边上的流f都为0,因此残余网络与原始网络的边权c相同。将残余网络的边反向,从汇点做广度优先遍历,就可以知道每个节点到汇点的距离,以此来设置节点的高度。避免了中间多次的进行relabel操作。

程序运行一段时间之后,在进行同样的步骤,对于从反向残余网络上,汇点广度优先遍历不到的点,可以知道,在残余网络上这些点到汇点没有路可以走了,也就是这些点到汇点的路径已经被流充满了。因此这些点可以不用处理了。

active node:
之前是:e(v)>0
改成:d(v)0
大约能提高两倍
2
初始状态
之前:d(v) = 0
改成:d(v) = min{distance(v,t),n}
3
存储active node的结构
两种方式,1 FIFO队列,O(n3); 2 每次选取d最大的active node,O(n2根号m)
global relabeling:从汇点做广度优先遍历,为图中的所有点设置新的高度。初始状态是所有点的高度设为n,汇点高度设为0,然后从残余网络上做广度优先,得到每个点到汇点的距离作为其新的高度,这样可以知道哪些点从汇点到不了了,这说明这些点到汇点的路上所有管道都已经满了,这样的点就可以不处理了,直接变成unactive
gap relabeling

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值