贪婪算法————背包问题
来源:互联网 发布:山东烟台正浩网络 编辑:程序博客网 时间: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。
当然贪婪算法重在他的思想“贪”,又可以称之为“懒”,也可以用在其他规划问题上,比如说最短路问题,因为懒,所以我每一步只选择当前最短的方案,直到终点...
阅读全文
0 0
- 贪婪算法————背包问题
- 贪婪方法——贪婪方法和动态规划的比较:背包问题
- 算法——贪婪算法
- 贪婪算法--背包问题详解
- 贪婪算法解决背包问题
- 贪婪算法解决背包问题
- 常用算法——贪婪
- 贪婪算法——1 Prim算法
- 贪婪算法——2 Kruscal算法
- 贪婪算法——3 Dijkstra算法
- 贪婪算法——霍夫曼编码
- 背包问题(贪婪法)
- 算法——背包问题 01背包+完全背包+多重背包
- 算法总结1——贪婪算法,动态规划
- 算法导论(八)——动态规划&贪婪算法
- 算法复习——背包DP问题
- 贪心算法——背包问题
- 经典算法之—背包问题
- 63 linux内核的SPI设备驱动模型及应用程序调用SPI控制器的方法
- HashMap和Hashtable的区别
- Intellij IDEA svn的使用
- gitlab创建SSH Key 过程
- iOS,论代码的整洁性,可读性,可修改性。
- 贪婪算法————背包问题
- 对于数据库更新的清理
- java IO操作方法
- JDK安装与环境变量配置(Windows Or Linux)
- Tomcat 6 JNDI数据源详解
- spring项目中监控方法执行时间
- SEAndroid实现机理
- Android 下拉刷新上拉加载PullToRefresh
- 2017ctf writeup