MATLAB - 递归动态规划

时间:2015-05-19 11:58:08

标签: matlab recursion

我在MATLAB上的背包算法似乎有问题。我有几个要添加到存储的文件,它们有一定的值。我希望在一定的容量限制下最大化总价值。 值为10,40,30,50。 尺寸为6,4,5,3。 容量是10。

当我运行代码时,我获得了最佳总值,但我无法指定哪些文件已添加到存储中。有没有办法做到这一点?我尝试将文件编号添加到数组中,但它不起作用。每次运行该函数时都会清空该数组。 我的代码如下:

function maxim=addfiles(v,w,cap,n)
maxim=0;
stored=[];
if (cap==0)||(n==0)
    return 
else
   if w(n)>cap
       maxim=addfiles(v,w,cap,n-1);
   else 
       if addfiles(v,w,cap,n-1)<v(n)+addfiles(v,w,cap-w(n),n-1)
       maxim=v(n)+addfiles(v,w,cap-w(n),n-1);
       stored(n)=n;
       else maxim=addfiles(v,w,cap,n-1);
       end
   end
end

我想从算法中得到的回报是: 最佳值:90 添加的文件:2,4

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我重写了你的代码,所以它将返回最大值选择;不确定它是否比你习惯的更多MATLABish,但它做同样的事情,并且更好地评论:-D

%// Knapsack problem
%// v   = values (non-negative, vector)
%// w   = weights (positive, vector)
%// cap = available capacity (non-negative, scalar)
%// n   = the remaining number of objects (non-negative, scalar)
%//
%// maxim  = max accumulated value (non-negative, scalar)
%// stored = index of stored objects (integer, vector)

function [maxim, stored] = addfiles(v,w,cap,n)

        %// End of recursion
        if (cap==0)||(n==0)
                maxim  = 0;
                stored = [];
                return;
        end;

        %// Above capacity
        if w(n) > cap
                [maxim, stored] = addfiles(v,w,cap,n-1);
                return;
        end;

        %// Alternatives 1/2
        [maxim1, stored1] = addfiles(v,w,cap,n-1);
        [maxim2, stored2] = addfiles(v,w,cap-w(n),n-1);

        if maxim1 < v(n) + maxim2
                %// Adding is good
                maxim  = v(n) + maxim2;
                stored = [stored2, n];
       else
                %// Adding is bad
                maxim  = maxim1;
                stored = stored1;
       end;
end

保存在addfiles.m,然后拨打:

[maxim,stored] = addfiles([10, 40, 30, 50], [6, 4, 5, 3], 10, 4)