导航:首页 > 源码编译 > 动态规划matlab算法

动态规划matlab算法

发布时间:2022-05-27 09:17:50

‘壹’ 在matlab中怎样求矩阵中任意两点间的距离呢

我们老师给的标准程序,我原封不动送给你吧,系统地讲最短路问题的,要用在你的矩阵的情况的话记得把你里面0全改成inf,耐心看吧,阐述得很完整了,绝对是个高效的算法

Dijkstra算法
Edser Dijkstra 是荷兰计算机科学家,于1959年发表了Dijkstra算法,时年29岁. 这算法计算具有非负权的N阶矩阵W的图上从源点S(Source), S(1..N), 出发到达所有各点K, K=1..N, 的最短路。(Edward F. Moore 在1957年也得到类似的算法).
算法
1. 对每个点I指定一个离点S的距离初始值L(I). 在始点S的值为零, 即L(S)=0,其它点的值为Inf.
2. 所有的点标记为未走访的. 置始点S为当前点C.
3. 对于当前点C, 考虑它的所有未走访的相邻点J, 并更新J的距离值为
L(J)=min(L(J), L(C)+W(C,J))
4. 把当前点C标记为走访过的点. 走访过的点C的距离L(C)就是点S到C的最短距离, 而且以后不再检查走访过得点了.
5. 如果所有的点都是走访过的点, 完成. 不然, 把未走访的点中具有最小距离值的点作为下一个当前点C, 转步骤3.
编制程序的要求: 给定N阶非负权矩阵W, W(I,J)是从点I到点J的距离, W(I,I)的值可以赋以任意值(比较方便的是赋以Inf). 如果只需求源点S(Source)到达指定的终点T(Target),给出最短路径Z及其长度L(T); 如果不指定终点T时,Z是一个N维行向量,Z(K)表示S点到K点的最短路上K点的前一点, Z(S)=0, L是一个N维行向量, L(K)是S点到K点的最短距离. 如果不给出源点S及终点T, 则默认源点S=1, 按不指定终点的情况办.
MATLAB函数子程序dijkstra.m为:
function [L,Z]=dijkstra(W,S,T)
%用 Dijkstra 算法求最短路,W(I,J)是从点 I 到点 J 的距离, W(I,I)=0,I,J=1..n; 点 I 和点 J 无边直接相连时,W(I,J)=inf.
% L表示从始点 S 到终点 T 的最短距离, Z 表示点 S 到 T 的一条最短路径. 当不给出终点 T 时,L(J)表示从点 S 到点 J 的最短距离, J=1..n; Z(I)表示最短路径上点 I 的前一点(父亲点),
% 可由 Z 追溯最短路径,当不给出起点 S 及终点 T 时默认 S = 1 及按不指定终点的情况办.
if nargin<2 S=1;T=0; elseif nargin<3 T=0; end;%如只给出W, 默认始点 S=1;算出S到所有点的距离; 如没给出终点, 算出S到所有点的距离;
N=length(W(:,1));%顶点数
L=Inf*ones(1,N);,L(S)=0;%L赋初值,在S点为0,其它点为Inf
C=S; %当前点为始点S
Q=1:N;% 未走访的顶点集
Z=S*ones(1,N); Z(S)=0;% Z赋初值,因始点 S 无父亲点,故把 S 点的Z值改为0
for K=1:N % 更新 L 和 Z 的循环
Q=setdiff(Q,C); %当前点 C 未走访的点集
[L(Q),ind]=min([L(Q);L(C)+W(C,Q)]);%当前点C已走访了所有的相邻的未走访的点,更新 L
Z(Q(find(ind==2)))=C; %更新Z, 至此C已是走访过的点了
if T&C==T %若 C 点是终点 T, 不用再计算到其它未走访的点的最短路
L=L(T); %最短路长;
road=T;%最短路径终点;
while T~=S%追溯最短路径上的点
T=Z(T); road=[road,T];
end
Z=road(length(road):-1:1); %颠倒次序;
return;
end;
[null, mC]=min(L(Q));
if null==Inf
disp('到值是Inf的点的路不通!'); Z(find(L==Inf))=nan; return;
else
C=Q(mC);% 把未走访的点集Q中与始点距离最近的点作为新的当前点C;
end;end;
Dijkstra算法的证明:
以下实质上是用动态规划思想的证明.
记第 K 阶段开始时考虑的当前点为C(K),则第 K 阶段完成时确定的当前点为C(K+1),记集合P(K)={C(1),C(2),…,C(K)}, 记 Q(K)为 P(K) 的余集. 我们来证明对于每个点V∈P(K), L(V)是从源点S到点V点的最短路的长度, K=1..N.
证明:对 K 施行数学归纳法,当 K=1 时, P(1)={S}, V=S, L(V)=0, 命题真; 设对于K=M, M≥1, N≥M时命题真, 即当V∈P(M)时, L(V)是S到V的最短路的长度. 由于P(M+1)=P(M)∪{C(M+1)}, 所以只要证明 L(C(M+1))是点S到C(M+1)点的最短路的长度. 记 R:=C(1)..C(M+1) 是从 S=C(1) 到 C(M+1)的任意一条路, 记L(C(J);I)为在K=I阶段, J>I时更新的L(C(J))的值. 则从 S 出发沿路 R 往 C(M+1)走时, 必存在第一条边(C(I),C(J))使得C(I)∈P(M),C(J)∈Q(M). 由归纳假设, 这条路 R 的长度W(R)≥L(C(I))+W(C(I),C(J))+W(C(J)..C(M+1))
≥L(C(I))+W(C(I),C(J)).
按算法,在第K=I阶段完成时,L(C(I))+W(C(I),C(J))≥L(C(J);I). 因I≤M, 故L(C(J);I)≥L(C(J);M), 从而W(R)≥L(C(J);M). 由算法, L(C(M+1))≤L(C(J);M); 故W(R)≥L(C(M+1)); 另外按算法, 确有长度等于L(C(M+1))的一条路径, 证毕.

‘贰’ 如何用Matlab编写这个动态规划的程序

一种比较好的办法是在matlab的安装目录下新建一个文件夹,可命令为“我的函数”,把你的源文件放在这个文件夹中,然后把这个文件夹在添加为默认搜索路径。
添加的方法是:
File->set
path..,然后选择文件夹保存即可

‘叁’ matlab的算法有哪些急用!谢谢啊!

MATLAB 产品族可以用来进行以下各种工作:
● 数值分析
● 数值和符号计算
● 工程与科学绘图
● 控制系统的设计与仿真
● 数字图像处理 技术
● 数字信号处理 技术
● 通讯系统设计与仿真
● 财务与金融工程
MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特定类型的问题。
matlab特点
●此高级语言可用于技术计算
●此开发环境可对代码、文件和数据进行管理
●交互式工具可以按迭代的方式探查、设计及求解问题
●数学函数可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等
●二维和三维图形函数可用于可视化数据
●各种工具可用于构建自定义的图形用户界面
●各种函数可将基于MATLAB的算法与外部应用程序和语言(如 C、C++、Fortran、Java、COM 以及 Microsoft Excel)集成
MATLAB的优势
(1)友好的工作平台和编程环境
MATLAB由一系列工具组成。这些工具方便用户使用MATLAB的函数和文件,其中许多工具采用的是图形用户界面。包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。
(2)简单易用的程序语言
Matlab一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程特点。用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂的应用程序(M文件)后再一起运行。新版本的MATLAB语言是基于最为流行的C++语言基础上的,因此语法特征与C++语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机专业的科技人员使用。而且这种语言可移植性好、可拓展性极强,这也是MATLAB能够深入到科学研究及工程计算各个领域的重要原因。
(3)强大的科学计算机数据处理能力
MATLAB是一个包含大量计算算法的集合。其拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。函数中所使用的算法都是科研和工程计算中的最新研究成果,而前经过了各种优化和容错处理。在通常情况下,可以用它来代替底层编程语言,如C和C++ 。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。MATLAB的这些函数集包括从最简单最基本的函数到诸如矩阵,特征向量、快速傅立叶变换的复杂函数。函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程的组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等。
(4)出色的图形处理功能

