应用实例:
主要用于求解以时间划分动态的求解过程的优化问题,与时间无关的可引入时间求解。
含有递推的思想以及多种数学原理
给定k阶段状态变量x(k)的值后,如果这一阶段的决策变量一经确定,第k+1阶段的状态变量x(k+1)也就完全确定,即x(k+1)的值随x(k)和第k阶段的决策u(k)的值变化而变化,那么可以把这一关系看成(x(k),u(k))与x(k+1)确定的对应关系,用x(k+1)=Tk(x(k),u(k))表示。这是从k阶段到k+1阶段 的状态转移规律,称为 状态转移方程。
(1)确定问题的决策对象。 (2)对决策过程划分阶段。 (3)对各阶段确定 状态变量。 (4)根据状态变量确定费用函数和目标函数。 (5)建立各阶段状态变量的转移过程,确定状态转移方程。
以空间换时间
少占空间:1、从结点的 数据结构上考虑,仅仅 存储必不可少的内容,以及数据存储范围上精打细算(按位存储、压缩存储等)。
2、 在实现动态规划时,一个我们经常采用的方法是用一个与结点数一样多的数组来存储每一步的决策,这对于倒推求得一种实现最优解的方法是十分方便的,
3、内存空间紧张情况下,改成在从最优解逐级倒推时,再计算一次,选择某个可能达到这个值的上一阶段的状态,直到推出结果为止
4、如果上述情况下仍会发生溢出,可以用覆盖确定不用的数据的方式,重复使用内存。
(1).递推结果仅使用data1和data2两种数组,每次将data1作为上一阶段,推出data2,再以data2覆盖data1.局限性就是对于递推与前面若干问题相关的问题,这种做法比较麻烦,而且每推一级。就要复制很多内容,与前面多个阶段相关的问题影响很大。
(2)对于一个与前N个阶段相关的问题,建立数组data[0...n],其中各项为前面N个阶段保存数据,这样不采用这种内存节约方式时对于阶段k的访问只要对应成对数组Data中下标为k mod (N+1)的单元的访问就可以了
(3)使用动态内存的好处就是在重复使用内存交换时,可以只对指针进行交换而不用复制数据。
dfs: 深度优先搜索。深度优先搜索可以从多点开始。拓扑排序(“创建一个list,在每个节点相邻节点都被访问的情况下,见该节点加入list结尾,然后逆转整个链表”)
对于大规模的数据,dfs效率较低,常用提高效率的方法是剪枝。此外,,可以把搜索与动态规划完备匹配(匈牙利算法)等高效算法结合。
ctime 得到日历时间
代码示范
#include <stdio.h>
#include <time.h>
{
time_t timer=time(NULL);
printf("ctime is %s \n",ctime(&timer));
return 0;