第四章5(贪心、动态)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在知道数塔的全貌的前提下,可以用枚举法或下一章将学 习的搜索算法来完成。
上节
精品课件
下节
算法设计
动态规划设计过程如下:
1.阶段划分: 第一步对于第五层的数据,我们做如下五次决策:
对经过第四层2的路径选择第五层的19, 对经过第四层18的路径选择第五层的10, 对经过第四层9的路径也选择第五层的10, 对经过第四层5的路径选择第五层的16。
print('max=’,a[1][1][2]); j=1; for( i=1 ;i<= n-1;i++) { print(a[i][j][1],‘->’);
j=j+a[i][j][3]; } print (a[n][j][1]); }
上节
下节 精品课件
从例子中可以看到:
动态规划=贪婪策略+递推(降阶)+存储递推结果
贪婪策略、递推算法都是在“线性”地解决问题,而动态规 划则是全面分阶段地解决问题。可以通俗地说动态规划是“带 决策的多阶段、多方位的递推算法”。
上节
下节
精品课件
4.5.2 算法框架
1.适合动态规划的问题特征
动态规划算法的问题及决策应该具有三个性质:最优 化原理、无后向性、子问题重叠性质。
上节
下节 精品课件
以上的决策结果将五阶数塔问题变为4阶子问题,递推 出第四层与第五层的和为:
21(2+19),28(18+10),19(9+10),21(5+16)。
用同样的方法还可以将4阶数塔问题,变为3阶数塔问题。 …… 最后得到的1阶数塔问题,就是整个问题的最优解。
上节
下节
精品课件
2.存储、求解:
第 四 章 基本的算法策略
4.5 动态规划 4.5.1 认识动态规划 4.5.2 算法框架 4.5.3 突出阶段性的动态规划应用 4.5.4 突出递推的动态规划应用
精品课件
4.5 动态规划
在动态规划算法策略中,体现在它的决策不是线性的而是 全面考虑不同的情况分别进行决策, 并通过多阶段决策来最终 解决问题。在各个阶段采取决策后, 会不断决策出新的数据,直 到找到最优解.每次决策依赖于当前状态, 又随即引起状态的转 移。一个决策序列就是在变化的状态中产生出来的,故有“动 态”的含义。所以,这种多阶段决策最优化的解决问题的过程 称为动态规划。
d[n][ j]=data[n][ j]
j=1,2,……,n;
i=n-1,n-2,……1,j=1,2,……,i;时
d[i][ j]=max(d[i+1][ j],d[i+1][ j+1])+data[i][ j]
最后a[1][1]存储的就是问题的结果。
上节
下节
精品课件
3) 最优解路径求解及存储
仅有数组data和数组a可以找到最优解的路径, 但需要自 顶向下比较数组data和数组a是可以找到。如图4.5.2求解和 输出过程如下:
上节
下节
精品课件
4.5.1 认识动态规划
我们通过一个简单的例子来说明动态规划的多阶段决策与贪 婪算法有什么区别。
【例1】 数塔问题
上节
下节
精品课件
【例1】数塔问题
有形如图4-11所示的一个数塔,从顶部出发,在每一结点可 以选择向左走或是向右走,一直走到底层,要求找出一条路径, 使路径上的数值和最大。
上节
下节
精品课件
输出a[1][1]"9"
b=d[1][1]-data[1][1]=59-9=50 b与d[2][1],d[2][2] 比较 b与d[2][1]相等输出data[2][1]"12"
b=d[2][1]-data[2][1]=50-12=38 b与d[3][1],d[3][2] 比较 b与d[3][1]相等输出data[3][1]"10"
b=a[3][1]-data[3][1]=38-10=28 b与d[4][1],d[4][2] 比 较 b与d[4][2]相等输出data[4][2]"18"
b=d[4][2]-data[4][2]=28-18=10 b与d[5][2],d[5][3] 比较 b与d[5][3]相等输出data[5]精[品3课]"件10“
a[50][50][1]代替数组data, a[50][50][2]代替数组d, a[50][50][3]记录解路径。
上节
下节
精品课件
数塔问题的算法
main( ) { int a[50][50][3],i,j,n;
print( 'please input the number of rows:'); input(n); for( i=1 ;i<=n;i+Байду номын сангаас)
上节 下节
数组data
数组d
9
59
12 15
50 49
10 6 8
38 34 29
2 18 9 5
21 28 19 21
19 7 10 4 16
19 7 10 4 16
图4-12 数塔及动态规划过程数据
上节
下节
精品课件
为了设计简洁的算法,我们最后用三维数组 a[50][50][3]存储以上确定的三个数组的信息。
问题分析 算法设计 算法 小结
精品课件
问题分析
这个问题用贪婪算法有可能会找不到真正的最大和。以 图4-11为例就是如此。用贪婪的策略,则路径和分别为:
9+15+8+9+10=51 (自上而下), 19+2+10+12+9=52(自下而上)。
都得不到最优解,真正的最大和是:
9+12+10+18+10=59。
1) 原始信息存储 原始信息有层数和数塔中的数据,层数用一个整型
变量n存储,数塔中的数据用二维数组data,存储成如 下的下三角阵:
9 12 15 10 6 2 18 19 7
8 95 10 4 16
上节
下节
精品课件
2) 动态规划过程存储
必需用二维数组a存储各阶段的决策结果。二维数组a 的存储内容如下:
for j=1 to i do { input(a[i][j][1]); a[i][ j][2]=a[i][ j][1]; a[i][ j][3]=0;}
上节
下节 精品课件
for (i=n-1 ; i>=1;i--) for (j=1 ;j>= i ;j++) if (a[i+1][j][2]>a[i+1][j+1][2]) { a[i][j][2]=a[i][j][2]+a[i+1][j][2]; a[i][ j][3]=0;} else { a[i][j][2]=a[i][j][2]+a[i+1][j+1][2]; a[i][ j][3]=1;}
上节
精品课件
下节
算法设计
动态规划设计过程如下:
1.阶段划分: 第一步对于第五层的数据,我们做如下五次决策:
对经过第四层2的路径选择第五层的19, 对经过第四层18的路径选择第五层的10, 对经过第四层9的路径也选择第五层的10, 对经过第四层5的路径选择第五层的16。
print('max=’,a[1][1][2]); j=1; for( i=1 ;i<= n-1;i++) { print(a[i][j][1],‘->’);
j=j+a[i][j][3]; } print (a[n][j][1]); }
上节
下节 精品课件
从例子中可以看到:
动态规划=贪婪策略+递推(降阶)+存储递推结果
贪婪策略、递推算法都是在“线性”地解决问题,而动态规 划则是全面分阶段地解决问题。可以通俗地说动态规划是“带 决策的多阶段、多方位的递推算法”。
上节
下节
精品课件
4.5.2 算法框架
1.适合动态规划的问题特征
动态规划算法的问题及决策应该具有三个性质:最优 化原理、无后向性、子问题重叠性质。
上节
下节 精品课件
以上的决策结果将五阶数塔问题变为4阶子问题,递推 出第四层与第五层的和为:
21(2+19),28(18+10),19(9+10),21(5+16)。
用同样的方法还可以将4阶数塔问题,变为3阶数塔问题。 …… 最后得到的1阶数塔问题,就是整个问题的最优解。
上节
下节
精品课件
2.存储、求解:
第 四 章 基本的算法策略
4.5 动态规划 4.5.1 认识动态规划 4.5.2 算法框架 4.5.3 突出阶段性的动态规划应用 4.5.4 突出递推的动态规划应用
精品课件
4.5 动态规划
在动态规划算法策略中,体现在它的决策不是线性的而是 全面考虑不同的情况分别进行决策, 并通过多阶段决策来最终 解决问题。在各个阶段采取决策后, 会不断决策出新的数据,直 到找到最优解.每次决策依赖于当前状态, 又随即引起状态的转 移。一个决策序列就是在变化的状态中产生出来的,故有“动 态”的含义。所以,这种多阶段决策最优化的解决问题的过程 称为动态规划。
d[n][ j]=data[n][ j]
j=1,2,……,n;
i=n-1,n-2,……1,j=1,2,……,i;时
d[i][ j]=max(d[i+1][ j],d[i+1][ j+1])+data[i][ j]
最后a[1][1]存储的就是问题的结果。
上节
下节
精品课件
3) 最优解路径求解及存储
仅有数组data和数组a可以找到最优解的路径, 但需要自 顶向下比较数组data和数组a是可以找到。如图4.5.2求解和 输出过程如下:
上节
下节
精品课件
4.5.1 认识动态规划
我们通过一个简单的例子来说明动态规划的多阶段决策与贪 婪算法有什么区别。
【例1】 数塔问题
上节
下节
精品课件
【例1】数塔问题
有形如图4-11所示的一个数塔,从顶部出发,在每一结点可 以选择向左走或是向右走,一直走到底层,要求找出一条路径, 使路径上的数值和最大。
上节
下节
精品课件
输出a[1][1]"9"
b=d[1][1]-data[1][1]=59-9=50 b与d[2][1],d[2][2] 比较 b与d[2][1]相等输出data[2][1]"12"
b=d[2][1]-data[2][1]=50-12=38 b与d[3][1],d[3][2] 比较 b与d[3][1]相等输出data[3][1]"10"
b=a[3][1]-data[3][1]=38-10=28 b与d[4][1],d[4][2] 比 较 b与d[4][2]相等输出data[4][2]"18"
b=d[4][2]-data[4][2]=28-18=10 b与d[5][2],d[5][3] 比较 b与d[5][3]相等输出data[5]精[品3课]"件10“
a[50][50][1]代替数组data, a[50][50][2]代替数组d, a[50][50][3]记录解路径。
上节
下节
精品课件
数塔问题的算法
main( ) { int a[50][50][3],i,j,n;
print( 'please input the number of rows:'); input(n); for( i=1 ;i<=n;i+Байду номын сангаас)
上节 下节
数组data
数组d
9
59
12 15
50 49
10 6 8
38 34 29
2 18 9 5
21 28 19 21
19 7 10 4 16
19 7 10 4 16
图4-12 数塔及动态规划过程数据
上节
下节
精品课件
为了设计简洁的算法,我们最后用三维数组 a[50][50][3]存储以上确定的三个数组的信息。
问题分析 算法设计 算法 小结
精品课件
问题分析
这个问题用贪婪算法有可能会找不到真正的最大和。以 图4-11为例就是如此。用贪婪的策略,则路径和分别为:
9+15+8+9+10=51 (自上而下), 19+2+10+12+9=52(自下而上)。
都得不到最优解,真正的最大和是:
9+12+10+18+10=59。
1) 原始信息存储 原始信息有层数和数塔中的数据,层数用一个整型
变量n存储,数塔中的数据用二维数组data,存储成如 下的下三角阵:
9 12 15 10 6 2 18 19 7
8 95 10 4 16
上节
下节
精品课件
2) 动态规划过程存储
必需用二维数组a存储各阶段的决策结果。二维数组a 的存储内容如下:
for j=1 to i do { input(a[i][j][1]); a[i][ j][2]=a[i][ j][1]; a[i][ j][3]=0;}
上节
下节 精品课件
for (i=n-1 ; i>=1;i--) for (j=1 ;j>= i ;j++) if (a[i+1][j][2]>a[i+1][j+1][2]) { a[i][j][2]=a[i][j][2]+a[i+1][j][2]; a[i][ j][3]=0;} else { a[i][j][2]=a[i][j][2]+a[i+1][j+1][2]; a[i][ j][3]=1;}