图形处理功能 MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。可用于科学计算和工程绘图。新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。
(5)应用广泛的模块集合工具箱
MATLAB对许多专门的领域都开发了功能强大的模块集和工具箱。一般来说,它们都是由特定领域的专家开发的,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自己编写代码。目前,MATLAB已经把工具箱延伸到了科学研究和工程应用的诸多领域,诸如数据采集、数据库接口、概率统计、样条拟合、优化算法、偏微分方程求解、神经网络、小波分析、信号处理、图像处理、系统辨识、控制系统设计、LMI控制、鲁棒控制、模型预测、模糊逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开发、定点仿真、DSP与通讯、电力系统仿真等,都在工具箱(Toolbox)家族中有了自己的一席之地。
(6)实用的程序接口和发布平台
新版本的MATLAB可以利用MATLAB编译器和C/C++数学库和图形库,将自己的MATLAB程序自动转换为独立于MATLAB运行的C和C++代码。允许用户编写可以和MATLAB进行交互的C或C++语言程序。另外,MATLAB网页服务程序还容许在Web应用中使用自己的MATLAB数学和图形程序。MATLAB的一个重要特色就是具有一套程序扩展系统和一组称之为工具箱的特殊应用子程序。工具箱是MATLAB函数的子程序库,每一个工具箱都是为某一类学科专业和应用而定制的,主要包括信号处理、控制系统、神经网络、模糊逻辑、小波分析和系统仿真等方面的应用。
(7)应用软件开发(包括用户界面)
在开发环境中,使用户更方便地控制多个文件和图形窗口;在编程方面支持了函数嵌套,有条件中断等;在图形化方面,有了更强大的图形标注和处理功能,包括对性对起连接注释等;在输入输出方面,可以直接向Excel和HDF5进行连接。

‘肆’ 动态规划的推法 谢谢

DP是把一个很大的有阶段性有最佳答案问题分割成许多子问题,每个子问题有自己的最优情况(最优子结构),也就是说,每个动态规划的问题都是有许多最有子结构接和起来的,而推法就是要分割出最有子结构
然后对这个小问题得出最优的答案,并由此推出全局的最优解

1.最优子结构性质;

设Q[i,j]表示第i颗珠子到第j颗珠子合并所产生的能量。显然Q[1,n]表示的是合并产生的总的能量。给定一种标号方法,maxQ[1,n]就是所要求的。设最后一次合并在k处进行,则有Q[1,n]=Q[1,k]+Q[k+1,n]+top[1]*wei[k]*wei[n]。要Q[1,n]最大,必然要Q[1,k],Q[k+1,n]最大。
证明:假设Q[1,k]不是最大,则必然存在一Q'[1,k]>Q[1,k]。那么就有Q'[1,n]=Q'[1,k]+Q[k+1,n]+top[1]*wei[k]*wei[n]>Q[1,k]。这与Q[1,n]的最优性矛盾

能量项链其实就是石子合并

算法分析
竞赛中多数选手都不约而同地采用了尽可能逼近目标的贪心法来逐次合并:从最上面
的一堆开始,沿顺时针方向排成一个序列。 第一次选得分最小(最大)的相邻两堆合并,
形成新的一堆;接下来,在N-1堆中选得分最小(最大)的相邻两堆合并……,依次类推,
直至所有石子经N-1次合并后形成一堆。

例如有6堆石子,每堆石子数(从最上面一堆数起,顺时针数)依次为3 46 5
4 2

(图6.2-5)
要求选择一种合并石子的方案,使得做5次合并,得分的总和最小。
按照贪心法,合并的过程如下:
每次合并得分
第一次合并 3 4 6 5 4 2 5
第二次合并 5 4 6 5 4 9
第三次合并 9 6 5 4 9
第四次合并 9 6 9 15
第五次合并 15 9 24
24
总得分=5+9+9+15+24=62

但是当我们仔细琢磨后,可得出另一个合并石子的方案:
每次合并得分
第一次合并 3 4 6 5 4 2 7
第二次合并 7 6 5 4 2 13
第三次合并 13 5 4 2 6
第四次合并 13 5 6 11
第五次合并 13 11 24
24
总得分=7+6+11+13+24=61
显然,后者比贪心法得出的合并方案更优。 题目中的示例故意造成一个贪心法解题的
假像,诱使读者进入“陷阱”。为了帮助读者从这个“陷阱”里走出来, 我们先来明确一
个问题:

