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

news2024/12/23 5:34:22

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

  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 22
         8  0  9 15  17 8  11 18 14 22
         5  9  0  7  9  11 7  12 12 17
         9  15 7  0  3  17 10 7  15 18
         12 17 9  3  0  8  10 6  15 18
         14  8 11 17 8  0  9  14 8  16
         12 11 7 10 10  9  0  8  6  11
         16 18 12 7  6  14 8  0  11 11
         17 14 12 15 15 8  6  11 0  10
         22 22 17 18 15 16 11 11 10  0
        ;
enddata
  min = @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.coloradmin.cn/o/1227559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多功能神器,强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;今天给大家分享一个好用好玩的软件。那就是太极2.x软件&#xff0c;最近在1.0版本上进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;我们一起来看看吧&#xff01; 首页 首页左…

安卓中轻量级数据存储方案分析探讨

轻量级数据存储功能通常用于保存应用的一些常用配置信息&#xff0c;并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中&#xff0c;这些文件可以持久化地存储在设备上。需要注意的是&#xff0c;应用访问的实例包含文件所有数据&#xff0c;这些数据会一…

深入流行推荐引擎3:Spotify音乐推荐系统

深入流行推荐引擎3&#xff1a;Spotify音乐推荐系统 Spotify音乐推荐系统通过矩阵分解发现每周&#xff08;Discover Weekly via Matrix Factorization&#xff09;Discover Weekly 如何运作&#xff1f;&#xff08;How Discover Weekly Works?&#xff09;矩阵分解&#xff…

读书笔记--从一到无穷大的关键金句和阅读感悟

借着休假&#xff0c;重新研读了十多年前读过的乔治.伽莫夫所著图书《从一到无穷大--ONE TWO THREE...INFINITY》&#xff0c;该书作为20世纪最经典的科普类图书之一&#xff0c;当时读的懵懵懂懂&#xff0c;现在重新阅读又有了不同的感受&#xff0c;再结合过去的科研工作&am…

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

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

iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端

根据苹果网站上介绍&#xff0c;bash是 macOS Mojave 及更早版本中的默认Shell&#xff0c;从 macOS Catalina 开始&#xff0c;zsh(Z shell) 是所有新建用户帐户的默认Shell。 1. 安装Oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzs…

【Hello Go】Go语言异常处理

Go语言异常处理 异常处理error接口panicrecover延时调用错误问题 异常处理 error接口 Go语言引入了一个关于错误处理的标准模式 它是Go语言内建的接口类型 它的定义如下 type error interface {Error() string }Go语言的标准库代码包errors为用户提供了以下方法 package e…

react之基于@reduxjs/toolkit使用react-redux

react之基于reduxjs/toolkit使用react-redux 一、配置基础环境二、使用React Toolkit 创建 counterStore三、为React注入store四、React组件使用store中的数据五、实现效果六、提交action传递参数七、异步状态操作 一、配置基础环境 1.使用cra快速创建一个react项目 npx crea…

前端面试:如何实现并发请求数量控制?

题目&#xff1a;实现一个并发请求函数concurrencyRequest(urls, maxNum) 要求如下&#xff1a; 要求最大并发数 maxNum;每当有一个请求返回&#xff0c;就留下一个空位&#xff0c;可以增加新的请求;所有请求完成后&#xff0c;结果按照 urls 里面的顺序依次打出&#xff1b;…

2024年全网最全的Jmeter+ant+jenkins实现持续集成教程

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具&#xff0c;并配置好环境变量&#xff1b;参考&#xff1a;https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件&#xff0c;要设置一下bin/jmeter.properties,文件内容…

警惕.360勒索病毒,您需要知道的预防和恢复方法。

引言&#xff1a; 网络威胁的演变无常&#xff0c;.360勒索病毒作为一种新兴的勒索软件&#xff0c;以其狡猾性备受关注。本文将深入介绍.360勒索病毒的特点&#xff0c;提供解决方案以恢复被其加密的数据&#xff0c;并分享一系列强化网络安全的预防措施。如果您在面对被勒索…

自动驾驶学习笔记(十)——Cyber通信

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 Cyber通信 编写代码 编译程序 运行…

概念解析 | 网络安全数字孪生(Digital Twin of Cyber Security, DTCS)技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:网络安全数字孪生。 概念解析 | 网络安全的“数字镜像” —— 网络安全数字孪生 1. 背景介绍 随着数字化转型进程的深入推进,网络空间安全问题日益凸显。当前的网络安全防护面…

RTD系统

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

人类智能的精髓超出了统计概率

处理不确定性好坏的程度是衡量各种智能系统高低的一个重要指标。在处理不确定性时&#xff0c;智能系统需要具备推理、学习和决策的能力&#xff0c;通常使用概率和统计等方法来建模和处理不确定性&#xff0c;以便更好地应对现实世界中的复杂问题。统计概率是基于大量观察和数…

可拖动、可靠边的 popupWindow 实现

0 背景 开发要实现一个可以拖动的圆角小窗&#xff0c;要求松手时&#xff0c;哪边近些靠哪边。并且还规定了拖动范围。样式如下&#xff1a; 1 实现 首先把 PopupWindow 的布局文件 pop.xml 实现 <?xml version"1.0" encoding"utf-8"?> <R…

变周期控制思路

举例&#xff1a;热值调节的过程中&#xff0c;调节周期在偏差较小时&#xff0c;可以设置较大些&#xff0c;调节周期在偏差较大时&#xff0c;可以设置较小些。并且在偏差较大时&#xff0c;立刻进入调节&#xff08;计时器清零&#xff09;。 -350<偏差<600&#xff0…

Windows安装Vmware 虚拟机

目录 一、Vmware 虚拟机介绍 二、Vmware 虚拟机的三种网络模式 2.1桥接模式 2.2仅主机模式 2.3NAT 网络地址转换模式 三、Vmware 虚拟机的安装 一、Vmware 虚拟机介绍 VMware Workstation Pro 是一款可以在个人电脑的操作系统上创建一个完全与主机操作系统隔离的 虚拟机&…

星火模型(Spark)的langchain 实现

星火模型的langchain实现 测试已通过&#xff0c;希望有所帮助。 使用前请先安装环境&#xff1a; pip install githttps://github.com/shell-nlp/spark-ai-python.git注意&#xff1a; 一定要使用上面方式安装spark库&#xff0c;因对官方的库做了改动。官方的库已经长时间不…

十、Linux运行级别

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