【建模算法】动态规划与最优路径问题(matlab求解)

【建模算法】动态规划与最优路径问题(matlab求解)

最短路径问题手工求解

可用倒序求解:
在这里插入图片描述

存在的问题:繁琐、易出错、难以求解大规模问题

图的矩阵表示方法

图是由节点和边构成的。边是连接两个节点的直接路径。如果边是有向的,则图称为有向图,否则称为无向图。

在计算机中,图用矩阵表示,即邻接矩阵。MATLAB语言支持邻接矩阵的稀疏矩阵表示方法。

邻接矩阵表示

构造邻接矩阵的稀疏矩阵函数调用格式:
在这里插入图片描述
其中,a i _i i 为起始节点向量, b i b_i bi 为终止节点向量, w i w_i wi为边权值向量,这里i=1,2,…,m

各个向量最后的一个值使得邻接矩阵为方阵。

有向图的路径寻优

例:有向图的矩阵描述
在这里插入图片描述
在这里插入图片描述
建立邻接矩阵并显示图

代码:

ab=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; 
bb=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9];
w=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; 
R=sparse(ab,bb,w); R(9,9)=0;
h=view(biograph(R,[],'ShowWeights','on'))

在这里插入图片描述

搜索最短路径

代码:

[d,p]=graphshortestpath(R,1,9)
set(h.Nodes(p),'Color',[1 0.4 0.4])
edges=getedgesbynodeid(h,get(h.Nodes(p),'ID'));
set(edges,'LineColor',[1 0 0])

在这里插入图片描述

d =
    19
p =
     1     3     4     5     7     9

即:节点1到达节点9的最短路径权值为19,路径:1->3->4->5->7->9

无向图的路径最优搜索

无向图的邻接矩阵的构造方法:

先按照有向图的方式构造邻接矩阵 R

无向图的邻接矩阵为:
在这里插入图片描述

如果无向图中,某些边是有向的,则手工修改该矩阵。若由节点 ij 与由节点 ji 的边权值是不同的,用手工方法重新定义和修改。

Dijstra算法

利用Dijstra算法,我们编写了一个求任意两点最短路径的函数:

function [d,path]=dijkstra(W,s,t)    
%Dijkstra搜索算法
%输入参数:W为邻接矩阵,s为起点,t为重点
%输出参数:d为最短路径权值,path为最短路径

[n,m]=size(W); ix=(W==0); W(ix)=Inf;  %将不通路径的权值统一设置为无穷大
if n~=m, error('Square W required'); end  %如果邻接矩阵不是方阵,给出错误信息
visited(1:n)=0; dist(1:n)=Inf; parent(1:n)=0; dist(s)=0; d=Inf; %设置各种标记
for i=1:(n-1),   %求出每个节点与起始节点的关系
   ix=(visited==0); vec(1:n)=Inf; vec(ix)=dist(ix); [a,u]=min(vec); visited(u)=1;
   for v=1:n, if (W(u,v)+dist(u)<dist(v)), dist(v)=dist(u)+W(u,v); parent(v)=u;
end; end; end
if parent(t)~=0, path=t; d=dist(t);  %回溯最短路径
   while t~=s, p=parent(t); path=[p path]; t=p; end
end

利用该函数求解,求解前述算例:

clear,clc;
ab=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量
bb=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量
w=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10];  %权值向量
R=sparse(ab,bb,w); R(9,9)=0; %邻接矩阵
W=ones(9);
[d,p]=dijkstra(R.*W,1,9)   %搜索从节点1到达节点9最优路径

结果:

d =
    19
p =
     1     3     4     5     7     9

  • 9
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模糊算法是一种基于模糊逻辑理论的智能算法,在PID控制器参数求解问题中有着广泛的应用。Matlab是一种集成开发环境,能够方便地实现模糊算法。下面介绍一下如何利用Matlab实现模糊算法求解PID最优参数的代码。 首先,在Matlab中数学建模涉及到三个步骤:输入、处理、输出。 输入: 当我们用模糊控制进行PID参数的调整时,需要输入的变量包括目标值、反馈值等。在Matlab中可以定义输入变量并进行模糊化处理。 例如: close_system('fuzzyPID'); %关掉已有的fuzzyPID模型 fis = newfis('fuzzyPID','mamdani','min','max','min','max','none'); %新建fuzzyPID模型 fis = addvar(fis,'input','E',[-10 10]); %加入误差变量 fis = addmf(fis,'input',1,'NB','gaussmf',[0.2 -10]); %NB模糊化处理 fis = addmf(fis,'input',1,'NM','gaussmf',[0.2 -5]); fis = addmf(fis,'input',1,'NS','gaussmf',[0.2 0]); fis = addmf(fis,'input',1,'ZO','gaussmf',[0.2 5]); fis = addmf(fis,'input',1,'PS','gaussmf',[0.2 10]); fis = addmf(fis,'input',1,'PB','gaussmf',[0.2 15]); 处理: 定义好输入变量后,需要处理它们以获得输出。在Matlab中,可以使用模糊化函数fuzzy和模糊控制函数evalfis进行处理。 例如: fuzzy(E); %对输入变量误差E进行模糊化处理 kp = evalfis([E],fis,'output',1); %计算kp输出变量 输出: 计算得出算法的输出变量后,需要将其转化为可视化结果以便进行比较和分析。Matlab中可以使用图形化函数fuzzyset和surf进行可视化。 例如: fuzzyset(fis,'input',1); %对fuzzyPID模型进行可视化 fuzzyset(fis,'output',1); surf(fis,'output',1); %将结果用三维图形可视化 综上所述,在Matlab中实现模糊算法求解PID最优参数的代码主要包括输入变量的定义和模糊化处理、处理函数的计算和输出变量的可视化。利用Matlab进行模糊算法求解PID最优参数,不仅可以提高算法的准确性,还能够快速地获得可视化结果,方便用户进行比较和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值