1.最佳合并过程符合最佳原理
使用贪心法至所以可能出错, 是因为每一次选择得分最小(最大)的相邻两堆合并,
不一定保证余下的合并过程能导致最优解。聪明的读者马上会想到一种理想的假设:如果N
-1次合并的全局最优解包含了每一次合并的子问题的最优解,那么经这样的N-1次合并后
的得分总和必然是最优的。
例如上例中第五次合并石子数分别为13和11的相邻两堆。 这两堆石头分别由最初
的第1,2,3堆(石头数分别为3,4,6)和第4,5,6堆(石头数分别为5,4,
2)经4次合并后形成的。于是问题又归结为如何使得这两个子序列的N-2 次合并的得分
总和最优。为了实现这一目标,我们将第1个序列又一分为二:第1、2堆构成子序列1,
第3堆为子序列2。第一次合并子序列1中的两堆,得分7; 第二次再将之与子序列2的
一堆合并,得分13。显然对于第1个子序列来说,这样的合并方案是最优的。同样,我
们将第2个子序列也一分为二;第4堆为子序列1,第5,6堆构成子序列2。第三次合
并子序列2中的2堆,得分6;第四次再将之与子序列1中的一堆合并,得分13。显然
对于第二个子序列来说,这样的合并方案也是最优的。 由此得出一个结论——6堆石子经
过这样的5次合并后,得分的总和最小。
我们把每一次合并划分为阶段,当前阶段中计算出的得分和作为状态, 如何在前一次
合并的基础上定义一个能使目前得分总和最大的合并方案作为一次决策。很显然,某阶段
的状态给定后,则以后各阶段的决策不受这阶段以前各段状态的影响。 这种无后效性的性
质符最佳原理,因此可以用动态规划的算法求解。

2.动态规划的方向和初值的设定
采用动态规划求解的关键是确定所有石子堆子序列的最佳合并方案。 这些石子堆子序
列包括:
{第1堆、第2堆}、{第2堆、第3堆}、……、{第N堆、第1堆};
{第1堆、第2堆、第3堆}、{第2堆、第3堆、第4堆}、……、{第N堆、第1
堆、第2堆};
……
{第1堆、……、第N堆}{第1堆、……、第N堆、第1堆}……{第N堆、第1堆、
……、第N-1堆}

为了便于运算,我们用〔i,j〕表示一个从第i堆数起,顺时针数j堆时的子序列
{第i堆、第i+1堆、……、第(i+j-1)mod n堆}
它的最佳合并方案包括两个信息:
①在该子序列的各堆石子合并成一堆的过程中,各次合并得分的总和;
②形成最佳得分和的子序列1和子序列2。由于两个子序列是相邻的, 因此只需记住
子序列1的堆数;

f〔i,j〕——将子序列〔i,j〕中的j堆石子合并成一堆的最佳得分和;
c〔i,j〕——将〔i,j〕一分为二,其中子序列1的堆数;
(1≤i≤N,1≤j≤N)
显然,对每一堆石子来说,它的
f〔i,1〕=0 c〔i,1〕=0 (1≤i≤N)
对于子序列〔i,j〕来说,若求最小得分总和,f〔i,j〕的初始值为∞; 若求最大得
分总和,f〔i,j〕的初始值为0。(1≤i≤N,2≤j≤N)。
规划的方向是顺推。先考虑含二堆石子的N个子序列(各子序列分别从第1堆、第2堆、
……、第N堆数起,顺时针数2堆)的合并方案
f〔1,2〕,f〔2,2〕,……,f〔N,2〕
c〔1,2〕,c〔2,2〕,……,c〔N,2〕

然后考虑含三堆石子的N个子序列(各子序列分别从第1堆、第2堆、……、第N堆
数起,顺时针数3堆)的合并方案
f〔1,3〕,f〔2,3〕,……,f〔N,3〕
c〔1,3〕,c〔2,3〕,……,c〔N,3〕
……

依次类推,直至考虑了含N堆石子的N个子序列(各子序列分别从第1堆、第2堆、 …
…、第N堆数起,顺时针数N堆)的合并方案
f〔1,N〕,f〔2,N〕,……,f〔N,N〕
c〔1,N〕,c〔2,N〕,……,c〔N,N〕

最后,在子序列〔1,N〕,〔2,N〕,……,〔N,N〕中,选择得分总和(f值)最
小(或最大)的一个子序列〔i,N〕(1≤i≤N),由此出发倒推合并过程。

3.动态规划方程和倒推合并过程
对子序列〔i,j〕最后一次合并,其得分为第i堆数起,顺时针数j堆的石子总数t。被
合并的两堆石子是由子序列〔i,k〕和〔(i+k-1)modn+1,j-k〕(1≤k≤j-1)
经有限次合并形成的。为了求出最佳合并方案中的k值,我们定义一个动态规划方程:
当求最大得分总和时
f〔i,j〕=max{f〔i,k〕+f〔x,j-k〕+t}
1≤k≤j-1
c〔i,j〕=k│ f〔i,j〕=f〔i,k〕+f〔x,j-k〕+t
(2≤j≤n,1≤i≤n)

当求最小得分总和时
f〔i,j〕=min{f〔i,k〕+f〔x,j-k〕+t}
1≤k≤j-1
c〔i,j〕=k│ f〔i,j〕=f〔i,k〕+f〔x,j-k〕+t
(2≤j≤n,1≤i≤n)
其中x=(i+k-1)modn+1,即第i堆数起,顺时针数k+1堆的堆序号。

例如对(图6.2-4)中的6堆石子,按动态规划方程顺推最小得分和。 依次得出含
二堆石子的6个子序列的合并方案
f〔1,2〕=7 f〔2,2〕=10 f〔3 ,2〕=11
c〔1,2〕=1 c〔2,2〕=1 c〔3,2〕=1
f〔4,2〕=9 f〔5,2〕=6 f〔6,2〕=5
c〔4,2〕=1 c〔5, 2〕=1 c〔6,2〕=1

含三堆石子的6个子序列的合并方案
f〔1,3〕=20 f〔2,3〕=25 f〔3,3〕=24
c〔1,3〕=2 c〔2,3〕=2 c〔3,3〕=1
f〔4,3〕=17 f〔5,3〕=14 f〔6,3〕=14
c〔4,3〕=1 c〔5,3〕=1 c〔6,3〕=2

含四堆石子的6个子序列的合并方案
f〔1,4〕=36 f〔2,4〕=38 f〔3,4〕=34
c〔1,4〕=2 c〔2,4〕=2 c〔3,4〕=1
f〔4,4〕=28 f〔5,4〕=26 f〔6,4〕=29
c〔4,4〕=1 c〔5,4〕=2 c〔6,4〕=3

含五堆石子的6个子序列的合并方案
f〔1,5〕=51 f〔2,5〕=48 f〔3,5〕=45
c〔1,5〕=3 c〔2,5〕=2 c〔3,5〕=2
f〔4,5〕=41 f〔5,5〕=43 f〔6,5〕=45
c〔4,5〕=2 c〔5,5〕=3 c〔6,5〕=3

含六堆石子的6个子序列的合并方案
f〔1,6〕=61 f〔2,6〕=62 f〔3,6〕=61
c〔1,6〕=3 c〔2,6〕=2 c〔3,6〕=2
f〔4,6〕=61 f〔5,6〕=61 f〔6,6〕=62
c〔4,6〕=3 c〔5,6〕=4 c〔6,6〕=3

f〔1,6〕是f〔1,6〕,f〔2,6〕,……f〔6,6〕中的最小值,表明最小
得分和是由序列〔1,6〕经5次合并得出的。我们从这个序列出发, 按下述方法倒推合
并过程:
由c〔1,6〕=3可知,第5次合并的两堆石子分别由子序列〔1,3〕和子序列〔
4,3〕经4次合并后得出。其中
c〔1,3〕=2可知由子序列〔1,3〕合并成的一堆石子是由子序列〔1,2〕和
第三堆合并而来的。而c〔1,2〕=1,以表明了子序列〔1,2〕的合并方案是第1堆
合并第2堆。
由此倒推回去,得出第1,第2次合并的方案
每次合并得分
第一次合并 3 4 6…… 7
第二次合并 7 6…… 13
13……
子序列〔1,3〕经2次合并后合并成1堆, 2次合并的得分和=7+13=20。
c〔4,3〕=1,可知由子序列〔4,3〕合并成的一堆石子是由第4堆和子序列〔5,
2〕合并而来的。而c〔5,2〕=1,又表明了子序列〔5,2〕的合并方案是第5堆合
并第6堆。由此倒推回去,得出第3、第4次合并的方案
每次合并得分
第三次合并 ……54 2 6
第四次合并 ……5 6 11
……11
子序列〔4,3〕经2次合并后合并成1堆,2次合并的得分和=6+11=17。
第五次合并是将最后两堆合并成1堆,该次合并的得分为24。
显然,上述5次合并的得分总和为最小
20+17+24=61

