- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章动态规划算法实验指导
第3章 动态规划算法
实验3.1 动态规划算法的实现与时间复杂度测试
1. 实验目的
编程实现经典的动态规划算法,理解动态规划算法设计的基本思想、程序实现的相关技巧,加深对动态规划算法设计与分析思想的理解。通过程序的执行时间测试结果,与理论上的时间复杂度结论进行对比、分析和验证。
2. 原理解析
动态规划算法的基本思想
动态规划是一种在 HYPERLINK /wiki/%E6%95%B0%E5%AD%A6 \o 数学 数学和计算机科学中使用的、用于求解包含 HYPERLINK /w/index.php?title=%E9%87%8D%E5%8F%A0%E5%AD%90%E9%97%AE%E9%A2%98action=editredlink=1 \o 重叠子问题 重叠子问题的 HYPERLINK /wiki/%E6%9C%80%E4%BC%98%E5%8C%96 \o 最优化 最优化问题的有效方法。其基本思想是:将原问题分解为相似的子问题,在求解的过程中通过子问题的解描述并求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域,在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题,为了避免多次解决这些子问题,它们的结果都逐渐被计算并保存,从小规模的子问题直到整个问题都被解决。因此,动态规划对每一子问题只做一次计算,具有较高的效率。
测试算法
0-1背包问题是使用动态规划算法求解的代表问题,算法如下:
KnapsackDP ({w1, w2, …, wn}, {v1, v2, …, vn}, C)
for i=0 to n do
m[i,0]=0
end for
for j=0 to C do
m[0,j]=0
end for
for i=1 to n do
for j=1 to C do
m[i,j]=m[i-1,j]
if wi£j then
m[i,j]=max{m[i,j],m[i-1,j-wi]+vi}
end if
end for
end for
return m[n,C]
算法的时间复杂度为O(nC)。
3. 实验内容
编程实现以上求解0-1背包问题的动态规划算法,并通过手动设置、生成随机数获得实验数据。记录随着输入规模增加算法的执行时间,分析并以图形方式展现增长率;测试、验证、对比算法的时间复杂度。
4. 实验步骤和要求
(1) 编程实现以上算法,并进行测试,保证程序正确无误。其中,分别在程序开始和结束处设置记录系统当前时间的变量、用于计算程序执行的时间(以毫秒(ms)作为程序执行时间的计数单位)。
(2) 测试C值不变的情形下随着n增加、程序执行时间增加的趋势。对于C=200、400、800、2000这四种情形,分别使用实验1中的随机数生成算法生成n个随机整数作为n个物品的重量,再生成n个随机整数作为n个物品的价值(n=10, 20, 40, 100, 200, 400, 800, 2000)。对于每个C值,记录随着n增加程序的执行时间,并使用MS Excel图表绘制工具生成各不同C值情形下程序执行时间的对比曲线图(4条折线)。
(3) 与理论上的时间复杂度结论进行对比分析,完成实验报告。
实验3.2 动态规划算法的适应性测试
1. 实验目的
对于同一问题,编程实现其分治算法和动态规划算法,通过对比分析,理解动态规划算法的适用情形。通过程序的执行时间测试结果,与理论结论进行对比、分析和验证。
2. 原理解析
分治算法与动态规划算法的对比:针对子问题是否重叠
虽然很多问题均可分解为子问题、动态规划和分治算法都是通过子问题的解决来获得原问题的解。然而,分治算法适用于子问题不重叠(即相互独立)的情形,对于子问题重叠的情形分治法具有较高的时间复杂度,动态规划是针对这类情形的有效算法。
测试算法
斐波纳契数列在现代物理、准晶体结构、化学等领域都有直接的应用。斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第三项开始,每一项都等于前两项之和,即:
直观地,斐波纳契数列可递归地得到,算法如下:
DAC_f(n)
if(n==1) or (n==2) then
return 1
else
return f(n-1)+f(n-2)
end if
通过理论分析已经得出结论:以上递归算法随着n增大有指数计算时间。对于n的多项式个数的子问题,显然指数计算时间是不现实的。基于动态规划算法可高效地求解Fibonacci数问题,算法如下:
DP_f(n)
Initialize f[1..n]
for i=1 to n do
if(i==1) or (i==2) then
f[i]=1
els
原创力文档


文档评论(0)