我们还是从例子中进行理解,以背包问题为例:
“超市大赢家”提供了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。
当然贪婪算法重在他的思想“贪”,又可以称之为“懒”,也可以用在其他规划问题上,比如说最短路问题,因为懒,所以我每一步只选择当前最短的方案,直到终点...