Python算法分析与设计实验:动态规划算法

Python算法分析与设计实验:动态规划算法

一、实验目的
1、理解动态规划求解优化问题的典型步骤,以及动态规划算法求解计算问题的时间复杂度分析
2、熟练掌握利用动态规划算法求解一维、二维等典型优化问题,如斐波那锲数、拾捡硬币、连续子序列的最大值、矩阵的括号、0-1背包问题等。
3、对于简单问题能画出其动态规划表,并能从中得到问题的解。

二、实验工具
Win10操作系统、python3.7编译环境、IDLE编译器

三、实验内容
某种材料以长度计价,其价格表为:
长度:1 2 3 4 5 6 7 8 9 10
价格:15 8 9 10 17 17 20 24 30
现有一段长度为n的该种材料,试给出最佳切割分段方案,使其价值最大,用Python编程实现该算法。

四、实验调试过程
动态规划与分治法比较类似,都是通过求解子问题的解,最终来求出原问题的解。分治法只要是将原问题分解成为若干个独立的子问题,通过子问题来求解原问题的解。而动态规划恰恰相反,动态规划是用来求解子问题重叠的情况,即不同的子问题之间具有相同的公共子问题,在这种情况下分治法会花费大量的时间来计算已经计算过的那部分重叠子问题,效率大大降低,而动态规划权衡时间和空间的因素,将已经计算过的子问题存入一张表内,下次遇到相同的子问题时,直接查表就可以得到结果,大大加快了速度。
动态规划通常用来求解最优化问题,一般来说一个问题的最优解有多个,动态规划可以求解出其中的一个最优解,而不是最优解。
通过下面的四个步骤来设计一个动态规划问题:
1.刻画一个最优解的结构特征。
2.递归的定义最优解的值
3.计算最优解时,一般采用自下而上的方法来求解
4.利用计算出的信息构造出一个最优解
首先可以将材料分割为 i 和 n-i 两段,求这两段的最优收益 Ri 和 R(n-i) (每种方案的最优收益为两段的最优收益之和)。由于无法确定哪种方案(i 取何值时)会获得最优收益,我们必须考虑所有的i,选取其中收益最大者。若直接出售钢条会获得最大收益,可以选择不做任何切割。最优切割收益公式:Rn = max(pn,R1+Rn-1,R2+Rn-2,…,Rn-1+R1)。当完成首次切割后,我们可以将两段材料( i 和 n-i)看成两个独立的材料切割问题实例,通过组合两个相关子问题的最优解,构成原问题的最优解。
一种相似但更为简单的递归求解方法:将长度为 n 的材料分解为左边开始一段,以及剩余部分继续分解的结果。简化后的公式:Rn = max{1≤i≤n, (pi+Rn-i)}。

五、实验结果分析

实验结果表明:当材料长度为8时,最大盈利为22。

六、实验源码

def BottomUpCutRod(p, n):
    r = [0]*(n+1)
    for i in range(1, n+1):
        if n == 0:
            return 0
        q =0
        for j in range(1, i+1):
            q = max(q, p[j]+r[i-j])
            r[i] = q
    return r[n], r


p=[0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30]
print(BottomUpCutRod(p, 8))
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值