数学建模方法-Floyd算法

一、引言

  哈喽大家好,今天要给大家讲的是Floyd算法。在那之前,大家还记得我们上一章讲的内容吗,就是那个Dijkstra算法,用来解决从A点到B点的最短路径问题。我们还给出了Matlab代码。Floyd算法也是用来处理最短路径问题的。它的理念跟Dijkstra有点不一样,但是最终的结果是一样的。Floyd算法主要是用到了动态规划的思想。在这里博主不打算讲到很抽象很高深的东西(毕竟博主也不是专业的),仅仅通过比较通俗易懂的方式来给大家讲解这个算法的思想(如果有问题大家帮忙指出来哈)。本文的图片和思想,借用了https://blog.csdn.net/qq_34374664/article/details/52261672的博文(图片画得好好,有谁知道是用什么软件画的吗,博主也想学一学)。本篇的主要思想来自那篇博文,因此会有很多类似的,但博主还是想以自己的理解来解释Floyd算法的理念。好了我们开始吧...

二、Floyd算法

  首先,大家看上面的图,暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。我们用1-4来表示4个地点,并用箭头和箭头上的数字来表示一个地点到另一个地点的距离(注意,有些路是单向的)。这样就得到下图

  现在,我们希望能求解出任意两点的最短路径及其距离。

  好了,为了求解这个问题,我们先用一个二维的数组A来存储我们图的信息。如下图(怎么看这个图下面解释)

  这个是怎么数组填写出来的呢,举例来讲吧,比如1号城市到2号城市的路程为2,则设A(1, 2)的值为2。2号城市无法到达4号城市,则设置A(2, 4)的值为$\infty$。另外此处约定一个城市自己是到自己的也是0,例如A(1, 1)为0。

  现在问题是,如何求解任意两个点的最短距离。我们可以这样想,我们假设第$i$点和第$j$点的距离,应该就包括两种情况:

  1. $i$和$j$之间是直接相连的(即$i \rightarrow j$);

  2. $i$和$j$之间还有其他端点(即$i \rightarrow \cdot \cdot \cdot \rightarrow j$);

  上面两句话什么意思呢,我们先看下面这张图:

  我们现在比如说从地点$i$地点$j$,我们可以直接走红色路线,即$i \rightarrow j$;或者,走经过1(或者2或者经过1和2)的路线。即从地点$i$开始,先经过其他地点,再从其他地点到$j$,即$i \rightarrow  \cdot \cdot \cdot \rightarrow j$

  那么,哪个才是最短距离呢。接下来就是算法的核心和重点了,大家注意啦!!

  当任意两点之间不允许经过第三个点时,这些城市之间最短路程就是初始路程,如下

  (1)现在,如果我只允许经过1号顶点,求任意两点之间的最短路程,该怎么求呢?

  由于只允许经过1号顶点,那任意两点的路线不外乎只有两种,即:

  1. $i \rightarrow 1 \rightarrow j$

  2. $i \rightarrow j$

  要求最短路程,只要比较这两个路线距离的大小即可。就是:

  即

A(i, j) = min [A(i, j), A(i, 1) + A(1, j)]

  在只允许经过1号顶点的情况下,任意两点之间的最短路程更新为:

  通过上图我们发现:在只通过1号顶点中转的情况下,3号顶点到2号顶点(A(3, 2))、4号顶点到2号顶点(A(4, 2))以及4号顶点到3号顶点(A(4, 3))的路程都变短了。

  (2)接下来继续求在只允许经过1和2号两个顶点的情况下任意两点之间的最短路程。如何做呢?

  可以写出公式:A(i, j ) = A(i, 1) + A(1, 2) + A(2, j)

  根据(1)我们已经求出A(i, 1) + A(1, 2) = min [A(i, 2), A(i, 1) + A(1, 2)]。

  故我们只需要在只允许经过1号顶点时任意两点的最短路程的结果下,再判断如果经过2号顶点是否可以使得$i$号顶点到$j$号顶点之间的路程变得更短。

  即

A(i, j) = min [A(i, j), A(i, 2) + A(2, j)]

  在只允许经过1和2号顶点的情况下,任意两点之间的最短路程更新为:

  通过上图得知,在相比只允许通过1号顶点进行中转的情况下,这里允许通过1和2号顶点进行中转,使得A(1, 3)和A(4, 3)的路程变得更短了。

  (3)同理,继续在只允许经过1、2和3号顶点进行中转的情况下,求任意两点之间的最短路程。任意两点之间的最短路程更新为:

  (4)最后允许通过所有顶点作为中转,任意两点之间最终的最短路程为:

  这样就大功告成啦。

  整个算法的思想就是:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转,接下来······,到允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。用一句话概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。大家好好理一理,逻辑比较容易混乱,但看多几遍应该就好了。

三、 Floyd算法Matlab代码

function [D, path] = floyd(A)
% [D,PATH] = FLOYD(A)
% returns the distance and path between the start node and the end node.
%
% A: adjcent matrix
%% 初始化
%节点的数量n
D = A;
n = length(D);
path = zeros(n, n);
%% 初始化path
for i = 1: n
    for j = 1: n
        if D(i, j) ~= inf
            path(i, j) = j;
        end
    end
end
%% 记录最短路径与最短距离
for k = 1: n
    for i = 1: n
        for j = 1: n
            if D(i, j) > D(i, k) + D(k, j)
                D(i, j) = D(i, k) + D(k, j);
                path(i, j) = path(i, k);
            end
        end
    end
end

原文地址:https://www.cnblogs.com/Qling/p/9318661.html

时间: 2024-11-05 12:25:49

数学建模方法-Floyd算法的相关文章

数学建模方法-粒子群算法

一.引言 哈喽大家好,有一段时间没更新Blog了,最近身体不太舒服哈,今天开始继续更了.言归正传,这次要讲的是"粒子群算法".这个算法是由两个科学家在1995年,根据对鸟类捕食行为的研究所得到启发而想出来的.好的,接下来让我们开始吧. 二.鸟类捕食行为 鸟妈妈有7个鸟宝宝,有一天,鸟妈妈让鸟宝宝们自己去找虫子吃.于是鸟宝宝们开始了大范围的捕食行为.一开始鸟宝宝们不知道哪里可以找得到虫子,于是每个鸟宝宝都朝着不同的方向独自寻找. 但是为了能够更快的找到虫子吃,鸟宝宝们协商好,谁发现了虫子

数学建模法-Dijkstra算法

一.引言 哈喽大家好,今天要讲的是图论中的一个经典的算法.是一种叫Dijkstra算法的东东.这个算法是干什么用的呢.首先大家先看下面这幅图: 这个东西是什么呢.我们可以这样理解,假如A到F表示6个地点.那些连接线就是道路.连接线上的数字就是两个地点间的距离.这样讲是不是很直观呢.好了,假如博主家在A点,博主的女神家在F点,有一天博主想去女神家,就有很多条路线可以走.可是博主很懒诶,肯定就想走最短的路线.那么,怎么才能很快的就求解出最短的路线呢.Dijkstra算法就是用来解决这样的问题的. 二

数学建模方法

线性回归其实就是寻找一条直线拟合数据点,使得损失函数最小.直线的表达式为:\[y_{j}=\omega_{1}x_{i,1}+\omega_{2}x_{i,2}+\dots+\omega_{j}x_{i,j}+\dots+b\]损失函数的表达式为:\[J=\frac{1}{2}\sum_{k=0}^{m}(y_{k}-y_{predict\_i})^{2}\]如上图所示,只要自变量$x$沿着负梯度的方向变化,就可以到达函数的最小值了,反之,如果沿着正梯度方向变化,就可以到达函数的最大值.我们要求

数学建模算法概括

