最短路径和距离及可视化——matlab

文章目录

一、前言

二、最短路线

2.1 教程

2.1.1 sparse创建稀疏矩阵

2.1.2 有向图最短路径(1)

2.1.3 有向图最短路径(2)

2.1.4 无向图最短路径(1)

2.1.5无向图最短路径(2)


一、前言

动态规划是求解某类问题的一种方法,是考察问题的一种途径,而不是一种特殊算法(如线性规划是一种算法)。因而,它不象线性规划那样有一个标准的数学表达式和明确定义的一组规则,而必须对具体问题进行具体分析处理。因此,在学习时,除了要对基本概念和方法正确理解外,应以丰富的想象力去建立模型,用创造性的技巧去求解。

二、最短路线

2.1 教程

2.1.1 sparse创建稀疏矩阵

比如我们有这样的无向图:

 代码:

%w(起点,终点)=权重值clear all
clc
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)

运行结果:

 或者这样创建稀疏矩阵:

clear all
clc
%sparse([起点集合],[对应终点集合],[对应权重集合])
G = sparse([1 1 1 2 2],[2 3 4 3 4],[2 3 8 6 6]);
s=sparse(G)

运行结果:  可以看出与上面一样

2.1.2 有向图最短路径(1)

使用函数:graphallshortestpaths,其语法如下:

参数含义:
G:稀疏矩阵
0/false代表无向图 1/true代表有向图。默认为true。

我们要解决如下问题:
首先创建一个有向图:

代码:

clear all
clc
G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21])
view(biograph(G,[],'ShowWeights','on'))

运行结果:

 第二步:找出有向图中每对节点之间的所有最短路径。

使用graphallshortestpaths函数,只需要加一行代码即可:

clear all
clc
G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21])
view(biograph(G,[],'ShowWeights','on'))
%添加代码如下
graphallshortestpaths(G)

运行结果:

 那返回的结果什么意思呢?
比如说第一行代表的意思就是节点一分别到节点六的距离。为什么第一个值为0?节点一到节点一当然在原位置了,肯定为0咯。第二行类似一样的道理。
因此:从节点一到节点六最短距离为多少呢?最短距离为95可以从返回表中一眼看出来。留个问题:节点二到节点一位111怎么得到的?路径位?
根据结果推路径:

第一行推出:节点一先到节点五,此时距离为21(为么选节点五?因为节点一到节点五最短,每次都选择最短)

然后我们再跳到第五行:节点五要先到节点四,距离为36 

于是我们再跳到第四行:节点四要先到节点六,距离为38

 此时我们已经完成节点一到节点六距离为:

21+36+38=95

路径为:1—5—4—6
下面我在介绍一个新的方法,会更简单!



2.1.3 有向图最短路径(2)

保存该函数:dijkstra.m(你不需要修改,知道这个函数具体意思,我们调用它就行)

function [min,path]=dijkstra(w,start,terminal)
n=size(w,1); label(start)=0; f(start)=start;
for i=1:nif i~=startlabel(i)=inf;
end, end
s(1)=start; u=start;
while length(s)<nfor i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endendif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v)); f(v)=u;end endend   
v1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endendif ins==0v=i;if k>label(v)k=label(v);  v1=v;endendends(length(s)+1)=v1;  u=v1;
end
min=label(terminal); path(1)=terminal;
i=1; 
while path(i)~=startpath(i+1)=f(path(i));i=i+1 ;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);

然后现在我们再来解决一次上面同样的问题:

 比如求一到六节点最短路径:

% 构造邻接矩阵
a = zeros(6);
a = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21])
a = a + a';
a(a==0) = inf; % 零元素换成inf
a(eye(6,6)==1)=0; % 对角线换成 0 
view(biograph(a,[],'ShowWeights','on'))
[min,path]=dijkstra(a,1,6) % dijkstra模型求解节点一到节点六最短路径

输出:

