目录
什么是动态规划
怎么使用动态规划?
例题:最短路线问题
2020b-问题一
稳定性分析
灵敏度分析
什么是动态规划
基本想法:将原问题转换为一系列相互联系的子问题,然后通过逐层递推求得最后的解
基本思想:解决最优解问题,满足最优性原理(最优策略的任何一部分子策略必需是最优的)
在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。
动态规划算法中蕴含着递归的思想,但是递归问题中会出现某些子问题被计算多次,而如果利用动态规划算法,可以把已经计算过的子问题的解给装起来,然后用到的时候再拿出来,减少计算次数。
例如:斐波拉契数列
递归求法
//定义主函数
#include<stdio.h>
int main()
{int F(int n); //数组printf("%d\n",F(5));return 0;
}
//Fibonacci数列的递归算法
int F(int n)
{// 进行条件判断if(n<=1){return 1;}else{return F(n-1)+F(n-2);}
}
动态规划求法
#include<stdio.h>
int main()
{int Fibonacci(int n);printf("%d\n",Fibonacci(5));return 0;
}
int Fibonacci(int n)
{//申请一个数组存放子问题的解 int f[n+1],i;f[0]=1;f[1]=1;for(i=2;i<=n;i++){f[i]=f[i-1]+f[i-2];}return f[n];
}
怎么使用动态规划?
1.将过程分为恰当的阶段
2.找变量,定义决策变量
3.明确目标,写出目标函数
4.列约束,寻找对于得到最优解的约束条件
5.写出状态转移方程,根据状态才可作出决策
例题:最短路线问题
根据题目,可以分为七个阶段
解题时只需将每一条路径全都定义出来,然后导入数据大致就可解出答案
但是为了掌握其他导入数据的方法,我们考虑通过xlsx导入数据,通过一顿操作,输入数据,空值使用-1代替
然后写入空值,选择内容,“ctrl+h”-定位-空值- ‘-1’ -“ctrl+enter”
还需要定义数据名称,拖拽选中数据,在左上角进行定义(可以看下面的另一张表格图)
model:
sets:
vertex/V1..V16/:V; //定义一个名为V的顶点集合(把它理解成一个点,还没有赋值)road(vertex,vertex):R_D2; //定义一个名为R_D2的道路集合
RR(road)|R_D2(&1,&2)#gt#0:D; //定义一个名为D的距离矩阵,其元素是道路集合R_D2中的元素,且距离大于0
endsets
原本没有加粗行的定义,但是因为数据中空值用-1代替,所以我们需要将非-1的值拿出来
`xx(xx)`这是正常的变量定义,`|`这个符号表示过滤,后面表示R_D2数据要大于等于0,并赋值为D。不难发现,这个过滤的语言只是多了`|`and`#`,其他与bash语言是比较相近的。
经上述操作就可以筛选出非空的路程值
data:
R_D2=@ole('D:\jianmo\R.xlsx');
enddata
下面进行数据导入
参考:lingo基础入门Day 11——lingo外部访问数据、文本文件、电子表格、数据库_lingo读取excel数据-CSDN博客
利用ole函数
- 访问Excel电子表格的关键是在Excel中定义数据库
- 定义数据块的方法是先选择单元格区域,从右键菜单中选定义名称,本题定义为R_D2
- 用lingo访问Excel电子表格前,应当先用Excel打开相应的数据文件,否则不能读写数据。
写出约束
运用for函数遍历出所有D的情况
@for(RR(i,j):D(i,j)=R_D2(i,j));
将起点(V1)的值设置为0
运用for函数与min函数对集进行循环,计算除起点外的其他顶点的最短路径值。
对于每个顶点i(除了起点),将其值设置为所有可能的前驱顶点j的最短路径值加上从j到i的距离的最小值。
V(1)=0;
@for(vertex(i)|i#gt#1:V(i)=@min(RR(j,i):V(j)+D(j,i)));
end
2020b-问题一
2020全国大学生数学建模竞赛论文展示(B125) - 2020全国大学生数学建模竞赛论文展示 - 中国大学生在线 (moe.gov.cn)
2020全国大学生数学建模竞赛B题讲评:穿越沙漠 - 2020数学建模赛题讲评 - 中国大学生在线 (moe.gov.cn)
稳定性分析
李雅普诺夫(第二方法)稳定性分析+例题_证明李亚普诺夫atp+pa=-q-CSDN博客
这个我看不太懂
灵敏度分析
数学建模评价类方法01——灵敏度分析_数学建模灵敏度分析怎么写-CSDN博客
上面的链接写的很好
在解题时,结果会受到多个因素的影响,有一些因素是固定的,有一些因素在实际中是有变化的,此时,我们通过取该因素周围值,进行计算,如果对结果有影响,那我们就说这是敏感的,那究竟有多敏感,就要进行灵敏度分析,看结果与变化率的关系。