上述倒推过程,可由一个print(〔子序列〕)的递归算法描述
procere print (〔i,j〕)
begin
if j〈〉1 then {继续倒推合并过程
begin
print(〔i,c〔i,j〕);{倒推子序列1的合并过程}
print(〔i+c〔i,j〕-1)mod n+1,j-c〔i,j〕)
{倒推子序列2的合并过程}
for K:=1 to N do{输出当前被合并的两堆石子}
if (第K堆石子未从圈内去除)
then begin
if(K=i)or(K=X)then置第K堆石子待合并标志
else第K堆石子未被合并;
end;{then}
第i堆石子数←第i堆石子数+第X堆石子数;
将第X堆石子从圈内去除;
end;{then}
end;{print}
例如,调用print(〔1,6〕)后的结果如下:
print(〔1,6〕)⑤

┌——————┴——————┐
│ │
print(〔1,3〕)② print(〔4,3〕)④
│ │
print(〔1,2〕)① ┌—————┴—————┐
│ │ │

┌—————┴—————┐ print(〔4,1〕) print(〔5,2〕)③
│ │ │
print(〔1,1〕) print(〔2,1〕) │
┌——————┴——————┐
│ │
print(〔5,1〕) print(〔6,1〕)
(图6.2-5)
其中回溯至
① 显示 3 46 5 4
② 显示 7 65 4 2
③ 显示 13 54 2
④ 显示 135 6
⑤ 显示 13 11
注:调用print过程后,应显示6堆石子的总数作为第5次合并的得分

‘伍’ 求教:如何用Matlab编写这个动态规划的程序

建立数学模型设xi=1表示Ai被选中,xi=0表示Ai没被选中。则数学模型是:max 1500x1+2000x2+1300x3+2300x4+2800x5s.t. x1+x2=1 x4+x5=1 x1+x4<=1 x2-x5=0 xi=0或1,i=1,2,3,4,5 2.编程求解matlab程序:f=[-1500-2000-1300-2300-2800];A=[10010];b=1;Aeq=[11000;00011;0100-1];beq=[1;1;0];x=bintprog(f,A,b,Aeq,beq)解出来是:x= 0 1 1 0 1也就是说运送A2,A3,A5

‘陆’ 如何用matlab解新技术的推广模型

