python算法----动态规划(以背包问题为案例)

今天我们来学习一下动态规划,以为这个概念比较抽象,所以我们将结合具体的案例进行讲解,废话不多说,我们开始吧!

动态规划的概念:

多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,称这种解决多阶段决策最优化问题的方法为动态规划方法

背包问题的案例讲解:

python算法----动态规划(以背包问题为案例)_第1张图片
背包问题:你是一个小偷,你有一个可以装下4磅物品的袋子,现在有音响,笔记本电脑和吉他可以偷,怎样偷才可以偷最大价值的物品?

第一种方法:尝试各种商品的组合,找出价值最高的组合
1.吉他 1500 2.音响 3000 3.笔记本电脑 2000 4.吉他+笔记本电脑 3500
最后找到价值最大的组合是笔记本电脑+吉他,这样虽然可行,但是速度太慢了,运行时间为O(2的n次方)

第二种方法:动态规划
动态规划的工作原理就是先解决子问题,然后再逐步解决大问题每个动态规划都先从一个网格开始,以下是这个问题的网格,网格的各行为商品,各列为不同容量(1~4磅)的背包,每个列都需要,我们会在其中计算背包的价值
在这里插入图片描述
在每个单元格中,我们都得选择偷不偷该行的物品,每个单元格都要让背包中的商品的价值最大,填充每个单元格,直到填满就会找到最终的答案
吉他行:
在这里插入图片描述
音响行:
在这里插入图片描述
笔记本电脑行:
在这里插入图片描述
我们可以看到在笔记本电脑行原先的3的那列中2000的价值将1500的价值覆盖了,4列中3500的价值将3000的价值覆盖了,因此4磅的袋子可以偷走的最大价值为3500

在这里可能就会有长得比较帅的看官会问:我们求得是4磅的袋子为什么还要计算1,2,3磅袋子呢?
这就牵扯到了动态规划的原理:动态规划从小问题着手,逐步解决大问题

在这里我们再来想一想:如果还有一个1磅重价值2000的iphone可以偷呢?
python算法----动态规划(以背包问题为案例)_第2张图片
其实说白了同样是1磅重,求最大的价值,在1磅重的情况下我们当然会选择更值钱的iphon而不回去选择吉他,也就是在需要选择1磅重的物品时,将吉他替换成了更有价值的iphone
但是,我们还要记住:动态规划功能强大,它能够解决子问题并使用这些答案来解决大问题,但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用

动态规划应注意:

1.动态规划可帮助你在给定约束条件下找到最优解
2.在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决
3.每种动态规划解决方案都涉及网格
4.单元格中的值通常就是你要优化的值
5.每个单元格都是一个子问题,因此你应考虑如何将问题分成子问题,这有助于你找出网 格的坐标轴

你可能感兴趣的:(笔记,动态规划)