数学建模社区-数学中国
标题: 【图论】【Matlab】最小生成树之Kruskal算法【贪心思想超详细详解Kruskal算法并应用】 [打印本页]
作者: 2744557306 时间: 2023-11-30 15:11
标题: 【图论】【Matlab】最小生成树之Kruskal算法【贪心思想超详细详解Kruskal算法并应用】
实际问题引入
9 W. D, l: |2 i! @3 x& p* T
- C* m( _3 u. J" H3 e- J5 T
实这道题的答案,其实就是找到这个图的最小生成树。" g2 y+ V* I$ c% I( p; m0 E
9 U* z! S$ ?9 |; o S8 G0 QKruskal算法
% n" c0 h" `) h此算法可以称为“加边法”,初始最小生成树的边数为 0,每迭代一次就选择一条满足条件的最小代价的边,加入到最小生成树边的集合里面。+ L, k- p3 c0 |! f" ]
其实核心思想就是贪心思想:通过局部最优达到整体最优; J3 b* x/ R& {' b7 }- Y5 }0 Y: D
" e, [) J' _7 O3 |( ?0 J将所有的边权进行排序1 Q. n5 K8 Y4 ~# T3 S
不断迭代选择权最小的边,直到所有的点被连起来(边数=节点数-1)。& H6 N; Y1 g. g T4 ~
在迭代期间,如果边构成了环,就要丢弃该边,因为树中是不存在环的!
~& \% q, C) G- J5 [整体代码展示8 H5 X, K" d7 e$ r- T
在matlab中,最小生成树的生成直接用minspantree()函数就行。- s=[1,1,1,1,2,2,3,3,4,4,5,5,6];3 M2 B7 x9 {/ E$ @' n9 u% E
- t=[2,3,4,5,3,6,5,7,5,6,6,7,7];; N" b* F0 D/ L) m9 |) s
- w=[35,24,10,25,25,20,15,11,12,30,15,25,18];
- S. U: x- a1 V5 Z1 Z, e - names={'1','2','3','4','5','6','7'};
7 Z3 ]5 Y* F7 J& i - G=graph(s,t,w,names);
) _6 y# K6 E e1 R Y - p=plot(G,"EdgeLabel",G.Edges.Weight);: v4 t4 H# G( H0 J4 d9 V
- % 求解最小生成树, P) ] K; a% S# G. |2 a% \1 O
- T=minspantree(G,"Method","sparse");
, I! \- j; \6 D5 @ - % sparse代表的是Kruskal算法
; R/ ~: L" p. c% c+ S! L% J - % dense代表的是Prim算法
* P3 ^1 g' j) \2 ^( ]
1 i' x" {8 F9 z. `* z2 h- % sparse:Kruskal算法
3 x, V8 {9 \2 R; a8 g) d/ e; f - % 算法按权重对所有的边排序,然后将不构成循环的边添加到树中- z$ G9 ?6 X5 ]0 P
- p=plot(G,"EdgeLabel",G.Edges.Weight);- _7 O ~+ k) f& k
- highlight(p,T,"NodeColor","red","EdgeColor","red");
# ?4 M7 z; e6 @6 B: p - % 将最小生成树的边设置为红色!
5 C9 w) t5 @% Q
复制代码
) D3 f7 F- h) A- d
. M1 W/ q0 `8 ]$ o1 D
生成的最小生成树:
) o( t& [. m4 e8 W
: v: l) r. j+ ?% O W6 Z! h我们也可以把最小生成树的边和节点打印出来,也可以把整段路的权加起来看看:
8 g0 n3 ]& U0 c0 r# d _0 i4 ~尾声看到这里,相信我们已经学会Kruskal算法寻找最小生成树的过程了,当然,这离数学建模的要求,离我们的目标还非常遥远,博主在不断学习的过程中,也希望可以通过分享学习日记的方式带动大家!
/ A6 r& e( |4 j
. U! F% `3 ]7 w1 K/ [# @& q
-
a6d69d91254fe9e66009999ed24b2707.png
(208.21 KB, 下载次数: 199)
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |