数学建模社区-数学中国
标题: 【图论】【Matlab】最小生成树之Kruskal算法【贪心思想超详细详解Kruskal算法并应用】 [打印本页]
作者: 2744557306 时间: 2023-11-30 15:11
标题: 【图论】【Matlab】最小生成树之Kruskal算法【贪心思想超详细详解Kruskal算法并应用】
实际问题引入' d) P! y) e: p" r% q. U
1 ?! B. m d/ F6 f5 q
实这道题的答案,其实就是找到这个图的最小生成树。
* P: ?% X6 I# u. C) b% J6 @( K5 O7 w, J g
Kruskal算法
# m% T/ G" L a此算法可以称为“加边法”,初始最小生成树的边数为 0,每迭代一次就选择一条满足条件的最小代价的边,加入到最小生成树边的集合里面。; G7 W1 q& I# h$ l
其实核心思想就是贪心思想:通过局部最优达到整体最优
% c0 q q! e( l$ u4 w
# W4 K" E" v- K8 O a将所有的边权进行排序
9 P3 M8 S o3 U! g4 Q- `不断迭代选择权最小的边,直到所有的点被连起来(边数=节点数-1)。
& s# ^7 v0 `2 | x0 a8 _在迭代期间,如果边构成了环,就要丢弃该边,因为树中是不存在环的!1 c% Z/ p A! W y4 Y7 \; ]% H2 @
整体代码展示
7 D4 \7 G/ @9 t在matlab中,最小生成树的生成直接用minspantree()函数就行。- s=[1,1,1,1,2,2,3,3,4,4,5,5,6];
* v' L; S3 w! m. k5 Q. l: s8 ` - t=[2,3,4,5,3,6,5,7,5,6,6,7,7];. x7 H- B; o a/ O( p
- w=[35,24,10,25,25,20,15,11,12,30,15,25,18];* h. g: ~* a8 u/ x5 ]
- names={'1','2','3','4','5','6','7'};
. L+ i0 I, D5 w& t. n- j - G=graph(s,t,w,names);
% I* w. b B# Y' D! Y9 x8 K - p=plot(G,"EdgeLabel",G.Edges.Weight);' u5 H4 h' X& X. g4 P n! W; ]
- % 求解最小生成树9 e4 |. V3 O1 [% W$ I- s
- T=minspantree(G,"Method","sparse");; C6 X3 [( i* M; W. z, N* o
- % sparse代表的是Kruskal算法; i, n5 i) M# \; P+ q
- % dense代表的是Prim算法
. ]" ?: F* T1 {6 e# w
' h7 m- @) @4 |: W- % sparse:Kruskal算法
6 |% `5 y. P! q( D9 _5 r4 D - % 算法按权重对所有的边排序,然后将不构成循环的边添加到树中9 _# W2 \) f _: V% e: R" ?: B
- p=plot(G,"EdgeLabel",G.Edges.Weight);" J% z% t" W& \
- highlight(p,T,"NodeColor","red","EdgeColor","red");
/ y3 I+ u- i% N% j - % 将最小生成树的边设置为红色!
3 s" l' R7 J; t4 { }
复制代码
, h4 w) d/ K. e' Q* C
: `: Y1 x! V5 ~; ]) q |: f9 e4 E
生成的最小生成树:3 J' U6 A" l: m- p1 f2 {
# p! ~" G' }( y4 w5 }' P
我们也可以把最小生成树的边和节点打印出来,也可以把整段路的权加起来看看:
" N7 m- [. p3 _: b4 [ N0 _$ }( M尾声看到这里,相信我们已经学会Kruskal算法寻找最小生成树的过程了,当然,这离数学建模的要求,离我们的目标还非常遥远,博主在不断学习的过程中,也希望可以通过分享学习日记的方式带动大家!
! }- K. `- s( x+ v1 `5 |
2 Y% \) \; O. w: F( {
-
a6d69d91254fe9e66009999ed24b2707.png
(208.21 KB, 下载次数: 184)
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |