500 likes | 667 Views
网 络 优 化. Network Optimization. 清华大学课号: 70420133 (研). 第 2 章 最小树与最小树形图 (第 1 讲). 清华大学数学科学系 谢金星 办公室:理科楼 2206# (电话: 010-62787812 ) Email:jxie@math.tsinghua.edu.cn http://faculty.math.tsinghua.edu.cn/faculty/~jxie/courses/netopt. 最小树问题 的例子. 例 公路连接问题
E N D
网络优化 Network Optimization 清华大学课号:70420133(研) 第2章 最小树与最小树形图 (第1讲) 清华大学数学科学系谢金星 办公室:理科楼2206# (电话:010-62787812) Email:jxie@math.tsinghua.edu.cn http://faculty.math.tsinghua.edu.cn/faculty/~jxie/courses/netopt
最小树问题的例子 例 公路连接问题 某一地区有n个主要城市,现准备修建高速公路把这些城市连接起来,使得从其中任何一个城市都可以经高速公路直接或间接到达另一个城市. 假定已经知道了任意两个城市i和j之间修建高速公路的成本(费用)wij (>0), 那么应任何决定在哪些城市间修建高速公路,使得总成本最小? • 高速公路网正好构成这个完全图G的一个连通的支撑子图T. • 为了使得总建设成本最小, 该子图必须是无圈的 无圈连通图称为树,上面这样一类问题称为最小树问题.
2.1树的基本概念 –定义 定义2.1 无圈连通图称为树(tree). 无圈图(即若干棵树的并)称为森林或者简称林(forest). 如果一个图的支撑子图是一棵树,则称这棵树为该图的支撑树或者生成树(spanning tree),并称支撑树中的弧为树弧(tree arc),而不属于支撑树中的弧为非树弧(nontree arc). 树是一类既简单而又非常重要的图形,在计算机科学、有机化学、电网络分析、最短连接及渠道设计等领域都有广泛的应用. 在本节及下一节中,我们假设所讨论的图与网络都是无向的.
2.1树的基本概念 –例 共有6种 例2.1 含6个顶点的树 (非同构的): 弧的条数 = 节点数 - 1 任何两个顶点之间存在唯一的一条路
2.1树的基本概念 - 树的等价定义 • 引理2.1 G=(N, E)为一个图,|N|=n,则下列命题等价: • G是一棵树; • G连通,且|E|=n-1; • G无圈,且|E|=n-1; • G的任何两个顶点之间存在唯一的一条路; • G连通,且将G的任何一条弧删去之后,该图成为非连通图; 6) G无圈,且在G的任何两个不相邻顶点之间加入一条弧之后,该图正好含有一个圈.
2.1树的基本概念 - 最小树的定义 定义2.2 G=(N,E,W)为一个无向网络,W为权函数, 即W: E→R(这里R表示实数集合). G中权最小(大)的弧称为最小(大)弧. 如果H=(N1,E1)为G的一个子图,子图H的权定义为H所包含的所有弧的权之和,记为W(H),即W(H)= . 弧e =(i,j)上的权常记为W(e),We或w(e),wij等 如果T*是G的一棵生成树,且对G的任何一棵生成树T都有 W( T*)≤W(T),则T*称为网络G的最小支撑树或者最小生成树(MST:minimum spanning tree),或者简称最小树. 图的最小树一般不唯一
2.1树的基本概念 - 最小树的应用一例 例2.2 二维矩阵数据存贮问题 某些蛋白质的氨基酸序列差异不多,如果用二维矩阵的每一行记录一种蛋白质氨基酸序列,行与行之间的差异很小. 其中一种方法是只存贮其中一行作为参照行,再存贮行与行之间的一部分差异信息,使得我们可以在需要时根据参照行生成所有其它行的元素. R1 C13 C12 C24 R3 R2 R4 一般地,给定差异信息cij,如何确定存贮哪些行之间的差异元素, 使得存贮空间尽可能少呢?这一问题可以用最小树问题来描述: 我们把矩阵每行作为一个节点构成一个完全图, 第i个节点对应于矩阵第i行,并令弧(i,j)上的权为cij. 对于存贮问题, 实际上只需要存贮一行的元素, 以及由该完全图的一棵支撑树所对应的差异元素. 最小树就对应于最优的存贮方案.
最小树的“割最优条件” T* 2.1树的基本概念 - 观察:支撑树删去一条树弧后形成两棵子树,图中两个端点分属于两棵子树的弧形成一个割. e e’ 定理2.1 生成树T*是最小树的充要条件是:对T*中的任何一条弧,将该弧从T*中删除后形成的割中,该弧为最小弧. 必要性:很容易用反证法证明。 设w(e)>w(e’),令T’ = T* - e +e’,则w(T* )>w(T’)
T* e 2.1树的基本概念 - 最小树的“割最优条件” e’ 充分性.设T*是生成树并满足定理中的条件但不是最小树,设最小树为T0. 记eT*\ T0, 将e从T*中删除后产生一个割. 将e加入T0后必然产生一个圈,该圈必然包括割中一条与e不同的弧e’,由假设,w(e)w(e’). 由T0为最小树,w(e)w(e’), 则w(e)=w(e’) ,因此, T1 = T0 - e’ +e也是最小树,与T*有更多的公共弧 重复这一过程,最后可以得到T*也是最小树
最小树的“圈最优条件” 2.1树的基本概念 - 观察:支撑树加上一条非树弧后包含一个唯一的圈 T* e’ e 定理2.1 生成树T*是最小树的充要条件是:对属于G但不属于T*的任何一条弧,将该弧加入T*后形成的圈中,该弧为最大弧. 必要性:很容易用反证法证明。 若w(e)<w(e’),令T’ = T* - e’ + e, 则w(T* )>w(T’),矛盾。
2.1树的基本概念 - 最小树的“圈最优条件” T* e e’ 充分性. 设T*是生成树并满足定理2.2中的条件,我们来证明它也满足定理2.1中的条件。 对T*中的任何一条弧e,将该弧从T*中删除后形成的割中,考虑任何一条与e不同的弧e’.由定理2.2中的条件假设w(e’)>w(e),即弧e为最小弧. 所以,满足定理2.1中的条件。证毕。
贪婪算法的共性 2.2 最小树算法 - 最直接的算法: “破圈法”–复杂度高,实施不易 贪婪算法(Greedy Algorithm): • 算法开始时假设某支撑子图T 的弧集合为空集; • 算法运行过程中不断将一些弧加入到子图中, 并且每次加入T 中的弧就会成为最后找到的最小树的一员,而不会再从T 中退出. 理论基础 - “割最优条件”和“圈最优条件”. 可以计算最小树, 自然也可以计算连通图的生成树. 如果算法结束时无法得到支撑树, 则说明图不连通, 因为连通图一定有支撑树. 可以计算最小树, 变形后可以计算最大树。
2.2.1 Kruskal 算法(1956) 2.2 最小树算法 基本思想:每次将一条权最小的弧加入子图T 中,并保证不形成圈. (避圈法) 如果当前弧加入后不形成圈, 则加入这条弧, 如果当前弧加入后会形成圈, 则不加入这条弧, 并考虑下一条弧. STEP0. 令i=1, j=0, T=.把G的边按照权由小到大排列,即 ; STEP1. 判断T {ei}是否含圈. 若含圈, 转STEP2, 否则转STEP3. STEP2. 令i=i+1. 若i m,转STEP1;否则结束,此时G不连通,所以没有最小树. STEP3. 令T=T {ei}, j =j+1.若 j=n-1, 结束,T是最小树; 否则转STEP1. 正确性:圈最优条件
1 2 1 6 7 3 3 4 8 5 4 5 2 2.2 最小树算法 2.2.1 Kruskal 算法(1956) 例2.3 用Kruskal算法计算最小树: 1 2 1 3 3 5 4 5 2
Kruskal 算法的计算复杂性 • 对m条弧进行排序, 其复杂度为 • 判断加入一条弧到T中时是否形成圈, 其复杂度依赖于算法的具体实现方法. 在算法的计算过程中, T是一个森林. 如果该森林的每一棵子树中的节点用一个单向链表表示,则可以方便地判断圈. 当考虑弧(i,j)时,如果其端点属于同一单向链表,则加入T后会形成圈;如果其端点分属于两个不同的单向链表,则加入T后不会形成圈,因此将这两个链表合并成一个链表. 由于处理每一条弧所需要的时间为O(n) ,因此这种实现方法的复杂度为O(nm).
Kruskal 算法的计算复杂性改进 算法实现改进:利用三个数组 size - 用来记录每个链表中所含节点的个数(链表规模); last - 用来记录每个链表中最后的节点编号 first - 用来记录每个节点所在链表的第一个节点. 如果链表L={1,2,4,5},则size(L)=|L|=4, last(L)=5, first(1)= first(2)= first(4) = first(5)=1. 考虑弧(i,j)时,只需判断first(i)与first(j)是否相等,相等则端点属于同一单向链表;否则合并链表. 因此所有这些判断所需要的计算时间为O(m). 合并时, 我们总是把节点数较多的链表L’ 放在前面, 而把节点数较少的链表L追加在后面.
Kruskal 算法的计算复杂性 合并后, 对于size和last的修改非常容易,可以在常数时间内完成; 但对first的修改必须对链表L中的每个元素(节点)进行, 复杂度为 O(h),h=size(L) . 这种合并最多进行(n-1)次, 对first 进行修改的总的复杂度为 记链表L追加在链表L’( , ) 后面而合并成一个链表时的计算时间(操作次数)不超过 p1h(这里p1为常数) 只需要证明获得一个规模为n的链表的计算时间(操作次数)不超过p2nlogn (这里p2p1为常数). 数学归纳法: 当n=1时不需要进行任何合并操作, 因此结论成立. 当n>1时, 我们假设结论对规模小于n 的链表均成立. 设规模为n的链表由L追加在L’后面合并而成, 则hn/2, h'=n-h. • p2hlogh+p2(n-h)log(n-h)+p1h • p2hlog(n/2)+p2(n-h)logn+p2h = p2nlogn. 算法最后复杂度: O(mlogn) 排序 O(mlogn); 其他O(m+nlogn).
1 2 1 6 7 3 3 4 8 5 4 5 2 Kruskal 算法(改进的实现) - 例 L1={1},size(L1)=1,last(L1)=1,first(1)=1; L2={2},size(L2)=1,last(L2)=2,first(2)=2; L3={3},size(L3)=1,last(L3)=3,first(3)=3; L4={4},size(L4)=1,last(L4)=4,first(4)=4; L5={5},size(L5)=1,last(L5)=5,first(5)=5. 首先考虑弧(1,2),将L1,L2合并成一个链表(如L1): L1={1,2},size(L1)=2,last(L1)=2,first(1)= first(2)=1.
1 2 1 6 7 3 3 4 8 5 4 5 2 Kruskal 算法(改进的实现) - 例 1 2 1 3 3 5 4 5 2 下一步考虑弧(4,5),将L4,L5合并成一个链表(如L4): L4={4,5},size(L4)=2,last(L4)=5,first(4)= first(5)=4. 下一步考虑弧(1,4),将L1,L4合并成一个链表(如L1): L1={1,2,4,5},size(L1)=4,last(L1)=5,first(1)= first(2)= first(4)= first(5)=1. 下一步考虑弧(2,5),由于first(2)=first(5),因此继续考虑下一条弧(3,5),将L1,L3合并成一个链表L1: L1={1,2,4,5,3},size(L1)=5,last(L1)=3,first(1)= first(2)= first(4)= first(5)= first(3)=1.
Kruskal算法的计算复杂性 Kruskal算法目前有更有效的实现方法,除了对m条弧进行排序所需的时间外, 其计算复杂性为 O(m (n,m)), 其中 (n,m)是用Ackerman函数(一种随m,n快速增长的函数)定义的某种“反函数”,它随m,n的增长非常非常缓慢,实用中通常可以认为它小于6(如当n=65536时, (n, m)不超过3 ).
2.2.2 Prim 算法(1957) 基本思想:不断扩展一棵子树T=(S,E0),直到S包括原网络的全部顶点,得到最小树 T.(边割法) 每次增加一条弧,使得这条弧是由当前子树节点集S及其补集所形成的边割的最小弧. STEP0. 设v为N的任意一个顶点,令S={v},E0= 。 STEP1. 若S=N,结束,T=(S,E0)为最小树;否则转STEP2. STEP2. 若 = ,则G不连通,结束;否则,设 其中 令 转STEP1. 正确性:割最优条件
1 2 1 6 7 3 3 4 8 5 4 5 2 2.2 最小树算法 2.2.2 Prim 算法(1957) 例2.4 用Prim算法计算最小树: 1 2 1 3 3 5 4 5 2
Prim算法的计算复杂性 • 该算法的主要计算量在于STEP2(寻找边割中的最小弧). 如果通过对每条弧进行检查寻找边割中的最小弧,则该步的计算复杂度为O(m). 因为STEP2最多执行n-1步,所以该算法的复杂度为O(mn). 特殊形式的PRIM算法 - DIJKSTRA算法(1959年) 距离标号d(v),记录的是顶点v到集合S的“距离”(边割 中以v为端点的最小弧的费用); 前趋标号p(v),记录的是边割中该最小弧的另一个端点.
DIJKSTRA算法(1959年) STEP0 设N={1,2,…,n}. 令S={1},E0=, dj=w1j , pj=1. STEP1 选取 若找不到这样的节点使最小值有限,则G不连通,结束; 否则令 STEP2 若S=N,结束,T=(S,E0)为最小树; 否则令 ,并修改相应的pj,转STEP1. 复杂度:STEP1: (n-2)+(n-3)+…+1 = O(n2) (STEP2同理) 利用各种形式的堆(Heap),可以得到PRIM或DIJKSTRA算法更有效的实现方法。复杂度为 或
2.2.3 SOLLIN 算法 (1961) 基本思想:前面介绍的两种算法的综合。每次迭代同时扩展多棵子树,直到得到最小树 T. STEP0. 对N中任意一个顶点i,定义Ni={i}. 令T= 。 STEP1. 如果T 中已有n-1条弧,则T为G的最小树;否则,对T 中的所有子树节点集合Nk,计算边割 中的最小弧,即计算 其中 . 然后继续STEP2. STEP2 对T中的所有子树节点集合Nk及最小弧 ,将该子树与jk所在的子树合并成一棵子树,并将该最小弧纳入T 中. 然后转STEP1. 正确性:割最优条件 该算法的主要计算量在于以下循环交替迭代: • STEP1(寻找边割中的最小弧) • STEP2(子树合并)
1 2 1 6 7 3 3 4 8 5 4 5 2 SOLLIN算法 - 例 1 2 1 3 3 5 4 5 2 开始时Ni={i}. 检查知:对于N1, N2,最小弧都是(1,2); 对于N3, 最小弧是(3,5); 对于N4, N5,最小弧都是(4,5); 下一步:合并N1, N2,即N1 =N2 ={1,2}; 合并N3, N5,即N3 =N5 ={3,5}; 合并N4, N5,即N3 =N4 =N5 ={3,4,5} 检查知:对于N1, N3,最小弧都是(1,4); 下一步:合并N1, N3,即N3 =N4 =N5 ={1,2,3,4,5} 结束
A(i) Nk Sollin算法的计算复杂性 • 该算法的主要计算量在于STEP1和STEP2的循环交替迭代. 由于每次循环迭代时,每棵树都会合并成一棵较大的子树,因此每次循环迭代都会使子树的数量至少减少一半. 所以,循环迭代的总次数为O(logn).每次循环迭代所需要的计算时间: 对网络中的每个节点赋予一个标号,使得当且仅当两个节点属于同一棵子树时,它们的标号相同(开始时节点i赋予标号i),此时可以方便地判断两个节点是否属于同一子树. STEP1:
Sollin算法的计算复杂性 • 该算法的主要计算量在于STEP1和STEP2的循环交替迭代. STEP1: 把每一棵子树中的所有节点存贮为一个双向循环链表,此时从该子树的任何一个节点开始,可以方便地访问它的所有节点. 因此,STEP1最多对每条弧进行两次检查,复杂度为O(m). STEP2: 在STEP2中,只需要根据STEP1找到的最小弧进行链表合并,并修改节点的标号,复杂度为O(n). 所以,算法总的复杂度为O((n+m)logn) = O(m logn).
布 置 作 业 目的 掌握树与最小树的基本概念 掌握最小树的几种常用算法及其复杂性分析方法 《网络优化》第77-78页 6; 7; 10; 11 内容 改错: 5、“最小树”指“包含指定弧的权最小的支撑树”
第2章 最小树与最小树形图 (第2讲) 网络优化 Network Optimization 清华大学课号:70420133(研) (最小树形图、最大分枝) 清华大学数学科学系谢金星 办公室:理科楼2206# (电话:010-62787812) Email:jxie@math.tsinghua.edu.cn http://faculty.math.tsinghua.edu.cn/faculty/~jxie/courses/netopt
2.3 最小树形图 –例 例2.6 信息传播 • “直接方式”:总经理直接传达; • “接力方式”:总经理只给某些部门经理打电话,而让这些得到信息的部门经理打电话将信息进一步传达给其他某些部门经理,依此类推,最后将信息传达到所有部门经理. • 如何决定传达信息的途径? • 信息传播是有向的,有一个“根”。 • 信息传播途径(忽略方向时)是一棵树。 以上结构称为树形图,上面这样一类问题称为最小树形图问题.
2.3最小树形图 –定义 定义2.3 有向图G=(V,A)若满足: (1)不包含有向圈; (2)存在一个顶点i使得d - (i)=0(即顶点i没有入弧),而对其余顶点j有d - (j)=1(即顶点j有且只有一条入弧); 则称G为以i为根(Root)的树形图(Arborescence),也称有根树(Rooted Tree)或外向树(Out-Tree). 定义2.4如果一个有向图的支撑子图是一个树形图,则称该树形图为该有向图的支撑树形图(或生成树形图). 有向网络中权最小的支撑树形图称为该网络的最小树形图.
2.3最小树形图 • 从树形图的根到每一个节点有且仅有一条有向路,这条路的长度称为该节点的代(即该节点关于根节点的层数). • 树形图在去掉每条弧的方向后,得到的无向基本图是一棵树,因此具有n个节点的树形图包含n-1条弧. 定义2.5 设v是网络N的任意一个节点,在所有指向v的入弧中,权最小的弧称为v的最小入弧. 由最小入弧组成的有向圈称为最小入弧圈. 若网络N的每个节点取最小入弧组成的子图是支撑树形图,则它就是最小树形图. (书上说法有误) 如果在网络N中,从每个节点取一条最小入弧,组成的子图是否就是最小树形图?
2.3最小树形图 –引理 H a 引理2.2 网络N每个节点取一最小入弧,组成的图记为H,则 (1)若|H|<n-1, (2)若|H|=n-1 , (3)若|H|=n , 则N没有支撑树形图; 且H不含有向圈,则H是N的最小树形图; 设a是H中权最大的弧,且H\a不含有向圈,则H\a是N的最小树形图. 证明(略) 最小树形图是否一定是H,或H去掉一条弧?
2.3最小树形图 –定理 由于树形图不含有向圈,因此| C \ T |=k2. 记C中不在T上的弧依次为 ,, …, 则C中余下的弧组成的有向路 ,, …, 都属于T. 定理2.3 设C是网络N的最小入弧圈,如果N存在支撑树形图,则存在N的最小树形图T满足| C \ T |=1. 证明假设定理不成立,在N的最小树形图中找一棵T使得| C \ T |最小. 不妨设 v’1是所有k个节点{v’1 ,v’2 ,… ,v’k}在T 中代数最小的节点,则 v’1在T 中不会是 v’2的后代 但由于v2在T 中是v’1的后代,所以 v2在T 中不会是 v’2的后代. C
a’1 2.3最小树形图 –定理 v’2在T 中一定有入弧(记为 a’1 ),则 T ’ = T+a2 -a’1 也是N 的支撑树形图. 因为 W(a2 ) W(a’1 ) 所以 因此T ’也是N 的最小树形图,且|C\T ’|=|C\T|-1 这与T 的取法矛盾. 故定理得证. 即:最小入弧圈中除一条弧外,包含在某个最小树形图中.
2.3最小树形图 –定理的意义 a* C a1 a 关键: 如果最小树形图的根节点在圈上,只需去掉圈上的一条弧(根节点的入弧)即可:记C中的最大弧为a*,则权和为W(C)-W(a*) 如果根节点在圈外呢?必须找一条从圈外指向圈上某节点的弧a来代替圈上指向该节点的弧a1: 替代后的权和为 W(C)+ W(a)- W(a1 ) 自然希望在上述两种可能性中使总权和增加的量尽可能小! 即要比较W(C)-W(a*)和W(C)+ W(a)- W(a1 ) 引入“收缩”的概念 ----- 弧a: “收缩”前的权: W(a) “收缩”后的权: W(a)- W(a1 ) + W(a*)
收缩网络 –定义 定义2.6 设C是有向网络N=(V,A,W)的一个有向圈,W为权函数. 记C的节点集为V(C),弧集为A(C). 定义N收缩C后得到的新网络N*=(V*,A*,W*)为: V*= V \V(C){y},(节点y称为收缩C后的人工节点) A*= A \A(C) , 其中a1是C中与a有相同末端的弧, a*是C中权最大的弧. 这一过程称为网络的收缩(Condensation),N*称为N的收缩网络(Condensed Network),可简记为N*=N/C. 收缩网络的最小树形图与原网络的最小树形图有何关系?
收缩网络 –定理 定理2.4 设C是网络N=(V,A,W)的最小入弧圈,N*=N/C=(V*,A*,W*)是N收缩C后得到的新网络. 如果T*是N*的最小树形图,则T*C包含了N的一棵最小树形图. 证明记a*是C中权最大的弧. 首先证明T*C中包含N中的一棵权为W*(T*)+ W(C)- W(a*)的支撑树形图. 下面分两种情况讨论
a0 a1 a* a* 收缩网络 –定理 (1)人工节点y在T*中有入弧(记为a0):设C中与a0有相同末端的弧为a1,则T1=T*C\a1为T*C包含的N中的唯一支撑树形图. (2)设人工节点y是T*的根节点:此时T2=T*C\a*为T*C包含的N中的一棵支撑树形图,且
收缩网络 –定理 根据定理2.3, 存在N的最小树形图T0使得|C\T0 |=1. 在收缩C后, T0变成N*中的支撑树形图T 0*, 因此 W*(T 0*) W*(T*) 类似于上面两种情况的讨论,可以进一步得到 W(T 0) = W*(T 0*) +W(C)-W(a*) 于是只能有W*(T 0*) = W*(T*),也就是说T 0*也是N*中的最小树形图.因为否则的话,T0不会是N中的最小树形图 (T1或T2才是N中的最小树形图). 所以 T1和T2是T*C中包含的N中的最小树形图,权为W*(T*)+ W(C)- W(a*) 证毕
朱(永津)-刘(振宏)算法(1965) 基本思想:收缩 –展开 (Edmons算法,1968) STEP0. 令m=1, N1(V1,A1,W1)=N(V,A,W) STEP1. 在Nm中对每个节点取一条最小入弧,组成的弧集记为Hm. 若|Hm|<|Vm|-1,则原网络没有支撑树形图;否则若|Hm|=|Vm| ,则去掉Hm中的权最大的一条弧(仍记为Hm),继续下一步;否则直接继续下一步. STEP2.若Hm不包含圈,则令Hm’=Hm,转STEP4;否则取Hm包含的一个圈Cm,继续下一步. STEP3.(收缩)对Nm收缩Cm得到新的网络Nm+1(Vm+1,Am+1,Wm+1),记人工节点为ym. 令m=m+1,转STEP1. STEP4:若m=1,则H1’就是N中的最小树形图,结束;否则继续下一步. STEP5:(展开)令Hm-1’ = Hm’(Cm-1\am-1’),其中am-1’是Cm-1中的一条弧:如果ym-1在Hm’中有入弧,则取am-1’为与该入弧有相同末端的弧; 否则am-1’取Cm-1中的权最大的一条弧. 令m=m-1,转STEP4.
朱-刘算法 –复杂性分析 上述算法实际上包括两大过程: 收缩(STEP1~STEP3)和展开(STEP4~STEP5). 每一个过程最多循环(n-1)次. 容易看出STEP1的复杂度为O(m),STEP2的复杂度为O(n),STEP3的复杂度为O(m),STEP4的复杂度为O(1),STEP5的复杂度为O(m)。 因此朱-刘算法的总复杂度为O(mn). 该算法同样可以用于计算最大树形图(只需将权反号即可). 对算法作一些小的改动,容易设计求具有固定根的最小树形图或最大树形图(留作练习).
3 3 5 1 5 3 2 2 6 3 3 1 2 2 6 3 3 5 5 4 4 2 2 6 y1 y1 朱-刘算法 –例 例2.7 求网络N 的最小树形图. N=N1 H1 N2 H2
5 5 y2 y2 6 3 3 5 1 2 2 5 2 y1 朱-刘算法 –例 例2.7 求网络N 的最小树形图. N3 H3=H3’ H2’ H1’
2.4 最大分枝 –定义 10 1 1 定义2.7 若有向图G 满足上节定义2.3中的条件(1)不包含有向圈;且满足:(2)对任意顶点j有d-(j)=0或1, 则称G为分枝(Branching). 分枝是若干树形图的并;树形图本身也是分枝的一种特殊情况 定义2.8 如果一个有向图的生成子图是一个分枝,则称该分枝为该有向图的支撑分枝(或生成分枝). 有向网络中权最大的支撑分枝称为该网络的最大分枝. 最大分枝中不会含有负权弧. 即使网络N中所有弧上的权均为正数,并且该网络N存在支撑树形图,N的最大分枝也不一定是支撑树形图(自然更谈不上是最大树形图).
Edmons算法(1968) 基本思想:收缩 –展开 (与朱-刘算法本质相同) STEP0. 令m=1, N1(V1,A1,W1)=N(V,A,W) STEP1. 在Nm中对每个节点取一条最大正权入弧,组成的弧集记为Bm. STEP2.若Bm不包含圈,则令Bm’=Bm,转STEP4;否则取Bm包含的一个圈Cm,继续下一步. STEP3.(收缩)对Nm收缩Cm得到新的网络Nm+1(Vm+1,Am+1,Wm+1),记人工节点为ym. 令m=m+1,转STEP1. STEP4:若m=1,则B1’就是N中的最大分枝,结束;否则继续下一步. STEP5:(展开)令Bm-1’ = Bm’(Cm-1\am-1’),其中am-1’是Cm-1中的一条弧:如果ym-1在Bm’中有入弧,则取am-1’为与该入弧有相同末端的弧; 否则am-1’取Cm-1中的权最小的一条弧. 令m=m-1,转STEP4. STEP3中的收缩与朱-刘算法中的收缩相同吗?
9 2 9 2 4 4 9 9 8 -1 4 5 9 9 6 6 4 2 2 y1 y1 3 3 5 -1 -1 9 9 6 6 4 EDMONS算法 –例 例2.8 求网络N 的最大分枝. N=N1 B1 N2 B2
y2 9 6 3 9 y2 y1 -1 5 4 8 -2 9 9 9 6 6 4 6 EDMONS算法 –例 例2.8 求网络N 的最大分枝. N3 B3=B3’ B2’ B1’
布 置 作 业 目的 掌握图形图和分枝的基本概念 掌握朱-刘算法和Edmons算法 《网络优化》第78-79页 13;16;19;20 内容