数学建模笔记 day-07

第七章 图论模型

 

一、图的生成

1. 画无向图:graph

例1:

clc,clear
a=zeros(5);   %邻接矩阵初始化
a(1,[2,4])=1;
a(2,[3,5])=1; %输出邻接矩阵的上三角元素
a(3,[4,5])=1;
b=graph(a,'upper') %等价于 aa=a+a' b=graph(aa)
plot(b)

2. 画有向图: digraph

例2:

clc ,clear
a=zeros(4);    %邻接矩阵的初始化
a(1,[2,3])=1;
a(3,4)=1;
a(4,1)=1;
b=digraph(a)   %构造有向图
plot(b)

3.其他命令

G=graph()      %创建空的无向图对象
G=graph(A)     %使用邻接矩阵A创建赋权无向图
G=graph(A,nodes)   %使用邻接矩阵A和节点名称nodes创建赋权无向图
G=graph(s,t)       %使用节点对组s、t创建无向图
G=graph(s,t,weights) %使用节点对组s、t和权重向量weights创建赋权无向图
G=graph(s,t,weights,nodes) %使用字符向量元胞数组或字符数组nodes指定节点名称
G=graph(s,t,weights,num)   %使用数值标量num指定图中的节点数
G=graph(A[,nodes],type)    %仅使用A的上或下三角形构造赋权图,type可以是'upper''lower'

例3:画出一个60个顶点的3正则图(每个顶点的度都为3)。

G=graph(bucky);
p=plot(G)

二、数据存储结构

Matlab存储网络的相关数据时,使用了稀疏矩阵,这有利于在存储大规模稀疏网络时节省存储空间。

附:a([1,7,18])=1  %是指一列一列地竖着看,第1个,第7个和第18个为1

例1:

clc,clear,close all
a=zeros(4);
a([4,5,9,15])=1;   %邻接矩阵初始化
nodes=cellstr(strcat('v',int2str([1:4]')))
G=digraph(a,nodes);
plot(G,'LineWidth',1.5,'Layout','circle','NodeFontSize',15)
W1=adjacency(G)    %导出邻接矩阵的稀疏矩阵
W2=incidence(G)    %导出关联矩阵的稀疏矩阵
ww1=full(W1)       %导出全矩阵
ww2=full(W2)       %导出全矩阵

三、生成树

1.  n个顶点的完全图有n^{n-2}个生成树

例1:

clc,clear, close all
a=zeros(5);
a(1,[2:4])=[5,3,7];
a(2,[3,5])=[8,4];
a(3,[4,5])=[1,6];
a(4,5)=2;            %输入邻接矩阵的三角元素
G=graph(a,'Upper')   %graph生成的是一个结构数组
h=plot(G,'Layout','force','EdgeLabel',G.Edges.Weight)  %生成图像
T=minspantree(G)     % 求最小生成树(生成的也是一个结构数组)
L=sum(T.Edges.Weight)% 计算最小的总权值
highlight(h,T)       % 标出最小生成树

注意!!!: minspantree默认使用的是 Prim's algorithm,如果想要使用 Kruskal's algorithm 必须得加'sparse'。

附:find(t)  t-矩阵  作用:查找非0元素的索引和值 

同理: find(~t)       作用:查找值为0的元素的索引和值

        all(t)               作用:确定所有的数组元素是为非零还是true

        setdiff(A,B)           作用:查找A中存在,B中不存在的值

例2:

clc,clear,close all
a=zeros(5);a(1,[2:4])=[5,3,7];a(2,[3,5])=[8,4];
a(3,[4,5])=[1,6];a(4,5)=2;%输入邻接矩阵上三角元素
w=a+a' ;
w(w==0)=10^6;
n=size(w,1);
prob=optimproblem;
x=optimvar('x',n,n,'Type','integer','LowerBound',0,'UpperBound',1);
u=optimvar('u',n,'LowerBound',0);
prob.Objective=sum(sum(w.*x));
prob.Constraints.con1=[sum(x(:,[2,n]))'==1;u(1)==0];
con2=[1<=sum(x(1,:));1<=u(2:n);u(2:n)<=n-1];
for i= 1:n
    for j =2:n
        con2=[con2;u(i)-u(j)+n*x(i,j)<=n-1];
    end
end
prob.Constraints.con2=con2;
[sol,fval,flag,out]=solve(prob)
[i,j]=find(sol.x);
ind = [i';j'] %输出树的顶点编号

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值