Python规划求解,python求解整数线性规划

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: