1、贪婪算法练习练习题 1:考虑 1、8、9、11 这四种面值的硬币,要找出币值 24 的零钱,怎么找能使硬币数最少? 利用 matlab 编程求解。解:设 为二进制变量,如果硬币 j 被选中,则, =1,否则 =0,xj xjj则找硬币问题的数学模型如下:min ;njj1;mnjjxv1用贪婪算法求解,其 MATLAB 程序如下:function n,x=payback(v,y,m)m,n=size(y);for i=1:nfor j=1:n练习题 2:利用 matlab 编程 FFD 算法完成下题:设有 6 种物品,它们的体积分别为:60、45、35、20、20 和 20 单位体积,箱子的容
2、积为100 个单位体积。function nbox,p=sjy(n,v,limitv)m,n=size(v);w=limitv*ones(m,n);p=zeros(n);nbox=0;for i=1:nfor j=1:iif v(i)cl break%待放入包的物品重量大于包的重量,跳出循环else x(i)=1;%x(i)为 1 时,物品 i 在包中cl=cl-w(i);p=p+1;%p 记录放入背包物品的个数endendfunction knapsack(n,limitw,w,v)totalc=0;totalw=0;m,n=size(w); %m 是 w 的行数 n 是 w 的列数x=ze
3、ros(m,n);t=w;%记录原数组 k=c;y=x;p,c,w=goodsinknapsack(n,limitw,v,w,x);%排序及计算装箱物品数for j=1:p%装包的 p 件物品for i=1:n%原 n 件物品if (w(j)=t(i)endendendyfor i=1:ntotalc=totalc+k(i)*y(i);%背包的总价值if y(i)=1totalw=totalw+t(i);%背包所装载总体积endendtotalwtotalcv=220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115
4、,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1;w=80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,50,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1;limitw=1000;n=50;knapsack(n,limitw,w,v);运行结果为:y =Columns 1 through 16 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1Columns 17 through 32 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0Columns 33 through 48 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0Columns 49 through 50 0 0totalw =996totalc =3095结果分析:由运行结果可知,被选中的物品编号为向量 y 中的 1,其所选物品总价值为 3095,总体积为 996;贪婪算法并不一定能得到最优解,但可以得到一个较好的解。