跟着川川学数模-Day5

一、一些废话

哦莫,终于到了我最喜欢且不会的东西了,动态规划,求解最优路径,学会这玩意就能处理简单的TSP问题了,那么让我们来看看怎么用Matlab实现。

二、最短路径求解

2.1 稀疏矩阵

哦莫,果然上来就是我不会的,那我们来试试吧!

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

这两个代码运行出来的结果是一样的:

 

2.2 最短路径

2.2.1 有向图

先跟着弄一个有向图,代码如下,代码中G为稀疏矩阵,0/false为无向图,1/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],[35 85 47 27 13 38 29 28 31 21 17])
view(biograph(G,[],'ShowWeights','on'))

 运行一下得到如下图,哦莫除了figure竟然还有biograph viewer:

 接下来要求最优路径,那咱咋弄呢,川川说加一行代码,就可以,如下:

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],[35 85 47 27 13 38 29 28 31 21 17])
view(biograph(G,[],'ShowWeights','on'))
graphallshortestpaths(G)

 然后就出来了这ans:

ans =0   112    45    48    17    7796     0    47    58    27    8751    77     0    13    68    4238    64    50     0    55    2969    95    28    31     0    6072    35    21    34    62     0

根据结果推算1到6的最优路径是多少呢?

第一行可以推出,从1先到5,距离最短只要17;

那么我们看第五行,最短是28,所以我们从5到3;

跳到第三行后,我们看第三行,第三行最短的是13,所以我们3到4;

跳到第四行,最短29,到6,至此,结束,我们来计算下总距离:

17+28+13+29=87,最优路径为1-5-3-4-6。

这个时候,川川给出了一个function,可以免去这些个计算的困扰,我们来试下:

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],[35 85 47 27 13 38 29 28 31 21 17])
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 =66path =1     5     3     6

真的很nice(不过这里我有个小小的疑问,为什么上下两个求解不同捏,后续我再做探究)

 (这里先存疑,等下午重新改改代码看看,等一波修正)

2.2.2 无向图

 继续沿用前一小问,构造稀疏矩阵,代码如下:

clear all
clc
W = [35 85 47 27 13 38 29 28 31 21 17];
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'))

运行一下得到如下图:

 一样可以调用函数:

clear all
clc
W = [35 85 47 27 13 38 29 28 31 21 17];
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)

结果如下:

ans =0    44    45    38    17    6644     0    47    58    27    3545    47     0    13    28    2138    58    13     0    31    2917    27    28    31     0    4966    35    21    29    49     0

我们同2.2.1一样分析:

17+27+35=79,1-5-2-6

当然使用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],[35 85 47 27 13 38 29 28 31 21 17])
plot(G,'EdgeLabel',G.Edges.Weight)
[P,d] = shortestpath(G,1,6)

 答案如下:


P =1     5     3     6d =66

至此,结束。

(为啥呢为啥呢,为啥又不一样的答案呢,等会和川川探讨一波)

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

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

相关文章

c#获取对象的唯一标识_DDD领域驱动设计实战 - 创建实体身份标识的常用策略

从简单到复杂依次为&#xff1a;3.1.1 用户提供唯一标识这时用户将输入一些可识别的数值或符号&#xff0c;或从已有标识中选其一&#xff0c;然后创建实体对象。这是一种非常简单方案&#xff0c;但也可能变得复杂。由于需用户自己生成高质量的标识。所以标识可能唯一&#xf…

java - 计算距离和反弹

根据提示输入次数&#xff0c;控制台输出对应的距离和反弹的距离。 效果演示 代码展示 package com.one;import java.util.*; public class High {public static Scanner input new Scanner(System.in);public static void main(String[] args) {System.out.println("…

【youcans 的 OpenCV 例程200篇】139. 灰度顶帽变换校正阴影

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】139. 灰度顶帽变换校正阴影 灰度级形态学将形态学操作从二值图像扩展到灰度图像。灰度形态学处理也…

quartus管脚分配后需要保存吗_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...

磁盘未分配的这部分磁盘空间上没有任何分区&#xff0c;也就是说这部分空间无法用来保存数据。那么&#xff0c;什么原因会导致磁盘变成未分配呢&#xff1f;1、删除分区&#xff1a;在平时使用电脑的时候会有意或无意的将分区删除掉。磁盘上的分区被删除之后&#xff0c;在磁盘…

【youcans 的 OpenCV 例程200篇】140. 灰度底帽变换校正光照

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】140. 灰度底帽变换校正光照 灰度级形态学将形态学操作从二值图像扩展到灰度图像。灰度形态学处理也…

java - 条件嵌套

根据提示输入一个分数&#xff0c;程序会计算并输出你输入成绩所在的等级&#xff0c;利用条件运算符的嵌套来完成此分类表示&#xff1a;学习成绩> 90 分的同学用 A 表示&#xff0c;60-89 分之间的用 B 表示&#xff0c;60 分以下的用 C 表示。 结果演示 代码演示 pack…

