贪婪算法————背包问题

来源:互联网 发布:山东烟台正浩网络 编辑:程序博客网 时间:2024/06/03 22:18
      贪婪算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
      我们还是从例子中进行理解,以背包问题为例:

      “超市大赢家”提供了50种商品作为奖品供中奖顾客选择,车的容量为1000dm3 , 奖品占用的空间为vi dm3 ,价值为wi 元。

      对于此类问题,我们通常不考虑空间形状,即只要体积够就能放下。我们先建立0-1优化模型:

      我们的目标就是拿取物品的价值最高,约束是拿出的商品体积总和不超过车容量


       那么贪婪算法是怎么解决这个问题的呢?
方案一 最懒的拿法1,从最贵的拿起,直到放不下为止,最后发现可以取17种商品,总占用空间952,总价值2708。
方案二 最懒的拿法2,从最大的拿起,直到放不下为止,最后发现可以取15种商品,总占用空间970,总价值2318。
方案三 每个商品的价值:体积=性价比,从性价比最高的拿起,直到放不下为止,最后发现可以取26种商品,总占用空间996,总价值3095.

clc;clear;close all;limit = 1000;%容量v = [1,32,35,10,30,38,25,85,10,25,...     70,80,20,60,20,2,50,22,72,32,...      30,50,45,30,60,66,50,70,50,15,...     22,30,10,55,40,30,50,65,40,48,...     82,10,20,25,4,55,28,25,4,32]';%商品体积w = [1,118,98,20,105,100,95,198,15,50,...     192,220,65,110,56,3,162,82,180,96,...     73,120,75,88,72,165,155,180,70,30,...     115,77,10,130,100,60,80,66,125,122,...     208,58,69,63,5,160,90,158,8,101]';%商品价值 n = 1 : length(w); %% 方案一 x = [v,w,n']; x = sortrows(x,-2);%按价值从大到小排序 count = 1; while count <= length(w) && sum(x(1:count,1)) <= 1000      count = count + 1; end choice = sort(x(1:count -1,3));%选择最终取哪几个商品 vc = sum(x(1:count-1,1));%计算总体积 wc = sum(x(1:count-1,2));%计算总价值disp('方案一');disp(['最终选取商品:',num2str(choice')]);disp(['占用总体积:',num2str(vc)]);disp(['总价值为:',num2str(wc)]);disp('*************************************************************************')%% 方案二 x = [v,w,n']; x = sortrows(x,-1);%按体积从大到小排 count = 1; while count <= length(w) && sum(x(1:count,1)) <= 1000      count = count + 1; end choice = sort(x(1:count -1,3));%选择最终取哪几个商品 vc = sum(x(1:count-1,1));%计算总体积 wc = sum(x(1:count-1,2));%计算总价值disp('方案二');disp(['最终选取商品:',num2str(choice')]);disp(['占用总体积:',num2str(vc)]);disp(['总价值为:',num2str(wc)]);disp('*************************************************************************') %% 方案三 w2 = w./v;%计算性价比 x = [v,w2,w,n']; x = sortrows(x,-2);%按性价比从大到小来排 count = 1; while count <= length(w) && sum(x(1:count,1)) <= 1000      count = count + 1; end choice = sort(x(1:count -1,3));%选择最终取哪几个商品 vc = sum(x(1:count-1,1));%计算总体积 wc = sum(x(1:count-1,3));%计算总价值disp('方案三');disp(['最终选取商品:',num2str(choice')]);disp(['占用总体积:',num2str(vc)]);disp(['总价值为:',num2str(wc)]);

      贪婪算法完全依赖于你的贪婪策略,所以我们上面的三种贪婪策略所获得的结果都不同,我们从策略本身是看不出结果好坏的。我只提出了几个比较常见的贪心策略,大家也可想想看其他的策略,此题的最大价值为3103。

      当然贪婪算法重在他的思想“贪”,又可以称之为“懒”,也可以用在其他规划问题上,比如说最短路问题,因为懒,所以我每一步只选择当前最短的方案,直到终点...