【数学建模】图与网络 提纲 & matlab代码

表示方法

  • 邻接矩阵(adjacency matrix)
  • 关联矩阵
  • 弧表
  • 星形

最短路径

Dijkstra

从一点到各个顶点的最短路径

clc,clear

%%输入地图(邻接矩阵)
a=zeros(6);
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;
a=a+a';
a(find(a==0))=inf;

%%初始化
%行向量pb 、index1 、index2 、d 分别用来存放
%P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1;

%%主循环
while sum(pb)<length(a)  %所有的点都被遍历
tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+a(temp,tb));
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb(1)); %有多个最小值的时候取第一个

pb(temp)=1;%记录该点已经达到
index1=[index1,temp];%记录达到的顺序
temp2=find(d(index1)==d(temp)-a(temp,index1));
index2(temp)=index1(temp2(1));%记录该点上一个位子
end
d, index1, index2

Floyd算法

每对顶点之间的最短路径(可用多次Dijkstra实现)

clear;clc;
n=6; a=zeros(n);
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25; a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25; a(5,6)=55;
a=a+a'; M=max(max(a))*n^2;  %M为充分大的正实数
a=a+((a==0)-eye(n))*M;
path=zeros(n);

for k=1:n
for i=1:n
for j=1:n
if a(i,j)>a(i,k)+a(k,j)
a(i,j)=a(i,k)+a(k,j);
path(i,j)=k;
end
end
end
end
a, path

最小生成树

Prim

找最小边 pv,其中 p∈ P,v∈V ? P

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

Kruskal

找不构成圈的最短边

clc;clear;
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;
[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=data(1,flag);v2=data(2,flag);
if index(1,flag)~=index(2,flag)
result=[result,data(:,flag)];
end
index(find(index==v2))=v1;
data(:,flag)=[];
index(:,flag)=[];
end
result

匹配问题

人员分配问题

匈牙利算法
这里的概念是可增广轨
http://www.cnblogs.com/qiufeihai/archive/2012/01/11/2319800.html

最优分配问题(增加权重)

库恩-曼克莱斯算法

Euler 图&Hamilton 图

邮递员问题

Euler图:Fleury 算法
非Euler图:对连接奇数个边的顶点处理,求他们的完美对集。

kpp问题

旅行商(TSP)问题

改良圈算法

这里写图片描述

最大流问题

Ford-Fulkerson 算法
整流定理
多源多汇->单源单汇

最小割

标号法

最小流问题

迭代法

统筹方法

计划评审方法(program evaluation and review technique, PERT)&关键路线法(critical path method, CPM)

从最大流开始用LINGO比较多感觉可能最好是要学一下……

转载于:https://www.cnblogs.com/BirdCage/p/9974072.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值