量化信噪比 非均匀量化_达尔优EM910牧马人轻量化游戏鼠标拆解评测

达尔优牧马人还真是一款经久不衰的模具&#xff0c;2012年推出至今&#xff0c;历经数次升级换代&#xff0c;已从最早期的“杀马特”风格变得硬核起来。为这一款中端定位的游戏鼠标&#xff0c;加入KBS按键衡力系统&#xff0c;也搭载有定制PMW3336光学传感器。然后机身配色设…

【youcans 的 OpenCV 例程200篇】141. 灰度底帽变换的三维地形图

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】141. 灰度底帽变换的三维地形图 5.3 灰度顶帽变换和灰度底帽运算 图像相减结合开运算和闭运算&am…

java - 水仙花数

经典的java程序练习&#xff0c;求水仙花数。 输出101-1000之间的所有水仙花数 水仙花数是指一个数各位上的数字的立方和等于该数本身 结果演示 代码演示 package com.two;public class Shuixianhua {public static void main(String[] args) {int num1, num2, num3;for(in…

【youcans 的 OpenCV 例程200篇】142. 基于灰度形态学的图像平滑

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】142. 基于灰度形态学的图像平滑 5.4 灰度形态学之图像平滑 由于开运算和闭运算对亮细节和暗细节的…

序列二次规划_最优控制与规划

&#xff08;以下内容均来源于 CS 294 Lecture 8&#xff09;首先我们假设环境是确定性的&#xff0c;即在某个状态执行某个动作之后&#xff0c;转移到的下一个状态是确定的&#xff0c;不存在任何随机性。而在这种情况下&#xff0c;我们想做的是在环境给了我们一个初始状态的…

java - 求a+aa+aaa+aa...a之和

求如 saaaaaaaaaaaa…a 之和&#xff0c;其中 a 是一个数字&#xff0c;根据提示输入个位数字和最高位数&#xff0c;计算并输出结果。 222222222222222(此时共有 5 个数相加)&#xff0c;几个数相加由键盘控制 结果演示 代码演示 package com.two;import java.util.*;publ…

Go_defer详解

defer 1. 前言 defer语句用于延迟函数的调用&#xff0c;每次defer都会把一个函数压入栈中&#xff0c;函数返回前再把延迟的函数取出并执行。 为了方便描述&#xff0c;我们把创建defer的函数称为主函数&#xff0c;defer语句后面的函数称为延迟函数。 延迟函数可能有输入…

【youcans 的 OpenCV 例程200篇】143. 基于灰度形态学的粒度测定

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】143. 基于灰度形态学的粒度测定 5.5 灰度形态学之粒度分析 粒度测度是指确定图像中颗粒的大小分布…

无法自动进入并单步执行服务器_膳食纤维无法进入血液执行营养功能,吃它有啥用?...

膳食纤维是植物性食物中所含不能被人体吸收、消化分解利用的碳水化合物&#xff0c;包含纤维素、半纤维素、木质秦和果胶等物质。其中&#xff0c;膳食纤维根据其水溶性又可再分为可溶性和不可水溶性。可溶性膳食纤维包括果胶、藻胶、树胶和黏液&#xff0c;多存在于水果、海藻…

java - 求素数

求素数&#xff0c;求出设定范围内所有的素数并进行控制台输出&#xff0c;输出101-200之间的所有素数 素数曾称质数。一个大于1的正整数&#xff0c;如果除了1和它本身以外&#xff0c;不能被其他正整数整除&#xff0c;就叫素数 结果演示 代码演示 package com.two; //输…

【youcans 的 OpenCV 例程200篇】144. 基于灰度形态学的纹理分割

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】144. 基于灰度形态学的纹理分割 5.6 灰度形态学之纹理分割 形态学的纹理分割是以纹理内容为基础&…

activity 变成后台进程后被杀死_Android 后台运行白名单,优雅实现保活

作者&#xff1a;NanBox链接&#xff1a;https://www.jianshu.com/p/32b7241124a2欢迎关注专栏&#xff1a;里面定期分享Android架构技术知识点及解析&#xff0c;还会不断更新的BATJ面试专题&#xff0c;欢迎大家前来探讨交流&#xff0c;如有好的文章也欢迎投稿。Android开发…

java - 菲波拉契数列 兔子个数

菲波拉契数列&#xff1a;有一对兔子&#xff0c;从出生后第 3 个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 结果演示 代码演示 package com.two;public clas…

【youcans 的 OpenCV 例程200篇】145. 形态学之边缘和角点检测

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】145. 形态学之边缘和角点检测 5.7 形态学之边缘和角点检测 边缘和角点不仅保留了图像的重要特征&…