数学建模--Floyd算法
来源:互联网 发布:360便签软件 编辑:程序博客网 时间:2024/05/20 03:44
Floyd算法的核心思想是通过迭代的方式比较当前点u到下一个点v的路径l1与当前点u经过其他所有点中的一点作为中转点再到达下一个点v的路径l2,如果如果l1>l2,这将l2作为v点的最短路径。
具体的matlab实现代码如下:
function [P u] = Floyd_path(W, k1, k2)%W表示权值矩阵%k1表示起点%k2表示终点%P表示最短路%u表示最短路的权和%以下代码是求出所有的两点之间的最短路径长%利用三层迭代%第一层迭代是遍历所有点作为中转点%第二层迭代是遍历所有点作为起点%第三层迭代是遍历所有点作为终点%通过第一层的迭代不断修改中转点最优化结果%可能有些人会误解,通过用两个点作为中转点不是可能会更短吗%其实代码已经一个点、两个点、三个点...作为中转的可能了%在三次迭代中,会有m次是以同两个点作为始点和终点%假设固定起点为1,终点为5,第一次是比较1-5与1-2-5的距离,%如果1-2-5的距离小于1-5,则用1-2-5的距离代替1-5的距离,%那么在下一次比较1-5与1-3-5的距离时,实际上是比较1-2-5与1-2-3-5的距离%如果1-2-5的距离不小于1-5,则不变,在下次则比较1-5与1-3-5,不需要考虑中转点2%因为中转点2并没有起到缩短1-5之间的最短距离%在下一轮迭代也类似n = length(W);U = W;m = 1;while m <= n for i = 1: n for j = 1: n if U(i, j) > U(i, m) + U(m, j) U(i, j) = U(i, m) + U(m, j); end end end m = m + 1;endu = U(k1, k2);%u为k1,k2之间的最短路径%下面的代码是接触最短路径的轨迹%利用的思想等同于两点之间有且仅有一条直线P1 = zeros(1: n);k = 1;P1(k) = k2;V = ones(1, n) * inf;kk = n;while kk ~= k1 for i = 1: n V(1, i) = U(k1, kk) - W(i, kk); if V(1, i) == U(k1, i) P1(k+1) = i; kk = i; k = k + 1; end endendk = 1;%剔除P1等于0的点,为0说明最短路径没有经过该点wrow = find(P1 ~= 0);for j = length(wrow): (-1): 1 P(k) = P1(wrow(j)); k = k+1;endP;
代码是从书上抄下来的,注释是根据我自己的理解写下来的,如果有不足之处,希望指正,如涉及产权问题,请指出。
阅读全文
0 0
- 数学建模--Floyd算法
- 数学建模常用算法
- 数学建模常用算法
- 数学建模常用算法
- 数学建模常用算法
- 数学建模(13)——MATLAB寻找最短路径(Dijkstra算法和Floyd算法)
- 数学建模十大算法
- 数学建模--K-近邻算法
- 数学建模建模建模
- 数学建模的十大算法
- 数学建模十大算法(收藏)
- 数学建模十大算法---来自百度
- 数学建模十大经典算法漫谈
- 数学建模十大经典算法漫谈
- 数学建模十大经典算法漫谈
- 数学建模十大算法漫谈
- 数学建模的十大算法
- 数学建模十大经典算法漫谈
- 开发技术分享
- 第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列
- U盘被做成操作系统盘后,如何恢复
- 基于数字光栅投影的结构光三维测量技术(总结)
- jQuery 控制页面滚动条显示和隐藏
- 数学建模--Floyd算法
- webservice 自动生成客户端代码
- SDUT-1164 C语言实验——矩阵转置
- 自定义注解,判断带注解的类或属性是否符合条件
- 浅谈并行程序设计中互斥量(Pthreads Mutexes)与信号量(Semaphores)的区别
- SDUT-1185 C语言实验——求一个3*3矩阵对角线元素之和
- Controller->Service->Repository
- Activity 的4种启动模式
- 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析