一年一度的全国数学建模大赛在今年的9 月22 日上午8 点拉开战幕,各队
将在3 天72 小时内对一个现实中的实际问题进行模型建立,求解和分析,确定
题目后,我们队三人分头行动,一人去图书馆查阅资料,一人在网上搜索相关信
息,一人建立模型,通过三人的努力,在前两天中建立出两个模型并编程求解,
经过艰苦的奋斗,终于在第三天完成了论文的写作,在这三天里我感触很深,现
将心得体会写出,希望与大家交流。
1. 团队精神:
团队精神是数学建模是否取得好成绩的最重要的因素,一队三个人要相互支
持,相互鼓励。切勿自己只管自己的一部分(数学好的只管建模,计算机好的只
管编程,写作好的只管论文写作),很多时候,一个人的思考是不全面的,只有
大家一起讨论才有可能把问题搞清楚,因此无论做任何板块,三个人要一起齐心
才行,只靠一个人的力量,要在三天之内写出一篇高水平的文章几乎是不可能的。
2. 有影响力的leader:
在比赛中,leader 是很重要的,他的作用就相当与计算机中的CPU,是全队
的核心,如果一个队的leader 不得力,往往影响一个队的正常发挥,就拿选题来说,有人
想做A 题,有人想做B 题,如果争论一天都未确定方案的话,可能就
没有足够时间完成一篇论文了,又比如,当队中有人信心动摇时(特别是第三天,人可能
已经心力交瘁了),leader 应发挥其作用,让整个队伍重整信心,否则可能导致队伍的前
功尽弃。
3. 合理的时间安排:
做任何事情,合理的时间安排非常重要,建模也是一样,事先要做好一个规
划,建模一共分十个板块(摘要,问题提出,模型假设,问题分析,模型假设,
模型建立,模型求解,结果分析,模型的评价与推广,参考文献,附录)。你每
天要做完哪几个板块事先要确定好,这样做才会使自己游刃有余,保证在规定时
间内完成论文,以避免由于时间上的不妥,以致于最后无法完成论文。
4. 正确的论文格式:
论文属于科学性的文章,它有严格的书写格式规范,因此一篇好的论文一定
要有正确的格式,就拿摘要来说吧,它要包括6 要素(问题,方法,模型,算法,结论,特色)
,它是一篇论文的概括,摘要的好坏将决定你的论文是否吸引评委的目光,但听阅卷老师
说,这次有些论文的摘要里出现了大量的图表和程序,这都是不符合论文格式的,这种论
文也不会取得好成绩,因此我们写论文时要端正态度,注意书写格式。
5. 论文的写作:
我个人认为论文的写作是至关重要的,其实大家最后的模型和结果都差不
多,为什么有些队可以送全国,有些队可以拿省奖,而有些队却什么都拿不到,
这关键在于论文的写作上面。一篇好的论文首先读上去便使人感到逻辑清晰,有
条例性,能打动评委;其次,论文在语言上的表述也很重要,要注意用词的准确
性;另外,一篇好的论文应有闪光点,有自己的特色,有自己的想法和思考在里
面,总之,论文写作的好坏将直接影响到成绩的优劣。
6. 算法的设计:算法的设计的好坏将直接影响运算速度的快慢,建议大家多用数学软件(
Mathematice,Matlab,Maple, Mathcad,Lindo,Lingo,SAS 等),这里提供十种数学
建模常用算法,仅供参考:
1、 蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决
问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必
用的方法)
2、数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数
据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab 作为工具)
3、线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多
数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通
常使用Lindo、Lingo 软件实现)
4、图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算
法,涉及到图论的问题可以用这些方法解决,需要认真准备)
5、动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算
法设计中比较常用的方法,很多场合可以用到竞赛中)
6、最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些
问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,
但是算法的实现比较困难,需慎重使用)
7、网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很
多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种
暴力方案,最好使用一些高级语言作为编程工具)
8、一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计
算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替
积分等思想是非常重要的)
9、数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分
析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编
写库函数进行调用)
10、图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文
中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问
题,通常使用Matlab 进行处理)
以上便是我这次参加这次数学建模竞赛的一点心得体会,只当贻笑大方,不
过就数学建模本身而言,它是魅力无穷的,它能够锻炼和考查一个人的综合素质,
也希望广大同学能够积极参与到这项活动当中来。

‘柒’ 在matlab里怎么实现序列比对动态规划算法

这个我记不零清了,算算很简单的,生物信息学课本上有详细例题的。你到图书馆借个课本,对着做就好了,很好理解的。我学过挺久了,怕给你讲错了

‘捌’ 求货郎担问题的matlab算法

货郎担问题有很多解法,模拟退火,遗传算法,动态规划等。

基于matlab TSP问题遗传算法的实现
%TSP问题(又名:旅行商问题,货郎担问题)遗传算法通用matlab程序
%D是距离矩阵,n为种群个数,建议取为城市个数的1~2倍,
%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
%m为适应值归一化淘汰加速指数 ,最好取为1,2,3,4 ,不宜太大
%alpha为淘汰保护指数,可取为0~1之间任意小数,取1时关闭保护功能,最好取为0.8~1.0
%R为最短路径,Rlength为路径长度
function [R,Rlength]=geneticTSP(D,n,C,m,alpha)

[N,NN]=size(D);
farm=zeros(n,N);%用于存储种群
for i=1:n
farm(i,:)=randperm(N);%随机生成初始种群
end
R=farm(1,:);%存储最优种群
len=zeros(n,1);%存储路径长度
fitness=zeros(n,1);%存储归一化适应值
counter=0;

while counter<c

