数学建模社区-数学中国
标题: 【图论】【Matlab】最小生成树之Kruskal算法【贪心思想超详细详解Kruskal算法并应用】 [打印本页]
作者: 2744557306 时间: 2023-11-30 15:11
标题: 【图论】【Matlab】最小生成树之Kruskal算法【贪心思想超详细详解Kruskal算法并应用】
实际问题引入
+ Q# V6 `( p( `; d Y- ?
, [$ c- V5 C5 K0 n1 u, y: z( G实这道题的答案,其实就是找到这个图的最小生成树。8 ^: K$ i. B5 u+ {* b8 \) W- H% H4 q6 p
4 e# ?( f% R! D5 a7 Y/ OKruskal算法' J5 d8 |/ G o
此算法可以称为“加边法”,初始最小生成树的边数为 0,每迭代一次就选择一条满足条件的最小代价的边,加入到最小生成树边的集合里面。, A: {# r8 u" H4 T$ ?
其实核心思想就是贪心思想:通过局部最优达到整体最优
: M( d5 d" x2 f5 m8 {% g d
% h7 s5 W9 t; W' i. P7 z将所有的边权进行排序! u& v4 t4 r' n6 @ O* X6 ]
不断迭代选择权最小的边,直到所有的点被连起来(边数=节点数-1)。
+ |1 L) W- ]& x8 V在迭代期间,如果边构成了环,就要丢弃该边,因为树中是不存在环的!
3 c1 {4 R7 |3 @2 q9 \/ c整体代码展示
[4 g' _ k. ?! Z) a+ T u N在matlab中,最小生成树的生成直接用minspantree()函数就行。- s=[1,1,1,1,2,2,3,3,4,4,5,5,6];
. @7 J1 w0 X/ z( E7 [8 ^& N - t=[2,3,4,5,3,6,5,7,5,6,6,7,7];
: [, J3 C2 k$ m' } Q- x - w=[35,24,10,25,25,20,15,11,12,30,15,25,18];
4 W1 `6 M$ K O' i0 t - names={'1','2','3','4','5','6','7'};
; l8 W! @/ E0 T: f - G=graph(s,t,w,names);/ i+ s% T/ X+ @2 `9 M
- p=plot(G,"EdgeLabel",G.Edges.Weight);
4 k1 }8 z! m. W: d% N' o& l - % 求解最小生成树" i8 `; C) I# b, S4 ~! @: m$ e
- T=minspantree(G,"Method","sparse");
2 }: [+ ^2 K- y8 G0 A - % sparse代表的是Kruskal算法
) O+ u m, b# t4 E) W - % dense代表的是Prim算法+ ]: G# M- V" h
- $ x( f6 i, `1 V* ~) ^, b
- % sparse:Kruskal算法# `( v% Q w; @+ X% G9 f+ D
- % 算法按权重对所有的边排序,然后将不构成循环的边添加到树中" y! N% g/ `) ?- @, V& X
- p=plot(G,"EdgeLabel",G.Edges.Weight);" H% O8 O0 X8 _. B5 O4 w
- highlight(p,T,"NodeColor","red","EdgeColor","red"); . E: j+ V9 p* t1 }
- % 将最小生成树的边设置为红色!& p# {7 z" K! Q8 d8 R G
复制代码
* ?: b1 D% ^6 r$ k9 \4 C
( `9 ?$ [- Z6 m5 p# U( Y5 s. N# y生成的最小生成树:* E% I" j& {7 p& F$ Z5 `
- Q, S' ~" ?1 P' u0 B我们也可以把最小生成树的边和节点打印出来,也可以把整段路的权加起来看看:
2 i. A: R7 M0 K! X# F
尾声看到这里,相信我们已经学会Kruskal算法寻找最小生成树的过程了,当然,这离数学建模的要求,离我们的目标还非常遥远,博主在不断学习的过程中,也希望可以通过分享学习日记的方式带动大家!
# {( D3 {2 n6 [9 V' c" k: z
* k# E: u/ I0 m, s2 n+ q: `% g
-
a6d69d91254fe9e66009999ed24b2707.png
(208.21 KB, 下载次数: 171)
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |