EDA365电子论坛网
标题:
《算法导论(第三版)》第十五章,动态规划
[打印本页]
作者:
Zedd
时间:
2020-3-9 17:40
标题:
《算法导论(第三版)》第十五章,动态规划
《算法导论(第三版)》第十五章,动态规划
& Q! @) F* y2 H; P
由于我学习《算法导论(第三版)》这本书,更多的是应用于解制造业的工程问题,不是用于IT行业,所以针对数据结构这一块儿,不作为我的重点部分,我只做基本了解,不做深入学习,所以选择性跳过,若今后有遇到相关工程问题,再补该方面知识。
/ a7 g4 [; E' G$ j6 J1 h5 T
# C4 V& Y; Y" c, E
针对本书关于钢条切割方面的讨论,涉及起始取地址从0开始,由于MATLAB本身语法限制,在相同思想下,将代码进行了适当修改。
" Q( a' C" U) l+ u
" j4 Q) l2 R2 }# p0 f7 {$ G
朴素递归算法解钢铁切割问题:
% h- `% ~7 S; P: n& [
clear;clc
p=[1 5 8 9 10 17 17 20 24 30];
CUT_ROD(p,4)%朴素递归算法 自顶向下
[r s]=EXTENDED_BOTTOM_UP_CUT_ROD(p,10)%动态规划算法 自底向上
' }& a4 x5 r& k8 k
% m$ A0 u+ ]. e( C6 @4 J6 q
- R( Y' ~; D. S, k8 o
, B& u; \! }, T G" i: y6 i3 I$ X
朴素递归算法:
- o% ~. {; p4 s# K. a
function [q] = CUT_ROD(p,n)
%自顶向下递归实现钢铁切割问题 《算法导论》第十五章 动态规划
%算法思想:将钢铁分为左右两段,左段不切,为收益最大值,右段一直切,直到切完。
if n==0%右段已切完
q=0;
return;
end
q=-inf;%收益从负开始
for i=1:n
q=max([q,p(i)+CUT_ROD(p,n-i)]);%寻求是否切的最大收益
end
end
' d/ d0 |& T( v( n8 W1 R; u3 B7 w
# n4 t. X2 J$ E. V1 X/ t; {
3 D1 |& Q o# @4 X
& @; U- A$ n/ `; i2 b- i! h
动态规划算法:
4 q: q2 v# y. E' Q) p
function [r,s] = EXTENDED_BOTTOM_UP_CUT_ROD(p,n)
%动态规划:自底向上
r=p;%初始化不切割为最大收益
s=1:n;%初始化不切割为最大收益的切割方式
for j=2:n
for i=1:j-1%去掉i==j的情况,不需要跟本身作比较
if r(j)<p(i)+r(j-i)
r(j)=p(i)+r(j-i);
s(j)=i;
end
end
end
end
( r- D; N. `4 O& y
/ J& S0 I. d: k& a$ Z" D
6 H" Q- L. n8 q
' X1 a: v2 s4 z; I9 U
在解决取地址从0开始的问题时,突然想到,假设将初始切割方案直接默认为为不切割方案,将比书中的效果更佳。
' J [; e0 l7 R6 X2 ]$ J
作者:
wu68aq
时间:
2020-3-9 18:52
研究研究。
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2