for i=1:n
len(i,1)=myLength(D,farm(i,:));%计算路径长度
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);%计算归一化适应值
rr=find(len==minlen);
R=farm(rr(1,1),:);%更新最短路径

FARM=farm;%优胜劣汰,nn记录了复制的个数
nn=0;
for i=1:n
if fitness(i,1)>=alpha*rand
nn=nn+1;
FARM(nn,:)=farm(i,:);
end
end
FARM=FARM(1:nn,:);

[aa,bb]=size(FARM);%交叉和变异
while aa<n
if nn<=2
nnper=randperm(2);
else
nnper=randperm(nn);
end
A=FARM(nnper(1),:);
B=FARM(nnper(2),:);
[A,B]=intercross(A,B);
FARM=[FARM;A;B];
[aa,bb]=size(FARM);
end
if aa>n
FARM=FARM(1:n,:);%保持种群规模为n
end

farm=FARM;
clear FARM
counter=counter+1

end

Rlength=myLength(D,R);

function [a,b]=intercross(a,b)
L=length(a);
if L<=10%确定交叉宽度
W=1;
elseif ((L/10)-floor(L/10))>=rand&&L>10
W=ceil(L/10);
else
W

http://blog.renren.com/share/231644124/531791903

‘玖’ matlab编程动态规划最短路径问题

以前搞建模在网上下到的代码,不是自己编的,但经过试验可以用,分享了:

function len=dijkstra(Input)
%最短路Dijkstra算法,同时给出路径,input为图矩阵

row=size(Input,1);

%赋初值
% s_path=1;
distance=inf*ones(1,row);
distance(1)=0;
% flag(1)=1;
temp=1;

%求起点到各点的最短路的权
% s_path=ones(1,3);
while length(s_path)<row
pos=find(Input(temp, : )~=inf);
n=length(pos);
flag=ones(1,n);
for i=1:n
if (isempty(find(s_path==pos(i),1)))&&(distance(pos(i))>...
(distance(temp)+Input(temp,pos(i))))
distance(pos(i))=distance(temp)+Input(temp,pos(i));
flag(pos(i))=temp;
end
end
k=inf;
for i=1:row
if (isempty(find(s_path==i,1)))&&(k>distance(i))
k=distance(i);
temp_2=i;
end
end
s_path=[s_path,temp_2];
temp=temp_2;
end

%用追溯法得到起点到各点的最短路的路线
len=zeros(1,row);
for endpoint=1:row
path=0; %初始化
path(1)=endpoint;
i=1;
while path(i)~=1
path(i+1)=flag(path(i));
i=i+1;
end
path(i)=1;
path=path(end:-1:1); %最短路径
short_distance=distance(endpoint); %最短路径权
len(endpoint)=short_distance; %起点到各点的最短距离
pathall=path; %总路径矩阵
end

len=len(25:end);

%{
disp('起点到各点的最短路径:');
celldisp(pathall);
%设法只画出最短路径
em=find(w==inf);
w(em)=0;
h = view(biograph(w,[],'ShowWeights','on'));
%}
邮箱给你发了个资料,多年前搞的,估计是忘了,也许这个函数有点问题,你按资料里的做吧

‘拾’ 求一个动态规划资源分配问题的MATLAB程序

最好说清楚是啥问题,看看能不能编程处理,请把要求贴出来看看。

阅读全文

与动态规划matlab算法相关的资料

热点内容
抖音python面试算法题 浏览:86
java单击事件 浏览:641
绝对尺寸编程法 浏览:265
服务器共享文件夹中病毒 浏览:35
哪个app会员看综艺最全 浏览:761
程序员朋友圈招聘 浏览:339
细细的小木棍怎么做解压玩具 浏览:36
不要惹程序员的视频 浏览:995
码高编程如何加盟 浏览:756
程序员好处有哪些 浏览:954
c语言编译后的程序 浏览:12
公交卡单片机 浏览:745
减压缩软件下载 浏览:300
51单片机复位电路有哪两种 浏览:924
et2008加密狗教程 浏览:965
安卓手机用什么录制高清视频 浏览:749
cadim命令如何应用 浏览:951
免费ntp时钟服务器地址 浏览:686
域名如何与云服务器绑定 浏览:808
linuxjava环境搭建教程 浏览:128