连续背包问题贪婪算法最优解的实现
李少芳
%福建省莆田市莆田学院机电系,福建
福州$&!!##’
【摘要】贪婪法是用于设计数值最优化问题的算法之一,它能应用于求解不同领域的多种问题,如应用于集装箱问题的背包贪婪算法。贪婪法不追求最优解,不要回溯,只希望得到较为满意的解,使用贪婪法不能保证一定得到最优解。本文通过对连续背包问题不同贪婪准则的讨论,给出了一个贪婪算法最优解实现的(程序。
【关键字】背包问题贪婪算法最优解算法实现引言! 、
目前,常用的算法设计技术有分治法、回溯法、贪婪法、动态规划算法、分支限界法等。其中分治法、回溯法主要用于设计非数值问题的算法,而贪婪法、动态规划算法、分支限界法则主要用于设计数值最优化问题的算法。贪婪法是一种求最优解问题的最直接的设计技术,它不是对所有问题都能得到整体最优解,但对许多问题可能产生整体最优解。本文先通过两个实例对背包问题不同贪婪准则进行分析讨论,然后给出了一个获得最优解的贪婪算法的证明思路,并用(程序实现该算法。背包问题" 、
假定有) 个物品和一个背包,每件物品*的重量为/*,价值
(为0*,而背包的载荷能力为1。若将物体*的一部分2*! &*&)3
则有价值0*$2*。对于可行的背包装载,背#&2*&! ’装入背包中,
包中物品的总重量不能超过背包的容量,最佳装载是指所装入) ) 的物品价值最高,即在约束条件为%/*2*’1下使目标%0*2*取*+! *+! 得最大值,此处! &*&)3#&2*&! ,这个问题称为背包问0*4#,
5" 6
题。2*+! 表示物品*装入背包中,2*+#表示物品*不装入背包,称#72*7! 表示物品*的一部分装入背包。当#&2*&! 时,为连续背包问题;当2*只能取#或! ,即一种物品要么全部装进背包,要么不装时,称为#8! 背包问题。贪婪策略实例分析$、
贪婪法是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的。背包问题有好几种贪婪策略,每个贪婪策略都采用多步过程来完成背包的装入,在每一步过程中利用贪婪准则选择一个物品装入背包,选择能产生问题最优解的最优贪婪准则是使用贪婪法的核心问题。下面介绍常用的三种贪婪准则:
从剩余的物品中,选出可以装入背包的价! 价值贪婪准则:
(假值最大的物品,利用这种规则,价值最大的物品首先被装入
设有足够容量),然后是下一个价值最大的物品,如此继续下去,这种策略不能保证得到最优解。
" 质量贪婪准则:从剩下的物品中选择可装入背包的重量最小的物品,在一般情况下也不一定能得到最优解。
#价值密度0*8/*贪婪算法,这种选择准则为:从剩余物品中选择可装入包的0*8/*值最大的物品,即按0*8/*非递增的次序装入物品,这种策略对于连续背包问题可保证得到最优解;而对于#8! 背包问题按0*8/*非递增的次序装入物品,只要正被考虑的物品装得进就装入背包,不一定能得到最优解。
例如,考虑) +.31+!&,0+5!#,&,!&,. ,9,!:,$6,/+5" ,$,&,. ,! ,-,! 6。
对于#8! 背包,当利用价值贪婪准则时,获得的解为2+5!3! ,此时背包载重1+!&,总价值0+&-,虽然利! ,#,! ,! ,#6,
用这个策略在本例正好装满背包且获得了最优解,但在一般情况下并不能保证得到最优解(因为利用贪婪准则#8! 背包不一1+,/5,,!#05"#,6利用价值贪婪准则时,获得的解为2+5!3#,此时背包载重#6,
(剩余的背包容量&浪费掉),总价值0+"#;而最优解1+!##
此时背包载重1+"#,总价值0+$#)。当利用质量2+5#,! ,! 6,
贪婪策略时,获得的解为2+5!3! ,#,#,! ,! ,! 63此时背包载重总价值0+-" ,比最优解0+&-要差。当利用价值密度贪1+!! ,
&,
婪策略时,先计算0*8/*+5&,获得的解为2+$,! ,9,$6,$" 5!3#,总价值0+&",也比最! ,#,! ,! ,! 63此时背包载重1+!$,优解0+&-要差。
对于连续背包,当利用价值贪婪准则时,获得的解为2+5!3-此时背包载重1+!&,总价值0+-. ,比最优解#,! #,! ,#6,. ,
"
获得的解为2+5!3" ,总价! ,#,! ,! ,! 63此时背包载重1+!&,
$
即获得了最优解,并且这个策略已被证明就是连续值0+&&;$,
背包获得最优解的策略。
再如,考虑) +$31+"#,0+5"&,"-,!&6,/+5!:,!&,!#6。对于连续背包列举以下四个可行解:
!
!
!
当利用质量贪婪策略时,获2+5! ,#,! ,! ,! 6,0+&&;$要差;
$
-总价值得的解为2+5!3! ,#,! ,! ,! 63此时背包载重1+!&,
&
也比最优解0+&&;$要差。当利用价值密度贪婪策略时,0+&-,
此时背包载重1+"#,总价值0+$#;! 2+5" $!#6,
"
此时背包载重1+"#,总价值0+":;" ;" 2+5!3!&,#6,
———价值贪婪准则
"
此时背包载重1+"#,总价值0+$!;#2+5#3$3! 6,
———质量贪婪准则!
此时背包载重1+"#,总价值0+$!;&。$2+5#3!36,"
———价值密度贪婪准则
其中可行解$是利用价值密度贪婪准则获得的,也是本背包的最优解。
连续背包最优贪婪算法证明-、
贪婪法不追求最优解,不要回溯,只希望得到较为满意的解。虽然贪婪法不是对所有问题都能得到整体最优解,但对范围相当广泛的求最优解问题来说,它是一种最直接的算法设计技术,通过一系列局部最优的选择,即贪婪选择可以产生整体最优解。具体地说,通常所求问题的一个整体最优解,是从贪婪选择开始的,而且每作一步贪婪选择后,原问题可简化为一个规模更小的类似子问题,然后通过多步贪婪选择,最终可得到问题的一个整体最优解。连续背包问题的最优贪婪算法是先求出每一件物品的价值密度0*8/*,然后从价值密度最大的物品*开始,若其质量超过背包的剩余载重量,则取物品*的一部分装入,若其质量不大于背包的剩余载重量,则全部装入,继续往下比较,依次考虑价值密度最大的物品,直到背包装满。这种按物品的价值密度0*8/*非递增的次序装入物品的贪婪准则称为价值密度贪婪准则。
显然,连续背包问题利用价值密度贪婪准则可保证得到最优解(但要注意,#8! 背包利用任一贪婪准则都不一定装得满,其最优解是一个
选取价值密度(&*) &最大的物品&,最终必导致背包的总价值最大,即获得最优解。其证明的基本思路是:把通过价值密度贪婪准则获得的贪婪解与任一可行解比较,若这两个解不同,就开始寻找第一个不同的+&,然后设法用贪婪解的+&去替换可行解的对应分量, &,并证明可行解在分量替换后的总价值总是大于等于未替换前的值。反复进行这种替换,直到新产生的可行解等于贪婪解,即最优解-! . 。若令+’-+$/000/+%. 为用价值密度贪婪准则
%%
. -获得的解,只需证明%+&(&(%, ’, $/000/, %为任意一个可行解,不失一般性,可以假设物品都按价值密度1&’非递增排好, &(&。&),然后分几步用贪婪解的了序,即1&(1&2(+&去替换可$$’&’%行解的对应分量, &,将, 转化为+,转换过程中每一步都产生一%
个可行的新, ,且%, &(&大于等于未转化前的值,最后便可证明+&(&(%, &(&。%&’$&’$
连续背包贪婪算法最优解实现3、
下面以%’#/4’!" ,(’-!3,!5,$3. ,) ’-$6,$3,$". 为例,给出用7语言按(&*) &非递增的次序装入物品的连续背包贪婪算法实现程序:
*$背包问题的贪婪算法$*
*$+-&. ’$当且仅当物品&被装入," 8+-&. 8$表示物品装入一部分$*9&%:;84?@A0AB
C;D?@4?+E C;D?@11-#. /&%@%F G *$4?+函数原型$*4?&%E F
H &%@%’#/&/I
C;D?@4’!"/(I
-. H K -. H K ) 物品的质C;D?@(#’!3/!5/$3/) #’$6/$3/$"G *$(物品的价值,
量$*
+-&. ’" 表示物品&未被装入C;D?@+-#. ’H " K /1-#. /LG *$初始化+-&. ,
$*
:;MI:ME F G
CDM E &’"G &8%G&22F *$按价值密度次序选择物品$*1-&. ’(-&. *) -&. G *$价值密度数组1-&. $*=D
L ’4?+E 1/%F G *$L 存放剩余物品的最大价值密度$*
%
%
&’$
(&
&’$&’$
CDM E &’"G &8%G&22F
&CE C?JI E 1-&. N L F 8$>N O F H I?PGK 1-I
&CE ) -I;I>H +-I
)A&;>E C?JI E 4F B ’$>N O F G CDM E &’"G &8%G&22F
H (I
(M&%@CE Q +-R =. ’R 0$CQ /&/+-&. F G K
(M&%@CE Q S %(I
C;D?@4?+E C;D?@11-#. /&%@%F H C;D?@4?+G&%@&G
4?+’11-" . G
CDM E &’"G &8%G&22F
&CE 4?+811-&. F 4?+’11-&. G M>@
+-$. ’$0" +-#. ’"03
即按价值密度贪婪准则输出本背包最优解+’) ,$/*,此时总价值(I
本文暂不深入讨论。X E %;D Y%F ,
参考文献
-$.
-! . -#. -5.
苏德富、钟诚0计算机算法设计与分析0北京:电子工业出版社,!""$0宋文,吴晟,杜亚军0算法设计与分析0重庆:重庆大学出版社,!""$0
(第二版)谭浩强07程序设计清华大学出版社,0北京:$ZZZ0$!
-美. [?M1>,\0]>&@>;、清华大学出版社,^?&@>;07[D)@D^MDYM?40北京:!""!/Z0
+++++++++++++++++++++++++++++++++++++++++++++++++
E 上接第6页F
系统开发平台为c&%=D)I!"""b>M1>M,采用Waf 公司的
该应用服务c>J;DY&:b>M1>Mg0$作为应用服务器实现商务逻辑,
器同时提供c>J服务器功能,后台数据存储采用XM?:;>6&。开发工具选用]M>?4c>?1>ME 用于网页的开发F 和WDM;?%=公司的
(用于)>J组件和a_W组件的开发)。_JM6结论O 、
本文通过对新型的W!W 电子商务应用———a\^的研究,以及对_!aa技术运用于电子商务系统开发的特点及其商业优势的分析,并在此基础上构建了基于_!aa的电子交易市场。_!aa
平台规范作为一种脱颖而出的技术,其操作系统平台的独立性
和独立于应用服务器厂商的特性,使得基于_!aa应用程序具有天然的开放性、可伸缩性及扩展性,特别适合电子商务应用系统的要求。因此基于_!aa的电子商务解决方案受到众多商家的青
可睐。采用_!aa基于组件的多层分布式体系结构的实现方案,
以使开发出来的W!W 电子商务系统具有高可靠性、高可扩展性、高度透明的分布性、高异构性和可重用性。从而能够更好的适应企业间纷繁复杂、不断变化的商业逻辑和业务流程。相信_!aa技术作为大型W!W 市场和海量交易处理的安全的端到端平台必将成为未来电子商务平台的应用趋势。
参考文献
-$. (美)瞿裕忠等译,机械工业出版社,‘;?=?\?@>%?,_!aa平台上的a_W组件开发,!""$-! . 杨千里,王育民,电子商务技术与应用,电子工业出版社,$ZZZ-#. 吴晨请,荣震华,用_I(*b>M1;>@技术构建c>J应用,计算机工程,!""$-5. 刘勇,_JMO 实例入门,中国青年出版社,!""! -3. E 美F 7?, b0[DMI@4?%%,京京工作室译,机械工业出版社,!""" -O . A@@(d**e?1?0I>*@
连续背包问题贪婪算法最优解的实现
李少芳
%福建省莆田市莆田学院机电系,福建
福州$&!!##’
【摘要】贪婪法是用于设计数值最优化问题的算法之一,它能应用于求解不同领域的多种问题,如应用于集装箱问题的背包贪婪算法。贪婪法不追求最优解,不要回溯,只希望得到较为满意的解,使用贪婪法不能保证一定得到最优解。本文通过对连续背包问题不同贪婪准则的讨论,给出了一个贪婪算法最优解实现的(程序。
【关键字】背包问题贪婪算法最优解算法实现引言! 、
目前,常用的算法设计技术有分治法、回溯法、贪婪法、动态规划算法、分支限界法等。其中分治法、回溯法主要用于设计非数值问题的算法,而贪婪法、动态规划算法、分支限界法则主要用于设计数值最优化问题的算法。贪婪法是一种求最优解问题的最直接的设计技术,它不是对所有问题都能得到整体最优解,但对许多问题可能产生整体最优解。本文先通过两个实例对背包问题不同贪婪准则进行分析讨论,然后给出了一个获得最优解的贪婪算法的证明思路,并用(程序实现该算法。背包问题" 、
假定有) 个物品和一个背包,每件物品*的重量为/*,价值
(为0*,而背包的载荷能力为1。若将物体*的一部分2*! &*&)3
则有价值0*$2*。对于可行的背包装载,背#&2*&! ’装入背包中,
包中物品的总重量不能超过背包的容量,最佳装载是指所装入) ) 的物品价值最高,即在约束条件为%/*2*’1下使目标%0*2*取*+! *+! 得最大值,此处! &*&)3#&2*&! ,这个问题称为背包问0*4#,
5" 6
题。2*+! 表示物品*装入背包中,2*+#表示物品*不装入背包,称#72*7! 表示物品*的一部分装入背包。当#&2*&! 时,为连续背包问题;当2*只能取#或! ,即一种物品要么全部装进背包,要么不装时,称为#8! 背包问题。贪婪策略实例分析$、
贪婪法是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的。背包问题有好几种贪婪策略,每个贪婪策略都采用多步过程来完成背包的装入,在每一步过程中利用贪婪准则选择一个物品装入背包,选择能产生问题最优解的最优贪婪准则是使用贪婪法的核心问题。下面介绍常用的三种贪婪准则:
从剩余的物品中,选出可以装入背包的价! 价值贪婪准则:
(假值最大的物品,利用这种规则,价值最大的物品首先被装入
设有足够容量),然后是下一个价值最大的物品,如此继续下去,这种策略不能保证得到最优解。
" 质量贪婪准则:从剩下的物品中选择可装入背包的重量最小的物品,在一般情况下也不一定能得到最优解。
#价值密度0*8/*贪婪算法,这种选择准则为:从剩余物品中选择可装入包的0*8/*值最大的物品,即按0*8/*非递增的次序装入物品,这种策略对于连续背包问题可保证得到最优解;而对于#8! 背包问题按0*8/*非递增的次序装入物品,只要正被考虑的物品装得进就装入背包,不一定能得到最优解。
例如,考虑) +.31+!&,0+5!#,&,!&,. ,9,!:,$6,/+5" ,$,&,. ,! ,-,! 6。
对于#8! 背包,当利用价值贪婪准则时,获得的解为2+5!3! ,此时背包载重1+!&,总价值0+&-,虽然利! ,#,! ,! ,#6,
用这个策略在本例正好装满背包且获得了最优解,但在一般情况下并不能保证得到最优解(因为利用贪婪准则#8! 背包不一1+,/5,,!#05"#,6利用价值贪婪准则时,获得的解为2+5!3#,此时背包载重#6,
(剩余的背包容量&浪费掉),总价值0+"#;而最优解1+!##
此时背包载重1+"#,总价值0+$#)。当利用质量2+5#,! ,! 6,
贪婪策略时,获得的解为2+5!3! ,#,#,! ,! ,! 63此时背包载重总价值0+-" ,比最优解0+&-要差。当利用价值密度贪1+!! ,
&,
婪策略时,先计算0*8/*+5&,获得的解为2+$,! ,9,$6,$" 5!3#,总价值0+&",也比最! ,#,! ,! ,! 63此时背包载重1+!$,优解0+&-要差。
对于连续背包,当利用价值贪婪准则时,获得的解为2+5!3-此时背包载重1+!&,总价值0+-. ,比最优解#,! #,! ,#6,. ,
"
获得的解为2+5!3" ,总价! ,#,! ,! ,! 63此时背包载重1+!&,
$
即获得了最优解,并且这个策略已被证明就是连续值0+&&;$,
背包获得最优解的策略。
再如,考虑) +$31+"#,0+5"&,"-,!&6,/+5!:,!&,!#6。对于连续背包列举以下四个可行解:
!
!
!
当利用质量贪婪策略时,获2+5! ,#,! ,! ,! 6,0+&&;$要差;
$
-总价值得的解为2+5!3! ,#,! ,! ,! 63此时背包载重1+!&,
&
也比最优解0+&&;$要差。当利用价值密度贪婪策略时,0+&-,
此时背包载重1+"#,总价值0+$#;! 2+5" $!#6,
"
此时背包载重1+"#,总价值0+":;" ;" 2+5!3!&,#6,
———价值贪婪准则
"
此时背包载重1+"#,总价值0+$!;#2+5#3$3! 6,
———质量贪婪准则!
此时背包载重1+"#,总价值0+$!;&。$2+5#3!36,"
———价值密度贪婪准则
其中可行解$是利用价值密度贪婪准则获得的,也是本背包的最优解。
连续背包最优贪婪算法证明-、
贪婪法不追求最优解,不要回溯,只希望得到较为满意的解。虽然贪婪法不是对所有问题都能得到整体最优解,但对范围相当广泛的求最优解问题来说,它是一种最直接的算法设计技术,通过一系列局部最优的选择,即贪婪选择可以产生整体最优解。具体地说,通常所求问题的一个整体最优解,是从贪婪选择开始的,而且每作一步贪婪选择后,原问题可简化为一个规模更小的类似子问题,然后通过多步贪婪选择,最终可得到问题的一个整体最优解。连续背包问题的最优贪婪算法是先求出每一件物品的价值密度0*8/*,然后从价值密度最大的物品*开始,若其质量超过背包的剩余载重量,则取物品*的一部分装入,若其质量不大于背包的剩余载重量,则全部装入,继续往下比较,依次考虑价值密度最大的物品,直到背包装满。这种按物品的价值密度0*8/*非递增的次序装入物品的贪婪准则称为价值密度贪婪准则。
显然,连续背包问题利用价值密度贪婪准则可保证得到最优解(但要注意,#8! 背包利用任一贪婪准则都不一定装得满,其最优解是一个
选取价值密度(&*) &最大的物品&,最终必导致背包的总价值最大,即获得最优解。其证明的基本思路是:把通过价值密度贪婪准则获得的贪婪解与任一可行解比较,若这两个解不同,就开始寻找第一个不同的+&,然后设法用贪婪解的+&去替换可行解的对应分量, &,并证明可行解在分量替换后的总价值总是大于等于未替换前的值。反复进行这种替换,直到新产生的可行解等于贪婪解,即最优解-! . 。若令+’-+$/000/+%. 为用价值密度贪婪准则
%%
. -获得的解,只需证明%+&(&(%, ’, $/000/, %为任意一个可行解,不失一般性,可以假设物品都按价值密度1&’非递增排好, &(&。&),然后分几步用贪婪解的了序,即1&(1&2(+&去替换可$$’&’%行解的对应分量, &,将, 转化为+,转换过程中每一步都产生一%
个可行的新, ,且%, &(&大于等于未转化前的值,最后便可证明+&(&(%, &(&。%&’$&’$
连续背包贪婪算法最优解实现3、
下面以%’#/4’!" ,(’-!3,!5,$3. ,) ’-$6,$3,$". 为例,给出用7语言按(&*) &非递增的次序装入物品的连续背包贪婪算法实现程序:
*$背包问题的贪婪算法$*
*$+-&. ’$当且仅当物品&被装入," 8+-&. 8$表示物品装入一部分$*9&%:;84?@A0AB
C;D?@4?+E C;D?@11-#. /&%@%F G *$4?+函数原型$*4?&%E F
H &%@%’#/&/I
C;D?@4’!"/(I
-. H K -. H K ) 物品的质C;D?@(#’!3/!5/$3/) #’$6/$3/$"G *$(物品的价值,
量$*
+-&. ’" 表示物品&未被装入C;D?@+-#. ’H " K /1-#. /LG *$初始化+-&. ,
$*
:;MI:ME F G
CDM E &’"G &8%G&22F *$按价值密度次序选择物品$*1-&. ’(-&. *) -&. G *$价值密度数组1-&. $*=D
L ’4?+E 1/%F G *$L 存放剩余物品的最大价值密度$*
%
%
&’$
(&
&’$&’$
CDM E &’"G &8%G&22F
&CE C?JI E 1-&. N L F 8$>N O F H I?PGK 1-I
&CE ) -I;I>H +-I
)A&;>E C?JI E 4F B ’$>N O F G CDM E &’"G &8%G&22F
H (I
(M&%@CE Q +-R =. ’R 0$CQ /&/+-&. F G K
(M&%@CE Q S %(I
C;D?@4?+E C;D?@11-#. /&%@%F H C;D?@4?+G&%@&G
4?+’11-" . G
CDM E &’"G &8%G&22F
&CE 4?+811-&. F 4?+’11-&. G M>@
+-$. ’$0" +-#. ’"03
即按价值密度贪婪准则输出本背包最优解+’) ,$/*,此时总价值(I
本文暂不深入讨论。X E %;D Y%F ,
参考文献
-$.
-! . -#. -5.
苏德富、钟诚0计算机算法设计与分析0北京:电子工业出版社,!""$0宋文,吴晟,杜亚军0算法设计与分析0重庆:重庆大学出版社,!""$0
(第二版)谭浩强07程序设计清华大学出版社,0北京:$ZZZ0$!
-美. [?M1>,\0]>&@>;、清华大学出版社,^?&@>;07[D)@D^MDYM?40北京:!""!/Z0
+++++++++++++++++++++++++++++++++++++++++++++++++
E 上接第6页F
系统开发平台为c&%=D)I!"""b>M1>M,采用Waf 公司的
该应用服务c>J;DY&:b>M1>Mg0$作为应用服务器实现商务逻辑,
器同时提供c>J服务器功能,后台数据存储采用XM?:;>6&。开发工具选用]M>?4c>?1>ME 用于网页的开发F 和WDM;?%=公司的
(用于)>J组件和a_W组件的开发)。_JM6结论O 、
本文通过对新型的W!W 电子商务应用———a\^的研究,以及对_!aa技术运用于电子商务系统开发的特点及其商业优势的分析,并在此基础上构建了基于_!aa的电子交易市场。_!aa
平台规范作为一种脱颖而出的技术,其操作系统平台的独立性
和独立于应用服务器厂商的特性,使得基于_!aa应用程序具有天然的开放性、可伸缩性及扩展性,特别适合电子商务应用系统的要求。因此基于_!aa的电子商务解决方案受到众多商家的青
可睐。采用_!aa基于组件的多层分布式体系结构的实现方案,
以使开发出来的W!W 电子商务系统具有高可靠性、高可扩展性、高度透明的分布性、高异构性和可重用性。从而能够更好的适应企业间纷繁复杂、不断变化的商业逻辑和业务流程。相信_!aa技术作为大型W!W 市场和海量交易处理的安全的端到端平台必将成为未来电子商务平台的应用趋势。
参考文献
-$. (美)瞿裕忠等译,机械工业出版社,‘;?=?\?@>%?,_!aa平台上的a_W组件开发,!""$-! . 杨千里,王育民,电子商务技术与应用,电子工业出版社,$ZZZ-#. 吴晨请,荣震华,用_I(*b>M1;>@技术构建c>J应用,计算机工程,!""$-5. 刘勇,_JMO 实例入门,中国青年出版社,!""! -3. E 美F 7?, b0[DMI@4?%%,京京工作室译,机械工业出版社,!""" -O . A@@(d**e?1?0I>*@