这学期学运筹学,用matlab写了一个动态规划投资问题,不过因为matlab用起来实在太难受了,所以偷懒把步长设为固定,省略了一些代码。
不过这个是为了化简解题,所以代码不是最优代码,有很多冗余计算
使用说明
输入表需要预处理,先保证第一列为零,然后删去
第一行的数值应该为[1 2 3 4...]*n
预处理示例:
function [result, celue] = touzi(data, mmax, n)
% author: hunsh
% time: 05/16/2020
% data 输入的表
% mmax, n 为递归使用的参数,用户使用不需要输入该参数
% result是最优值,celue是最优解,中间会输出动态规划表,答题照抄就行了
if nargin == 1 % 用户调用
disp([data(1,:)])
for i=2:size(data,1)
tm=zeros(i,size(data,2));
for j=1:size(data,2)
[r,c]=touzi(data, j, i);
tm(1,j)=r;
tm(2:length(c)+1,j)=c.';
end
disp("f"+(i-1))
disp(tm(1,:))
disp(tm(2:i,:))
end
[result, celue] = touzi(data, size(data,2),size(data,1));
return
end
% disp([mmax n])
if n==1
result=0;
celue=[];
return
end
if mmax==0
result=0;
celue=zeros(1,n-1);
return
end
result=0;
celue=0;
for i=0:mmax % 总价
[r,c]=touzi(data, i, n-1);
f=data(n,:);
if mmax-i==0
if r>result
result=r;
celue=[c 0];
end
else
if r+f(mmax-i)>result
result=r+f(mmax-i);
celue=[c mmax-i];
end
end
end
运行示例
本文由 hunsh 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 17, 2020 at 09:44 pm