数学建模-图与网络模型解题方法和代码实现

本文针对以下几个方面问题进行整理:

  1. 最短路问题
  • 两个指定顶点之间的最短路径
  • 任意顶点之间的最短路径

2.最小生成树问题

  • 求最小生成树

3.网络最大流问题

  • 源点与汇点之间的最大流
  • 基于最大流的最小费用求解

4.旅行商问题

  • 基于哈密顿(Hamilton)圈求解旅行商线性规划

最短路问题

两个指定点最小距离:

%使用graphshortestpath函数
[dist, path, pred]=graphshortestpath(G,S,T)

 G是稀疏矩阵,S是起点,T是终点。dist表示最短距离,path表示最短距离经过的路径节点,pred表示从S到每个节点的最短路径中,目标节点的先驱,即目标节点的前面一个节点。比如一共有6个点,S=1,那么运行这个函数后pred存的就是S=1这个节点到其它节点T'最短路径上T'的前一个节点。这个函数也就是求出图G上S到T的[distpathpred],当不写T时表示求S到其它所有点的[distpathpred]。

任意顶点的最短路径:

!使用graphallshortestpath函数
[dist] = graphallshortestpaths(G)
  • 解题思路:

简单构造稀疏矩阵:

  1. 手动录入权重矩阵
!w(起点,终点)=权重值
w=zeros(4)
w(1,2)=2;w(1,3)=3;w(1,4)=8; 
w(2,3)=6;w(2,4)=6;
G=sparse(w); 
%如果是无向图,G=sparse(tril(w'+w)取下三角)

得:

G =

(1,2) 2

(1,3) 3

(2,3) 6

(1,4) 8

(2,4) 6

2. 直接sparse函数生成

%sparse([起点集合],[对应终点集合],[对应权重集合])
G=sparse([1,1,2,1,2],[2,3,3,4,4],[2,3,6,8,6]);
%得到结果和上面相同
%如果是无向图,建议用方法1
对无向图而言:tril(w+w')是在不知道w是上三角还是下三角的情况下,确保取w对应的下三角;若w已知为上三角,稀疏矩阵G=sparse(w');若已知w为下三角,稀疏矩阵G=sparse(w);

例题:某公司在六个城市c1,c2,..c6中有分公司,从ci(1..6)到cj(1..6)的距离c(i,j)记在下述矩阵中,求ci到其他城市的最短距离。

050402510
500152025
1501020
40201001025
252010055
102525550
clear;
clc;
w=zeros(6);
w(1,2)=50;w(1,4)=40;w(1,5)=25;w(1,6)=10;
w(2,3)=15;w(2,4)=20;w(2,6)=25;
w(3,4)=10;w(3,5)=20;
w(4,5)=10;w(4,6)=25;
w(5,6)=55;
%无向图
G=sparse(w');
a=graphallshortestpaths(G,'Direct',0)
%记住要加Direct  0/false 说明是无向图 1/true则为有向图
得:
a =

0 35 45 35 25 10
35 0 15 20 30 25
45 15 0 10 20 35
35 20 10 0 10 25
25 30 20 10 0 35
10 25 35 25 35 0

例如第一行表示c1到ci(1..6)最短距离分别为[0,35,45,35,25,10].

最小生成树问题

同样直接运用graphminspantree函数并加一些图形显示参数即可

例:北京(Pe)、东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa)各城市之间航线距离如下表

LMNPaPeT
L5635215160
M5621577870
N3521366868
Pa2157365161
Pe5178685113
T6070686113

求由上述交通网络数据确定的最小生成树:

clc, clear
a=zeros(6); %邻接矩阵初始化
a(1,[2:6])=[56 35 21 51 60]; %输入邻接矩阵的上三角元素
a(2,[3:6])=[21 57 78 70];
a(3,[4:6])=[36 68 68];
a(4,[5 6])=[51 61]; a(5,6)=13;
a=a'; a=sparse(a); %变换成下三角矩阵,并转化成工具箱所需要的稀疏矩阵
[ST,pred] = graphminspantree(a,'method','Kruskal') %调用工具箱求最小生成树并定义用kruskal算法求解
nodestr={'L','M','N','Pa','Pe','T'}; %输入顶点名称的字符细胞数组
h=view(biograph(ST,nodestr,'ShowArrows','on','ShowWeights','on'))%将节点名称显示在图形上,并显示箭头以及对应的权重
h.EdgeType='segmented'; %边的连接为线段
h.LayoutType='equilibrium'; dolayout(h) %设置图形布局属性,并刷新图形布局
graphminspantree不需要指定Direct是0/1,但对于无向图仍然需要将输入得稀疏矩阵转为下三角矩阵。

网络最大流问题

同样,我们只需调用graphmaxflow函数即可

求最大流:

clc,clear
a=zeros(6);
%标号s=1 v1=2 v3=3 v2=4 v4=5 t=6
a(1,2)=8;a(1,3)=7;
a(2,3)=5;a(2,4)=9;
a(3,5)=9;
%有向图 不是上三角或下三角矩阵
a(4,3)=2;a(4,6)=5;
a(5,4)=6;a(5,6)=10;
%有向图 直接取稀疏矩阵
a=sparse(a);
%1,6表示求源点s和汇点t之间的最大流
[b,c]=graphmaxflow(a,1,6)
%b返回最大流 c返回每条管道对应的流量
得:
b =
14
c =
(1,2) 8.0000
(1,3) 6.0000
(2,3) 1.0000
(4,3) 2.0000
(2,4) 7.0000
(3,5) 9.0000
(4,6) 5.0000
(5,6) 9.0000

最大流最小费用问题再加上一定的约束即可,这里不再细说.

旅行商问题

旅行商问题是经典得哈密顿圈图论问题,具体可以自行百度其原理。这里给出lingo求解源码,只需带入初始矩阵即可。

约束条件:

+

1=2 转换为不等式使程序求解速度更快

model:
sets:city / 1..10/: u;link(city, city):dist,x;
endsets   n = @size(city);
data:   dist =  0  8  5  9  12 14 12 16 17 228  0  9 15  17 8  11 18 14 225  9  0  7  9  11 7  12 12 179  15 7  0  3  17 10 7  15 1812 17 9  3  0  8  10 6  15 1814  8 11 17 8  0  9  14 8  1612 11 7 10 10  9  0  8  6  1116 18 12 7  6  14 8  0  11 1117 14 12 15 15 8  6  11 0  1022 22 17 18 15 16 11 11 10  0;
enddatamin = @sum(link:dist*x);@FOR(city(K):@sum(city(I)|I#ne#K:x(I,K)=1;@sum(city(J)|J#ne# K: x( K, J))=1;);@for(city(I)|I#gt#1:@for(city(J)|J#gt#1#and#I#ne#J:u(I)-u(J)+n*x(I,J)<=n-1););@for(city(I)|I#gt#1:u(I)<=n-2);@for(link:@bin(x));
end
!只需替换data中 dist的距离矩阵以及初始化条件city的维数即可

总结

对于求解最小路径、最大流、最小生成树等问题使用matalab工具箱函数即可。统一的,对于有向图直接取稀疏矩阵,对于无向图需要取其下三角矩阵再求稀疏矩阵。

写了一天,累die....打球去了,希望可以帮助更多的人更好的理解和运用这些算法。如有不当,请指正。

参考书目:

数学建模算法与应用

数学模型算法与应用模型与解答

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/194981.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件钓鱼-后缀隐藏文件捆绑文件压缩释放技巧

0x00 文件钓鱼 简单说下文件样本钓鱼的目的&#xff0c;为诱导用户安装木马文件&#xff0c;达到控制或者窃取某些信息的目的&#xff0c;抛开邮件的真实性。木马的伪造是一个比较关键的点&#xff0c;下面简要说下三种木马文件伪装的技巧 0x01 水坑攻击与鱼叉攻击的概念 水坑…

RTD系统

RTD&#xff08;实时派工系统&#xff09;帮助半导体工厂优化派工&#xff0c;提升生产效率&#xff0c;提高设备利用率&#xff0c;降低Lot Cycle Time&#xff0c;RTD分为&#xff1a;WhatNext和WhereNext&#xff0c;解决工厂内部机台下一步跑什么Lot和Lot生产完后去哪里的问…

车载通信架构 —— 传统车内通信网络发展回顾

车载通信架构 —— 传统车内通信网络发展回顾 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何…

十、Linux运行级别

1.基本介绍 运行级别说明&#xff1a; 0&#xff1a;关机 1&#xff1a;单用户【找回丢失密码】 2&#xff1a;多用户状态没有网络服务 【非常少】 3&#xff1a;多用户状态有网络服务 【最多】 4&#xff1a;系统未使用保留给用户 5&#xff1a;图形界面【Linux一启动自动进入…

Rust与其他语言对比:优势在哪里?

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将深入探讨Rust语言与其他编程语言比较的优势&#xff0c;并通过具体的代码示例和性能数据来加深理解。 Rust与其他语言的比较 1. 内存安全性 Rust&#xff1a;采用所有权系统&#xff0c;编译器在编译时检查内存安全…

Linux网络ssh服务

目录 一.ssh服务基础 1.ssh服务简介 2.ssh服务原理 二.ssh服务应用 1.ssh配置文件 2.ssh连接验证 三.ssh服务端 1.修改默认端口号 2.免密连接登录 3.禁止root用户登录 4.ssh服务的最佳实践 一.ssh服务基础 1.ssh服务简介 SSH&#xff1a;是一种安全通道协议&#x…

滑动窗口练习(一)— 固定窗口最大值问题

题目 假设一个固定大小为W的窗口&#xff0c;依次划过arr&#xff0c; 返回每一次滑出状况的最大值 例如&#xff0c;arr [4,3,5,4,3,3,6,7], W 3 返回&#xff1a;[5,5,5,4,6,7] 暴力对数器 暴力对数器方法主要是用来做校验&#xff0c;不在乎时间复杂度&#xff0c;逻辑上…

Network(四)NAT实现方式与VRRP概述

一 NAT 1 NAT概述 &#xff08;1&#xff09;NAT的作用 Network Address Translation&#xff0c;网络地址转换 通过将内部网络的私有IP地址转换成全球唯一的公网IP地址使内部网络可以连接到互联网。 &#xff08;2&#xff09;私有IP地址分类 A类10.0.0.0~10.255.255.…

[C/C++]数据结构 LeetCode:用栈实现队列

题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返…

【Redis】zset常用命令集合间操作内部编码使用场景

文章目录 前置知识列表、集合、有序集合三者的异同点 普通命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合之间的操作ZINTERSTOREZUNIONSTORE 命令小结内部编码测试内部编…

【LeetCode刷题-树】--998.最大二叉树II

998.最大二叉树II /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

【数据结构】C语言实现队列

目录 前言 1. 队列 1.1 队列的概念 1.2 队列的结构 2. 队列的实现 2.1 队列的定义 2.2 队列的初始化 2.3 入队 2.4 出队 2.5 获取队头元素 2.6 获取队尾元素 2.7 判断空队列 2.8 队列的销毁 3. 队列完整源码 Queue.h Queue.c &#x1f388;个人主页&#xff1a…