min就是最短路径为82,路径过程为:1 5 3 6

同样是求最短路径,该方法可能更简单,你只需要在这里创建一个矩阵,可以求任意两个节点的最短距离和路径。请领悟一下,在你的博客写好记录。



2.1.4 无向图最短路径(1)

还是求解这个问题:

 我们先用上面的第一种方法求:

clear all
clc
W = [41 99 51 32 15 45 38 32 36 29 21];
G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W)
UG = tril(G + G')
view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))

输出:

 然后添加一行代码,使用求函数graphallshortestpaths(注意这个函数2021版本被弃用):

clear all
clc
W = [41 99 51 32 15 45 38 32 36 29 21];
G = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W);
UG = tril(G + G')
view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))
graphallshortestpaths(UG,'directed',false)

输出:

我们可以一样就看出节点一到节点六最短距离82.

用我上面的讲过的方法,可以看出路径为:1-5-3-6
21+32+29=53+29=82

2.1.5无向图最短路径(2)

其实我们可以使用函数shortestpath求解,更方便:

clc
clear all
% 构造邻接矩阵
G = zeros(6);
G = graph([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],[41 99 51 32 15 45 38 32 36 29 21])plot(G,'EdgeLabel',G.Edges.Weight)
[P,d] = shortestpath(G,1,6)

输出:

p就是路径,d就是最短距离,更方便了!

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

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

相关文章

c语言备忘录算法矩阵链乘,矩阵链乘法(备忘录法)

/** fileMemoMatrixchain.cpp* briefa solution of martrix chain with memorized way.* author/Univ.taoxiaoxiao/XMU* versionv1.0* date11-3-2013*///实例 A1-A6&#xff1a;30X35 35X15 15X5 5X10 10X20 20X25#include #include using namespace std;#define N 6#define IN…

没有bug队——加贝——Python 练习实例 1,2

目录 1.题目&#xff1a; 2.题目&#xff1a; 1.题目&#xff1a; 有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的…

关闭线程 C语言,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

【OpenCV 例程300篇】250. 梯度算子的传递函数

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】250. 梯度算子的传递函数 1. 空间卷积与频域滤波 空间域图像滤波是图像与滤波器核的卷积&#xff0c;而空间卷积的傅里叶变换是频率域中相应变换的乘积&#xff0c;因此频率域图像滤波是频率域滤波器…

JS贪吃蛇

Js实现贪吃蛇小游戏。 程序解析&#xff1a; 画表格&#xff0c;画出相对应大小的表格速度的快慢调节随机生成事物的位置使用键盘的方向键控制移动位置当贪吃蛇碰到四周游戏结束&#xff0c;弹框显示效果演示 代码演示 html内容 <!DOCTYPE html> <html><he…

没有bug队——加贝——Python 练习实例 3,4

3.题目&#xff1a; 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f; 程序分析&#xff1a; 假设该数为 x。 1、则&#xff1a;x 100 n2, x 100 168 m2 2、计算等式&#xff1a;m2 …

lcd4linux 1602,详解一种LCD1602 的4线接法

描述虽然LCD1602的显示屏幕与显示字符都较小&#xff0c;实用性并不强&#xff0c;但是在一般的教学实验中&#xff0c;它仍不失为一个常用的输出显示设备。LCD1602与单片机连接的线路共有11条&#xff0c;其中有8条数据线&#xff0c;3条控制线。如果把它们都连接上&#xff0…

没有bug队——加贝——Python 练习实例 5,6

目录 5.题目&#xff1a; 6.题目&#xff1a; 5.题目&#xff1a; 输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c;如果x>y则将x与y的值进行交换&#xff0c;然后再…

android launcher 字体大小,Android6.0 Launcher3 修改app字体大小

在原生的Android6.0中&#xff0c;在修改了系统字体大小后&#xff0c;Launcher 3上的app字体大小没有改变&#xff0c;下面方法可以解决&#xff1a;--- a/packages/apps/Launcher3/src/com/android/launcher3/BubbleTextView.java b/packages/apps/Launcher3/src/com/android…

