PUNCH

简介

PUNCH (Partitioning Using Natural Cut Heuristics)

论文链接:https://www.microsoft.com/en-us/research/wp-content/uploads/2010/12/punchTR.pdfhttps://www.microsoft.com/en-us/research/wp-content/uploads/2010/12/punchTR.pdf

目标

  • 将图G=(V,E)合理划分为小区间
  • NP-Hard
  • 致力于最小化割边数

特性

  • 保留吸纳天然分区(如路网,桥,山脉等)
  • cell之间维持通路

两个阶段

  1. 过滤识别切割图中的密集区
  • 大幅缩小图的体量,同时保留原有结构
  • 对于天然边界没有贡献(通路)的边被缩减裁剪
  1. 剖分图重组cell优化
  • 一个更好的局部搜索算法
  • 只对碎片进行合并,不进行拆分

算法详解

定义

  • 输入是一个无权图 G=(V,E),v ∈ V,每个点有size s(v),e = {u,v} ∈ E 有正权值w(e)或w{u,v},cell的大小cell size 或 U. G是联通图
  • 对集合C ⊆ Vs(C),s(C)是cell C内节点的总数
  • 对V的剖分P={V1, V2, ..., Vk}是若干V的不相交子集,V1到Vk的并集等于V
  • 对于一个边{u,v},若u ∈ Vi且v !∈ Vi则称之为一个割边
  • 对于一个集合S ⊆ V,令 δ(S)={{u,v} : {u,v} ∈ E, u ∈ S, v !∈ S}为恰好只有一个节点在S内的边的集合,即连接两个cell的边
  • 一个剖分P中的边界边的集合为δ(P)
  • 图剖分问题的目标是寻找cell大小为U的最小切剖分

过滤阶段

目标

使割边尽量稀疏,缩小原始图的体量。检测并压缩相对密集区域内的边。

缩点

重连通分量 (Biconnected Component)_乐吾天-CSDN博客

C++学习笔记:图论--缩点详解_C20201018的博客-CSDN博客_缩点

  • 要压缩u和v,我们将他们用点x代替,s(x) = s(u) + s(v)。
  • 对于每个边{u,z}或{v,z}(z !∈ {u,v}),新建一个权值相等的边{x,z}
  • 压缩一个边集时,反复缩减直至剩余唯一一个点
  • 压缩一个边就是压缩它的两个端点

两个阶段

寻找微小割

这个阶段寻找微小割,比如仅有两个割边的割

  1. dfs搜索所有的重连通分量(biconneted components),得到树T。树的根为连接边数最多的分量。然后自顶向下遍历T,当到达一个size小于等于U的子树时,将子树缩减为单节点p。对于节点在父分量中的邻居q:

若      1) 子树size至多为 τ (自定义)        2) s(q)+s(p)<=U

则 将p合并至q

  1. 识别所有度为2的点,把它们占据的路径缩点,除非缩点后size超过U
  1. 接下来进行2-cuts。

对于剖分P来说,(e, f) ∈ P 等价于e=f 或 e和f构成二切,但是e和f单独都不构成1切。使用Pritchard and Thurimella算法可以在线性时间内得到这些等价类,然后再对它们一一处理。

对于一个类S ⊆ E,首先计算图Gs = (V,E\S)的连通分量,然后将所有大小至多为U的分量缩点。

对于等价类的处理:同时遍历两个等价类,从等价类的任意边开始遍历包含其起终点的两个分量,遍历完成一个分量时,沿环的顺序遍历下一个等价类。

遍历完k-1个分量后(k是分量的数量)停止。现在只有最大的分量没有被遍历,这个分量中包含了原图中的绝大多数点。

自然割的随机启发

自然割不对割边数进行预设。简单的说,自然割是一种稀疏割(割边很少,接近最优解)。该算法在图中寻找合适的自然割,并确保每个点都在一个自然割中。

最小稀疏割(割边数最小)是NP-Hard问题

通过计算点集间最小割,我们可以得到一种好用且易处理的自然割,可以由标准s-t割算法得到,如push-relabel。

具体步骤

  • 该算法通过迭代实现
  • 每次迭代:选取一个点作为中心点,生成bfs树T,当s(T)=aU时停止(0<a<=1是参数)。将T在V\T中的邻居成为v的环(ring)。将v的核(core)定义为T的size小于aU/f时加入T中的点的集合,f>1是第二个参数。暂时将核缩为一个点s,将环缩为一个点t,计算s-t的最小割。
  • 选取中心点的规则:在未被选入核的点中随机选择v,找不到这样的点时停止迭代。

  • 可以重复上述过程C次,C(coverage)是第三个自定义参数
  • 上述迭代结束后,对Gc = (V,E\C)(C是上述过程中产生的割边的集合)中的连通分量进行缩点,将缩点后的分量称为碎片(fragment)。

  • a<=1确保缩点图中的碎片的size不超过U。因此转换后的问题(等价类)仍然可以被剖分为大小至多为U的若干cell,一个由此得到的剖分可以被转换成一个适用于原问题的解。
  • 最后,自然割的生成过程非常适合并行运算。

