数学建模实验报告-第十一章-最短路问题
- 格式:docx
- 大小:72.65 KB
- 文档页数:18
最短路径数学建模案例及详解最短路径问题是指给定一个有向图,找到其中两个节点之间的最短路径。
这个问题可以通过数学建模来解决。
以下是一个关于最短路径的案例及详解:案例:某个城市有多个地点,这些地点之间有高速公路相连。
现在需要找出两个地点之间的最短路径,以便安排货物的运输。
假设已知这个城市的高速公路网络以及每个道路的长度。
解决方案:1. 定义变量和参数:- 变量:设定一个变量x[i, j],表示从节点i到节点j的路径长度。
这个变量需要求解。
- 参数:给出每个节点之间的长度,可以用一个矩阵表示。
设长度矩阵为A。
2. 建立数学模型:- 目标函数:最小化总路径长度。
可以定义目标函数为:min x[i, j]。
- 约束条件:- 对于任意两个节点i和j来说,路径长度x[i, j]必须是非负的:x[i, j] ≥ 0。
- 对于任意两个节点i和j来说,路径长度x[i, j]等于路径长度x[j, i]:x[i, j] = x[j, i]。
- 对于任意两个节点i和j来说,路径长度x[i, j]需要满足下面的约束条件:x[i, j] ≤ x[i, k] + x[k, j],其中k是任意的节点。
这个约束条件保证了路径长度的传递性。
即,如果从i到j的路径经过节点k,那么整条路径的长度应该不小于x[i, k] + x[k, j]。
3. 求解:- 编写数学建模的代码,并使用求解器(如线性规划求解器)求解最优解。
- 分析优化结果,并得到最短路径的长度以及具体的路径。
总结:通过定义变量和参数,建立数学模型的方式来解决最短路径问题,可以帮助我们找到两个节点之间的最短路径。
数学建模可以提供一个系统化的框架,帮助我们理解问题,并找到最优解。
这种方法在物流、交通规划等领域都有广泛的应用。
数学建模最短路径模型数学建模是一种将实际问题转化为数学问题,并通过数学方法加以分析和求解的过程。
在实际生活中,最短路径问题是我们经常遇到的一个问题。
例如,出行时如何选择最优路线、快递如何选择最短路线送达等等。
所以最短路径模型是数学建模中比较基础的问题之一。
最短路径问题是指在一个图中,给定两个节点,求两个节点之间的最短路径。
其中图中的节点可以表示位置,边可以表示路径(即从一个位置到另一个位置的路线)。
解决最短路径问题的方法有很多,这里我们介绍其中的两类:迪杰斯特拉算法和弗洛伊德算法。
迪杰斯特拉算法是指从一个起点开始不断扩张,直到到达终点的过程。
具体来说,其实现过程如下:(1)定义一个起点,然后将该点到其它点的路程距离存储到数组D中,若两点之间没有路线,则存储为∞。
(2)定义一个集合S,将起点加入S中。
(3)对于除起点外的其它所有点v,若v与起点有路径,则将D[v]赋值为该路径的距离,否则保持为∞。
(4)进入循环,对于集合V-S中的每个点v,找到距离它最近的点k,即D[k]+weight[k][v]最小,并将其加入S中。
若从起点到k的路径加上k到v的路径距离小于从起点到v的路径距离,则更新D[v]。
(5)重复上述步骤3和4,直到S中含有终点或V-S为空为止。
(6)输出起点到终点的最短路径长度。
弗洛伊德算法是一种动态规划算法,通过对于任意两个节点的距离进行不断松弛来计算最短路径。
具体来说,其实现过程如下:(1)定义一个二维数组m,其中m[i][j]表示节点i到节点j的最短距离。
初始化m[i][j]为i到j的直接距离,若不存在直接距离则设置为∞。
(2)对于任意k,遍历所有节点i和j,若m[i][j]>m[i][k]+m[k][j],则更新m[i][j]。
(3)输出起点到终点的最短路径长度。
以上就是解决最短路径模型的两种方法,每种方法都有其适用的场景。
无论是哪种方法,最短路径模型的核心是图的表示方法和路径之间距离的计算方法,通过这个模型可以在实际生活中解决很多常见的问题。
最短路问题可以分为两类:单元最短路求从⼀个点到其他所有点的最短距离,如从1号点到n号点的最短路多源汇最短路起点和终点数量不确定n表⽰图中点的数量,m表⽰图中边的数量,⼀般m~n2是稠密图朴素Dijkstra适合稠密图,如边数⽐较多和n2⼀个级别⽤朴素Dijkstram和n是⼀个级别,堆优化版⽐较好SPFA是Bellman-Ford算法的⼀个优化,但是在某些时候SPFA是不能使⽤的,如对边数进⾏⼀个限制,经过不超过k条边就只能⽤Bellman-Ford最短路不会让你去证明算法的正确性,最短路的难点在于如何把原问题抽象成最短路问题,如何定义我们的点和边使得这个问题变成⼀个最短路问题,从⽽套⽤公式去解决。
难点在于建图。
Dijkstra基于贪⼼,Floyd基于动态规划,Bellman-Ford基于离散数学。
1、Dijkstra算法⼀定不能存在负权边。
伪代码:1. 初始化距离:dis[1] = 0,dis[others] = +∞。
2. 集合s:存储当前已经确定最短路的点3. for(int i = 0;i < n; i++) {t←找到不在s中的距离最近的点s←to⽤t更新其他点的距离。
更新⽅式:看从t出去的所有的边,组成的路径能不能更新其他点的距离。
如下图:如果从1到x的距离⼤于从1到t再到x的距离,就⽤dis[t]+w代替1到x的距离。
如下图:初始状态:①②③上的数字表⽰距离起点的距离,红⾊表⽰待定,绿⾊表⽰确定已经放⼊了集合s。
第⼀个点更新:第⼆个点更新:第三个点更新:}1.1 Dijkstra练习1.2 朴素Dijkstra算法解答存在重边只保留最短的那条边就可以了解答:if (!st[j] && (t == -1 || dist[t] > dist[j]))#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 510;int n, m;int g[N][N];int dist[N]; // 从1号点⾛到其他每个点当前最短距离bool st[N];int dijkstra(){memset(dist, 0x3f, sizeof dist);dist[1] = 0;for (int i = 0; i < n - 1; i ++ ){int t = -1; // 初始还没有确定点的时候for (int j = 1; j <= n; j ++ )// 这个循环找的就是所有st[j]=false即距离还没确定的点 // 在这些点中找到距离最⼩的点if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;for (int j = 1; j <= n; j ++ )dist[j] = min(dist[j], dist[t] + g[t][j]);st[t] = true;}if (dist[n] == 0x3f3f3f3f) return -1;return dist[n];}int main(){scanf("%d%d", &n, &m);memset(g, 0x3f, sizeof g);while (m -- ){int a, b, c;scanf("%d%d%d", &a, &b, &c);g[a][b] = min(g[a][b], c); // 取min是可能存在重边}printf("%d\n", dijkstra());return 0;}1.3堆优化Dijkstra算法解答考虑如何优化:因为t从1~n每次都是不同的点,所以⽤t更新其他点的距离这个操作就是遍历从t出去所有边,遍历n次即遍历所有点以后就是遍历了所有边,所以计算了m次可以发现最慢的就是找最⼩距离这步,复杂度O(n2)。
[网络图中最短路问题—专题研究报告!报告人:张鹏学号:班级:035109012011年5月12日%…网络图中最短路问题…【问题导引】网络分析在电子导航、交通旅游、城市规划以及电力、通讯等各种管网、管线的布局设计中发挥了重要作用。
而最短路问题是网络分析中最基本、最关键的问题。
最短路径不仅指一般地理意义上的距离最短,还可以引申到其他的度量,如时间,费用等等。
这些都可以抽像为在图中找出任意两点间的一条通路,使这条通路上的权值和最小。
最短路问题作为图与网络技术研究的一个经典问题,在工程规划、地理信息系统、通信和军事运筹学等领域有十分广泛的应用。
举例如下:}【案例一】:如图的交通网络,图中的点表示交通节点,每条边表示两个节点间的一条通路,边上的数字表示路段的长度,有向边表示单行道,无向边表示可双向行驶。
若有一批货物要从1号顶点运往11号顶点,问运货车应沿哪条线路行驶,才能最快地到达目的地【案例分析与建模】:这是实际生活中经常遇到的一类问题,首先对该问题做如下假设以便抽象为数学模型。
假设一:各路段路况相同,车辆在各路段以相同的速度行驶。
~假设二:各路段均一路畅通,即不存在堵车问题。
在以上两种假设的前提下,此问题即转化为在图中选一条从节点1到节点11的通路,使得路径总长度最短,即典型的最短路问题模型。
将图抽象为距离矩阵表示,即可建立数学模型,设计算法求解。
【算法设计】:对于最短路模型,传统的Dijkstra算法和floyd算法为两种有效的求解方法。
利用Dijkstra算法求解案例一中的问题。
!算法思路:采用标号作业法,每次迭代产生一个永久标号, 从而生长一颗以v0为根的最短路树,在这棵树上每个顶点与根节点之间的路径皆为最短路径。
S: 具有永久标号的顶点集;l(v): v的标记;f(v):v的父顶点,用以确定最短路径;"输入:输入加权图的带权邻接矩阵w=[w(vi,vj)]nxm.1)初始化:令l(v0)=0,S=Ø; v≠v0 ,l(v)= ;2)更新l(v), f(v):寻找不在S中的顶点u,使l(u)为最小.把u加入到S中,然后对所有不在S中的顶点v,如l(v)>l(u)+w(u,v),则更新l(v),f(v), 即l(v)l(u)+w(u,v),f(v)u;3)重复步骤2), 直到所有顶点都在S中为止。
.
整理文本
实验名称: 第十一章 最短路问题
一、实验内容与要求
掌握Dijkstra算法和Floyd算法,并运用这两种算法求一些最短
路径的问题。
二、实验软件
MATLAB7.0
三、实验内容
1、在一个城市交通系统中取出一段如图所示,其入口为顶点v1,出
口为顶点v8,每条弧段旁的数字表示通过该路段所需时间,每次转弯
需要附加时间为3,求v1到 v8的最短时间路径。
V1 1 V2 3 V3 1 V5 6 V
6
3
V4 2 V7 4 V
8
程序:
function y=bijiaodaxiao(f1,f2,f3,f4)
2 2
.
整理文本
v12=1;v23=3;v24=2;v35=1;v47=2;v57=2;v56=6;v68=3;v78=4;turn=3;
f1=v12+v23+v35+v56+turn+v68;
f2=v12+v23+v35+turn+v57+turn+v78;
f3=v12+turn+v24+turn+v47+v78;
f4=v12+turn+v24+v47+turn+v57+turn+v56+turn+v68;
min=f1;
if f2
end
if f3
end
if f4
end
min
f1
f2
f3
f4
.
整理文本
实验结果:
v1到v8的最短时间路径为15,路径为1-2-4-7-8.
2、求如图所示中每一结点到其他结点的最短路。
V1 10 V3 V5 9 V
6
.
整理文本
4
V2 5 V4 10 V7 6 V
8
floy.m中的程序:
function[D,R]=floyd(a)
n=size(a,1);
D=a
for i=1:n
for j=1:n
R(i,j)=j;
end
end
R
for k=1:n 3 6 4 5 3 程序: 实验结果: 整理文本 0 3 10 Inf Inf Inf Inf Inf R =
for i=1:n
for j=1:n
if D(i,k)+D(k,j)
.
整理文本
D(i,j)=D(i,k)+D(k,j);
R(i,j)=R(i,k);
end
end
end
k
D
R
end
>> a=[0 3 10 inf inf inf inf inf;3 0 inf 5 inf inf inf inf;10 inf 0 6 inf inf inf
inf;inf 5 6 0 4 inf 10 inf ;
inf inf inf 4 0 9 5 inf ;inf inf inf inf 9 0 3 4;inf inf inf 10 5 3 0 6;inf inf inf inf
inf 4 6 0;];
[D,R]=floyd(a)
.
D =
3 0 Inf 5 Inf Inf Inf Inf
10 Inf 0 6 Inf Inf Inf Inf
Inf 5 6 0 4 Inf 10 Inf
Inf Inf Inf 4 0 9 5 Inf
Inf Inf Inf Inf 9 0 3 4
Inf Inf Inf 10 5 3 0 6
Inf Inf Inf Inf Inf 4 6 0
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8