目录 数学模型按数学方法分类 数学建模十大算法 建模思想 预测与预报 评价与决策 分类与判别 关联与因果 优化与控制 数学模型按数学方法分类 几何模型(球面积分,曲面积分) 分形理论(常用) 图论模型(优化类,规划类,决策类问题) 有一类线性规划类问题可用图论模型解决,最短路径 → 时间最短 or 路径最短 微分方程模型(预测人口增长,传热导热问题) 概率问题(彩票) 最优控制模型(药物疗效) 规划论模型(投资问题) 马氏链模型(概率模型) 前后不关联的概率模型 数学建模十大算法 蒙特卡罗算法

【数学建模的五步方法】

第一步,提出问题. ·列出问题中涉及的变量,包括适当的单位. ·注意不要混淆变量的常量. ·列出你对变量所做的全部假设,包括等式和不等式. ·检查单位从而保证你的假设有意义. ·用准确的数学术语给出问题的目标. 第二步,选择建模方法. ·选择结局问的一个一般的求解方法. ·一般地,这一步的成功需要经验.技巧和熟悉相关文献. 第三步,推导模型的数学表达式.·将第一步中得到的问题重新表达成第二步选定额建模方法所需要的形式. ·你可能需要将第一步中的一些变量名改成与第二步所用的记号一致.·记下任何补充

数学建模算法理论+程序

数学建模的各类算法汇总,带书签!文字可复制. 01 线性规划 02 整数规划 03 非线性规划 04 动态规划 05 图与网络 06 排队论 07 对策论 08 层次分析法 09 插值与拟合 10 数据的统计描述和分析 11 方差分析 12 回归分析 13 微分方程建模 14 稳定状态模型 15 常微分方程的解法 16 差分方程模型 17 马氏链模型 18 变分法模型 19 神经网络模型 20 偏微分方程模型 21 目标规划 22 模糊数学模型 23 现代优化算法 24 时间序列模型 25 贮存

数学建模比赛论文的基本结构

一.常用的三种结构 一 二 三 1.摘要 1.摘要 1.摘要 2.问题重述 2.问题的提出与重述.问题的分析 2.问题的叙述.背景的分析 3.问题的分析 3.变量假设 3.模型的假设.符号说明 4.模型假设 4.模型建立 4.模型建立 5.符号说明 5.模型求解 5.模型求解 6.模型建立 6.模型分析与检验 6.模型检验 7.模型求解 7.模型的评价与推广 7.模型评价 8.结果分析.验证.模型检验及修正 8.参考文献 8.参考文献 9.模型评价 9.附录 9.附录 10.参考文献     1

数学建模竞赛题目

建模意义 思考方法 数学建模是一种数学的思考方法,是运用数学的语言和方法,通过抽象.简化建立能近似刻画并"解决"实际问题的一种强有力的数学手段. 数学建模就是用数学语言描述实际现象的过程.这里的实际现象既包涵具体的自然现象比如自由落体现象,也包含抽象的现象比如顾客对某种商品所取的价值倾向.这里的描述不但包括外在形态,内在机制的描述,也包括预测,试验和解释实际现象等内容. 我们也可以这样直观地理解这个概念:数学建模是一个让纯粹数学家(指只研究数学而不管数学在实际中的应用的数学家)变成物理

数学建模入门书籍介绍

数学模型 需要入门: 马氏链 需要进一步学习:   博弈,  概率 , 统计回归,  差分方程 需要加强: 离散, 图论等 这本书融合知识在例子中,  不太方便知识点查阅,  但是便于从零学起某一模型 数学建模方法 这本书前有知识后有实例, 适合主攻数学的同学入手 数学建模算法与程序 这二货竟然带程序, 样本,  算法还多,  有数学推导,  整整1000页, 绝对是编程同学不二之选 MATLAB在数学建模中的应用 同上 MATLAB统计分析与应用 40个案例分析 看名字就知道啦