组装阶段

目标

找到最终的剖分结果

思路

过滤阶段生成的图在此阶段作为输入。尽管是碎片组成的图(而不是原始的图),为了简化,在这个阶段我们仍然把它称为G=(V,E)。对这个图的所有有效剖分就对应了一个对原图的有效剖分,并且具有相等的cost。为获得好的剖分结果,组装阶段运用了几个工具:贪心算法,local search,和一种启发算法。

贪心算法

使用一个随机贪心算法来搜寻一个合适的初始剖分。

  1. 选取相邻两个点缩点,重复进行直到不能进行新的缩点(达到sizeU限制)。
  1. 选取的两个点{u,v}的size的和至多为U,且在符合条件的相邻点对里要满足score函数的值最小。
  1. score函数是一个以两个点的大小和两点形成的边的权值作变量的随机函数。score({u,v}) = r * w{u,v} * (sqrt(1/s(u) + sqrt(1/s(v)),r是0-1之间的随机数。
  1. 直观上,我们希望合并相对较小但紧密相连的点。
  1. 具体的方程基于一个观察:在路网中,一个size为k的地区大约有O(sqrt(k))个出边。
  1. 通过加入两个独立的碎片,我们隐式地提高了较小区域的重要性。
  1. 随机项(r)与本地搜索(local search)和多起点启发式存在相关性。
  1. r的取值趋向1,以此保证这个决定性的项不要太小。
  1. 实际采用了两个0-1之间的常量a和b。有a的概率随机选取[0,b]之间的一个数作为r,a-1的概率选取[b,1]之间的数作为r。本文中最后采用了a=0.03,b=0.6
  1. 对于一对点,score方程只计算一次并缓存,在一次缩点之后,受到缩点影响的(即包含缩点的)所有的边的score被新的随机项重新计算得出。

本地搜索 Local Search

贪心算法可以接受,但是本地搜索可以极大的优化贪心算法。本地搜索将现有的剖分视为一个缩点图H。H中的每个点对应剖分中的一个cell,且对于两个cell R和S,如果G中存在{u,v}:u ∈ R且v ∈ S,则R和S间有一条边相连{R,S}。{R,S}的权值(weight)即G中相应边权值的和。

整体思路

  1. 创建一个辅助对象G' = (V', E'),G'由现有剖分的cell的连通子集构成。
  1. 在这个辅助对象中,一些cell被解压缩了(即分解为G中的成分碎片),其他的cell保持压缩状态不变。E'中边的权值等于G中相应的边的权值的和。
  1. 在G'中运行贪心算法,然后用结果来自然构造G的相对优化解H'。如果H'比H的效果好,就用H'代替H,否则称为再优化步骤失败,H仍为解。

参数调优

本地搜索的区分在于怎样构造辅助对象G'。

  1. 最简单的方法是选择两个相邻的cell{R, S}并构造包含解压缩版本的R和S的辅助对象G'rs。将这一变体称为L2。
  1. 第二种变体L2+跟第一种类似,但是它在H也包含了G'rs中R和S的(已压缩的)邻居。
  1. 第三种变体L2*将L2+中的邻居cell也解压缩了。

对于所有的变体而言,cell对{R, S}完全决定了每个步骤。然而对于再优化这个过程本身,却是启发和随机的。在实践中,值得对同一对{R, S}进行多次再优化过程。对每对{R, S},我们维护一个计数器Ψrs。它只记录再优化失败的次数。如果再优化成功了,则重置H'中至少有一个端点在未压缩区域G'rs中的所有的边(即G'rs的出边)的计数器。

引入自定义参数Ψ>=1,当一对{R, S}的计数器大于Ψ时,对其的再优化停止。在所有Ψrs < Ψ的对{R, S}中随机选取下一个再优化对象。如果此时不存在符合条件的对,本地搜索算法结束。更大的Ψ带来更优的解,但是会导致更长的运行时间。

从左至右:L2:再优化两个未压缩的cell对应的辅助对象;L2+:也包含了压缩后的相邻cell的辅助对象;L2*:相邻的cell也是未压缩的。

本文还尝试了并行计算对算法进行优化。

多起点与组合 Multistart and Combination

运用两个策略优化解的质量:

  1. 多起点启发

在每次迭代中,运行随机贪心算法然后对所得结果应用本地搜索,这两个算法都是随机的,因此不同的迭代中产生的解可能截然不同。在M次迭代后(M是一个参数),算法结束并且返回最优解。

  1. 组合解

通过组合在多起点启发过程中生成的解可以找到更优的剖分。

维护一个优质解池,池的容量为k(参数),储存现有的若干最优剖分。一种合理的k的取值为⌈sqrt(M)⌉。这种做法是进化方法的一种标准应用,在遗传算法、路径重连算法等组合优化启发法中很常见。

在多起点算法的前k次迭代中,我们简单地将所得的剖分P加入池中。每个随后的迭代也以产生新的剖分P为开始,但是P并不是直接加入到池中,而是首先从池中随机选取两个解,组合后算得一个新的解P'。随后将P和P'组合,得第三个解P''。最后,我们尝试将P'',P'和P依次插入到池中。

随后将演示如何组合两个解以及如何决定是否将一个新的解插入到池中。

组合

令P1和P2为两个剖分。组合它们的目的是为了得到第三个解P3,P3是两个解的优点的结合。

直观上如果P1和P2“一致认为”边(u, v)在两个区域的边界上(即同时为P1和P2的边界边),那它很有可能也是P3的一条割边。该算法对这一直觉的实现如下:

  1. 创建一个新的对象G',G'拥有与G一样的点和边。对于每个边e,定义b(e) ∈ {0, 1, 2}为P1和P2中(u,v)为边界边的解的数量。
  1. G'中e的权值w'(e)是G中e的原始权值w(e)乘以一个正微扰因子 ,自变量为b(e)。
  1. 直观上,因为低权值的边更有可能是边界边,因此为了使P3模仿P1和P2,我们希望p0 > p1 > p2。

算法本身对具体参数的选择并不是很敏感。文中用的p0=5,p1=3,p2=2。

池管理

目的是保留算法找到的优质解。

  • 当池子中解的数量小于k时,任何向池中加入解的请求都会被通过。
  • 当池子达到上限时,我们需要判断一个新的解P可不可以被加入,如果加入,需要找到一个解跳出。
  • 如果池中的解都比P更优,则不对池子做任何操作
  • 否则从池中寻找跟P最像的一个解排出池子
  • 两个解的diff定义为它们割边集合的对称差的基数。
  • 这个替代策略可以确保池子中解的多样性,已经展示出对其他类似进化算法的有效性。

均衡剖分

如上所述,PUNCH解决了一般(标准)的图剖分问题,其对于解中cell的数量没有硬性限制,只对cell的size做上限限制。接下来我们来探究如何利用PUNCH来计算均衡剖分。

在这个算法变体中,入参是cell的数量k,不平衡上限ε。剖分者需要找到size至多为(1+ε)⌈n/k⌉,n是原图中点的总数。

  • 为寻找cell的数量最多为k的ε均衡剖分,我们首先利用上述算法产出一个标准剖分,满足U=⌊(1+ε)⌈n/k⌉⌋。得到的cell的数量l有可能大于k,对于这种情况需要一个再均衡算法:选取k个基础cell,向他们分配剩余l-k个基础cell的碎片,这个算法牺牲了cell的连通性。
  • 算法的详细步骤如下:
  1. 为选取基础cell,原始解中的每一个cell C被赋值了一个score: (2+r)s(C),r的值是0到1的一个随机数,分数最高的k个cell被选取为基础cell。
  1. 以V1,V2,...,Vk标记基础cell,令W为剩余cell的碎片。
  1. 开始迭代:
  1. 每一轮迭代中,令 ,找到以U'为cell上界的G[W]的剖分P' (G[W]为W诱导产生的子图)。
  1. 以如下规则启发合并P'中的cell:
  1. 以size的降序处理P'中的cell
  1. 选取一个cell C ∈ P',在所有满足s(Vi)+s(C)<=U的基本cell Vi中以一个与1/s(Vi)成比例的概率选取Vi与C合并。
  1. 如果没有base cell满足条件,跳过:C将在下一轮中被分解
  1. 如果所有的C都可以被安置,启发合并结束
  1. 否则,将U'减小后进行下一轮重新计算一个新的剖分P'(已修改过的基础cell需要被重新计算)
  1. 因为再均衡算法是随机的(且较快),我们可以针对一个初始解多跑几次,从中选择最优解。
  1. 到此为止,该方法仍有可能出现碎片的size过大的情况,尤其当ε特别小的时候,这将导致剖分无法被再均衡。因此在计算均衡剖分时,在初始的过滤阶段实际采用U/3,使产生的碎片更小。如果此时再均衡流程仍然失败,我们可以继续减小过滤阶段的阈值并重新计算。

PUNCH图剖分浅析相关推荐

  1. 雷锋读图:浅析移动应用软件现状

    根据DCI(Dot Com Infoway)的统计,移动应用数量在过去的三年里增加了300,000个.而在三大平台的应用中,iOS应用总数超过了585,000个,而Android和Windows Ph ...

  2. 功利主义穆勒思维导图_浅析穆勒的功利主义思想及现实意义

    03

  3. 分享Silverlight/WPF/Windows Phone一周学习导读(1月17日-1月23日)

    上周微软Silverlight团队发布"微软发布Silverlight Native Extensions 1.0 - 扩展OOB应用功能",对于Silverlight开发人员而言 ...

  4. 数据结构于算法—线性表

    目录 前言 线性表基本架构 顺序表 插入 删除 其他操作 链表 基本结构 插入 带头节点与不带头节点 插入尾 删除 其他 代码实现 顺序表 链表 测试与结果 总结 原创公众号:bigsai 文章收藏在 ...

  5. 线性表、顺序表和链表,你还分不清?

    摘要:其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系! 本文分享自华为云社区<程序员必会自己设计线性表(顺序表.链表)>,原文作者:bigsai. 前言 其实说实话 ...

  6. 数据结构与算法之线性表(超详细顺序表、链表)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容 ...

  7. 计算机科学计算百度云,科学计算

    科学计算是指利用计算机再现.预测和发现客观世界运动规律和演化特征的全过程.科学计算为解决科学和工程中的数学问题利用计算机进行的数值计算. 中文名 科学计算 外文名 Scientific Computi ...

  8. 【有限元分析】apdl建立菩萨三维模型+FLAC3d力学计算

    稳定性计算采用如下过程完成,首先对三维扫描数据进行提取,建立菩萨的结构模型,然后在Ansys中通过APDL程序编程建立起三维数值模型,在FLAC3d中进行三维力学计算. 计算参数及模型建立 对拟开展保 ...

  9. 北京应用物理计算机与科学,北京应用物理与计算数学研究所

    邓稼先创新研究中心 "超大规模并行算法研究"团队介绍2 1. 2. 3.翻看上一页 4. 代表性科研成果 著作: 1. 谷同祥,徐小文,刘兴平,安恒斌,杭旭登编著,迭代方法和预处理 ...

最新文章

  1. 计算机四级嵌入式真题,2014年3月计算机四级嵌入式工程师真题试题及答案
  2. 钉钉如何调整组织架构_阿里宣布新一轮组织架构调整:明确大文娱一号位,钉钉进入阿里云...
  3. mysql根据某个字段的不同状态的值进行统计
  4. 知乎高赞、高逼格 1024 程序员节礼物
  5. 程序员编程10大原则,请牢牢记住!
  6. python代码风格检查工具──pylint
  7. [CentOS]CentOS下编译CPP文件时报错[undefined reference to `__gxx_personality_v0' collect2: ld]的解决办法...
  8. Feature flag,一个让软件发布轻松不掉发的神技
  9. Hadoop相关问题解决
  10. Android内核剖析pdf
  11. 【2021最新版】Kafka面试题总结(25道题含答案解析)
  12. 差分GPS-RTK-千寻
  13. PyQt5的Label鼠标的划过和单击
  14. WINDOWS 7 X86专业版SP1后续补丁包20150901(微软官方下载地址列表)
  15. 锦鲤阅读自动阅读问题解答,小白必看!
  16. 网易互娱动效设计师 | 游戏动效与美术特效的区别
  17. CentOS7上安装Snipe-IT4.6.3详细过程及注意事项
  18. 使用lupdate生成Qt的ts翻译文件
  19. python的pyaudio教程入门_Python豪杰物语:pyaudio的安装播放音频示例
  20. java 批次号,java重复批次执行

热门文章

  1. AD16实现板框挖空
  2. 神了!有人用一个项目把23种设计模式与六大原则融会贯通了
  3. 在GPT分区的磁盘上创建ESP分区图文教程
  4. oracle RAC asm管理
  5. 将JAVA bean/实体类 中为null的属性值转换成空字符串
  6. cxxxxx和xxxxx.h的区别
  7. PWN-CTF:gef工具安装
  8. 堆溢出(二)空表DWORD SHOOT
  9. 网易互联网雷火互娱22届校招及社招内推
  10. 3、Java 的变量和数据类型