Python规划求解,python求解整数线性规划
描述:01从背包中取出N件物品,放入背包中的空间V中,每件物品的体积为V1,V2……Vn,对应的数值为P1,P2……Pn。
环境:win7 python2.7
求解过程:考虑用动态规划求解。
舞台【从原来的N个道具中选择几个道具放入背包】
状态【在最初的N个物品中,选择几个物品,将剩余空间放入W的背包中,获得最大值】
做出决定[是否放置第n个项目]
你可以写出动态转移方程。
F[i,j]表示选择前I项中的几项,将剩余空间放入J的背包中,得到的最大值。
f[i,j]=max{f[i-1,j-wi]pi(j=wi),f[i-1,j]}
基本上,关于背包问题的方程就是由此导出的。
在V的空间中,我们认为放入N项就可以得到最大值(最开始的N-1项是最大值,第N个乘积可以放入)))))))))))))))))))))。
="我们认为把N-1项放入V-Vn空间可以得到最大值(第N-2项是最大值,第N-1项可以放进去)))。
=认为把N-2项放入V-Vn-1-Vn空间可以得到最大值(前N-3项是最大值,第N-2项可以放进去))))))。
="V-V3-V4。-我觉得在VN的空间里放两个物品可以得到最大值(第一个物品是最大值,第二个物品可以放进去)。
把一个物品放在V-V2-V3-V4的空间里可以得到最大值。-Vn(前0项的值为0,所以可以放第一项)))))
源代码如下所示。
#!C:\\Python27\\python.exe
#-*-编码:utf-8-*-
导入副本
类动态包:
def__init_(self,limitVolume,itemsVolume,itemsValue):
Self.limitVolume=limitVolume #最大音量上限,音量
Self.itemsVolume=itemsVolume #所有项目中每个项目的体积
Self.itemsValue=itemsValue #所有项目中每个项目的值
Self.resultSumVolume=0 #最大值占用体积
Self.resultSumValue=0 #最大值
自我。resultemsvolume=[] #每个体积的最大值
自我。resultemsvalue=[] #每个值的最大值
defdynamicsuitresult(self):
项目计数=len(自身项目数量).
ifitemscount==len (self.items值) :
所有项目=[] #所有项目的下标
将0项添加到self.itemsvolume.append(0) #以简化计算。
self.itemsvalue.append(0)).
项目数=项目数1
Forkinrange(项目计数):
allItems.append(k)
(self . results sum volume,self . results sum value,result items))=self . dynamic 01箱包(所有项目[项目计数-1 ],限制值)
删除项目del result items[result times . index(items count-1)]# 0的索引。
对于简历中的k:
从自身价值最大的配置项索引中检索。ResultemsVolume.append (self。itemsVolume [k])。
self . result items value . append(self . items value[k]).
否则:
Print (args error!)
return(self . results sum volume,self。resultum value,self.resultItemsVolume,self.resultItemsValue) #是最大占用体积和最大值。
defdynamic01bag(self,oneItem,limitVolume,allItems):
SuitSumVolume=0 #当前项目的最大占用体积
PsuitSumValue=0 #当前项目的当前最大值
SuitItems=[] #当前项的当前最大值的组件索引
partItems=copy.copy(allItems)
分区项目。INDEX (ONEITEM)] #删除当前项目
Len (part items)==1: #前一项只有一项
如果限制音量。项目数量[零件项目[0]]: #数量小于前一个项目。
return (suitSumVolume,suitSumValue,suitItems)
Elilimit音量=(自我。项目数量[部分项目[0]]自身。items volume [one item]): #音量大于或等于当前项的前一项。
suit sum volume=self . items volume[partItems[0]]self . items volume[one item]
suit sum value=self . items value[partItems[0]]self . items value[one item]
suitItems.append(oneItem)
suitItems.append(partItems[0])
return (suitSumVolume,suitSumValue,suitItems)
否则:#音量大于等于上一项且小于上一项的当前项。
suit sum volume=self . items volume[partItems[0]]
suit sum value=self . items value[partItems[0]]
suitItems.append(partItems[0])
return (suitSumVolume,suitSumValue,suitItems)
否则:#前一项有多项
suitVolume1=0
suitValue1=0
suitVolume2=0
suitValue2=0
suitIndex1=0
suitIndex2=0
结果=[]
对于范围内的k(len(partItems)):
(aSumVolume,bSumValue,cItems)=self。动态01包(partItems[k],限量版。项目卷[一个项目],分区)#对多个前一项的每项求最大值
result.append((aSumVolume,bSumValue,cItems))
if(aSumVolume self。项目数量[一个项目])=限制数量:#存在容积大于等于前一项当前项的情况,获取最大的前一项当前项
if(bsum值self。物品价值[一件物品])套装价值1:#对多个前一项的最大值,求最优
套装体积1=asum体积自身。项目数量[一个项目]
套装值1=bsum值self。项目值[一个项目]
suitIndex1=k
如果bSumValue套件值2:#容积小于所有的前一项当前项情况下使用,获取最大的前一项
suitVolume2=aSumVolume
suitValue2=bSumValue
suitIndex2=k
如果套件值1 0:#存在容积大于等于前一项当前项的情况,获取最大的前一项当前项
suitSumVolume=suitVolume1
suitSumValue=suitValue1
suitItems.append(oneItem)
suitItems.extend(结果[套件索引1][2])
return (suitSumVolume,suitSumValue,suitItems)
否则:#容积小于所有的前一项当前项情况下使用,获取最大的前一项
suitSumVolume=suitVolume2
suitSumValue=suitValue2
suitItems.extend(结果[套件索引2][2])
return (suitSumVolume,suitSumValue,suitItems)
#算法验证
if __name__==__main__ :
极限体积=20#体积上限
itemsVolume=[1,2,5,7,9]#单个总体积
itemsValue=[1,1,1,2,2]#单个总价值
hk01bag=DynamicBag(limitVolume,itemsVolume,itemsValue)
(resultSumVolume,resultSumValue,resultItemsVolume,resultItemsValue)=hk 01包。dynamicsuitresult()
打印最大价值:字符串(结果总和值)
打印最大价值的单个价值:
打印结果项值
打印最大价值的总体积: str(resultSumVolume)
打印最大价值的单个总体积:
打印结果卷
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。