【数学建模算法】(9)树

作者: 热爱学习的高老板 | 来源:发表于2019-08-11 15:22 被阅读4次

1.基本概念

联通的无圈图叫做,记做为T。若图G满足V(G)=V(T)E(T) \subset E(G)则称TG的生成树。图G联通的充分必要条件为G有生成树。一个连通数的生成树很多,用\tau(G)表示G的生成树的公式,则有公式:

\tau\left(K_{n}\right)=n^{n-2}K_{n}代表有n个顶点的完全图)
\tau(G)=\tau(G-e)+\tau(G \cdot e)G-e代表从G中删除边eG \cdot e表示把e的长度)

树有下面常用的五个充要条件:

1.G是树当且仅当G中任二顶点之间有且仅有一条轨道。
2.G是树当且仅当G无圈,且\varepsilon=v-1
3.G是树当且仅当G联通,且\varepsilon=v-1
4.G是树当且仅当G联通,且\forall e \in E(G), \quad G-e不连通。
5.G是树当且仅当G无圈,\forall e \notin E(G), \quad G+e恰有一个圈。

2.应用——连线问题

欲修筑连接n个城市的铁路,已知i城和j城之间的铁路造价为C_{i j},设计一个线路图,使总造价最低。
连线问题的数学模型是在联通赋权图上求权最小的生成树。赋权图上具有最小权的生成树叫做最小生成树
下面介绍构造最小生成树的两种常用算法。

2.1.prim算法构造最小生成解

设置两个集合PQ,其中P用于存放G的最小生成树中的边。令集合P的初值为P=\left\{v_{1}\right\}(假设最小生成树时,从顶点v_{1}出发),集合Q的初值为Q=\Phi。prim算法的思想是,从所有p \in P, \quad v \in V-P的边中,选取具有最小权值的边pv,将顶点v加入集合P中,将边pv加入集合Q中,如此不断重复,直到P=V时,最小生成树构造完毕,这时集合Q中包含了最小生成树的所有边。

prime算法如下:
1.P=\left\{v_{1}\right\}, \quad Q=\Phi
2.while P \sim=V
\quad 找最小边pv,其中p \in P, v \in V-P
\quad P=P+\{v\}
\quad Q=Q+\{p v\}
end

例1 利用Matlab生成下面这张图的最小生成树

例1图
clc;clear;
a=zeros(7);%定义权值矩阵
a(1,2)=50; a(1,3)=60;
a(2,4)=65; a(2,5)=40;
a(3,4)=52;a(3,7)=45;
a(4,5)=50; a(4,6)=30;a(4,7)=42;
a(5,6)=70;%赋值
a=a+a';%对称矩阵 
a(find(a==0))=inf;%没有直接通路的定义为无限大
result=[];p=1;tb=2:length(a);
while length(result)~=length(a)-1
    temp=a(p,tb);temp=temp(:);
    d=min(temp);
    [jb,kb]=find(a(p,tb)==d);
    j=p(jb(1));k=tb(kb(1));
    result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];
end
result

2.2 Kruskal算法

1.选e_{1} \in E(G),使得w\left(e_{1}\right)=\min
2.若e_{1}, e_{2}, \cdots, e_{i}已选好,则从E(G)-\left\{e_{1}, e_{2}, \cdots, e_{i}\right\}中选取e_{i+1},使得:
(1)G\left[\left\{e_{1}, e_{2}, \cdots, e_{i}, e_{i+1}\right\}\right]中无圈
(2)w\left(e_{i+1}\right)=\min
3.直到选得e_{\mathrm{v}-1}为止

Matlab程序:

a(4,7)=42; a(5,6)=70;
[i,j,b]=find(a);
data=[i';j';b'];index=data(1:2,:);
loop=max(size(a))-1;
result=[];
while length(result)<loop
    temp=min(data(3,:));
    flag=find(data(3,:)==temp);
    flag=flag(1);
    v1=index(1,flag);v2=index(2,flag);
    if v1~=v2
        result=[result,data(:,flag)];
    end
    index(find(index==v2))=v1;
    data(:,flag)=[];
    index(:,flag)=[];
end
result

相关文章

网友评论

    本文标题:【数学建模算法】(9)树

    本文链接:https://www.haomeiwen.com/subject/dmgjjctx.html