第六周动态规划

分类

动态规划的数学模型。根据决策过程的演变是确定性的还是随机性的。可分为确定性决策过程和随机性决策过程。另外。也可按时间参量是离散的或是连续的变量。分为离散决策过程和连续决策过程。组合起来就有离散确定性.离散随机性.连续确定性.连续随机性四种决策过程模型 。

对于确定性的决策过程。问题中下一段的状态已由当前段的状态及决策完全确定。对于随机性决策过程。它与确定性决策过程的区别在于下一段的状态并不能由当前段的状态及决策完全确定。而是按某种概率分布来决定下一段的状态。这种概率分布是由当前段的状态和决策完全确定   

局限性

动态规划对于解决多阶段决策问题的效果是明显的,但是动态规划也有一定的局限性。首先,它没有统一的处理方法,必须根据问题的各种性质并结合一定的技巧来处理;另外当变量的维数增大时,总的计算量及存贮量急剧增大。因而,受计算机的存贮量及计算速度的限制,当今的计算机仍不能用动态规划方法来解决较大规模的问题,这就是“维数障碍”。

使用动态规划实现小白兔拔萝卜问题

任务描述:

2

3

1

2

4

3

2

4

3

3

2

3

3

3

2

2

0

2

4

1

3

1

2

2

2

 

#include<stdlib.h>

#include<stdio.h>

#include <time.h>

const int M=5;//萝卜地行数

const int N=5;//萝卜地列数

int v[M][N],c[M][N];//萝卜数矩阵,最优萝卜数矩阵

int diguiluobo(int m,int n)

{

//分四种情况计算,期中三种情况需要递归调用

for(int i=0;i<=m;i++){

for(int j=0;j<=n;j++){

if(i==0&&j==0)  c[i][j]=v[i][j];//入口即出口

if(i==0&&j!=0)  c[i][j]=c[i][j-1]+v[i][j];

if(i!=0&&j==0)  c[i][j]=c[i-1][j]+v[i][j];

if(i!=0&&j!=0){//其他部分

if(c[i][j-1]>=c[i-1][j]){

c[i][j]=c[i][j-1]+v[i][j];

}else{

c[i][j]=c[i-1][j]+v[i][j];

}

}

}

}

return c[m][n];

}

void xunlu(int m,int n)

{

printf("%d,%d\n",m,n);

while(m!=0||n!=0)

{

if(m==0){

n--;

printf("%d,%d\n",m,n);

}else if(n==0){

m--;

printf("%d,%d\n",m,n);

}else if(c[m-1][0]>=c[m][n-1]){

m--;

printf("%d,%d\n",m,n);

}else{

n--;

printf("%d,%d\n",m,n);

}

}

//反向寻找最优萝卜矩阵中最优解的来源

}

int main()

{

int i,j,count;

printf("一片萝卜地如下:\n");

for(i=0;i<M;i++)

{

for(j=0;j<N;j++)

{

v[i][j]=rand()%10;

c[i][j]=0;

printf("%d  ",v[i][j]);

}

printf("\n");

}

count=diguiluobo(M-1,N-1);

printf("递归小萝卜结果为%d\n",count);

printf("最优萝卜矩阵如下:\n");

for(i=0;i<M;i++)

{

for(j=0;j<N;j++)

{

printf("%d  ",c[i][j]);

}

printf("\n");

}

printf("xunlu(追踪解)如下:\n");

xunlu(M-1,N-1);

return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值