Js常用40个页面效果

1.彻底屏蔽鼠标右键 οncοntextmenu"window.event.returnValuefalse" <table border οncοntextmenureturn(false)><td>no</table> 可用于Table取消选取、防止复制 <body onselectstart"return false"> 3.不准粘贴 οnpaste&qu…

MATLAB教程(1) MATLAB 基础知识(1)

第一部分&#xff1a;MATLAB显示桌面的基本布局 桌面基础知识- MATLAB & Simulink- MathWorks 中国 1.启动MATLAB后&#xff0c;桌面会显示默认布局&#xff0c;主要有以下三个部分&#xff1a; 当前文件夹命令行窗口工作空间 2.在MATLAB中一般需要创建变量和调用函数。…

【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域&#xff08;MSER&#xff09; 1. 最大稳定极值区域&#xff08;MSER&#xff09; 最大稳定极值区域&#xff08;MSER-Maximally Stable Extremal Regions&#xf…

android 手机号码显示加空格,Android实现输入手机号时自动添加空格

为了用户更好的体验,我们在输入手机号的时候 添加空格,方便用户查看是否输入错误,不多说代码上去final EditText et_phone (EditText) findViewById(R.id.et_phone);et_phone.addTextChangedListener(new TextWatcher() {Overridepublic void onTextChanged(CharSequence s, i…

电脑蹦迪

如何建立一个小程序让你的电脑蹦迪的呢&#xff1f; 效果演示 1.首先在桌面新建一个记事本 2.在里面添加如下代码 color 1A echo 电脑color 1B echo 电脑color 1C echo 电脑color 1D echo 电脑echo %0 3.保存记事本文件 4.修改后对名为.bat之后点击运行即可。

MATLAB教程(1) MATLAB 基础知识(2)

第三部分&#xff1a;数组的索引 数组索引- MATLAB & Simulink- MathWorks 中国 MATLAB中的每一个变量都是可以存储多个值的数组。如果想要使用数组中的某一个值&#xff0c;则需要用到索引。 1.单个元素的索引 从一个数组中索引某个元素一般有两种方法&#xff1a; 第…

android点击切换,android 导航栏中的按钮的点击切换

Drawable drawable_home res.getDrawable(R.drawable.main_home_selected);//图片drawable_home.setBounds(0, 0, drawable_home.getMinimumWidth(), drawable_home.getMinimumHeight());//设置边距home_bt.setCompoundDrawables(null, drawable_home, null, null);//设置按钮…

css动画与js动画的区别

CSS动画 优点&#xff1a; (1)浏览器可以对动画进行优化。 1、 浏览器使用与 requestAnimationFrame 类似的机制&#xff0c;requestAnimationFrame比起setTimeout&#xff0c;setInterval设置动画的优势主要是:requestAnimationFrame 会把每一帧中的所有DOM操作集中起来&…

没有bug队——加贝——Python 练习实例 7,8

7.题目&#xff1a; 将一个列表的数据复制到另一个列表中。 程序分析&#xff1a;使用列表[:]。 注&#xff1a;[:] 表示索引全部&#xff1b;[1:]表示从索引1到最后&#xff1b;[:2]表示从第一个索引到索引2前一个 a [1, 2, 3] b1 a[:] b2 a[1:] b3 a[:2] print (b1) …

ios android 字体颜色,iOS-修改导航栏文字字体和颜色

ASP&period;NET MVC搭建项目后台UI框架—9、服务器端排序ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET M ...一致性hash算法简介与代码实现一.简介: 一致性hash算法提…

云动画文字

用Js技术实现云动画文字。 效果演示 代码展示 html内容 <!doctype html> <html><head><meta charset"utf-8"><title></title><style>body {background-color:#000000;color:#555555; } h4 {font-family:sans-serif;co…