原标题:遗传算法Python实战 009.背包问题
写在前面的话
以下部分内容,来自百度
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?
背包问题里面可以附加各种限制,比如容器的大小、容量、形状等等,我们在这里不做特别复杂的设定,仅做重量限制,也就是说可以认为你放进去的物品是可以不受形状的限制,仅受重量和容积的限制,比如你要放入的是糖或者盐这类东西。
下面是我们要放入背包中的物品:
物品名称
价值
重量(kg)
容量(L)
面粉
1680
0.265
0.41
黄油
1440
0.5
0.13
糖
1840
0.441
0.29进入算法实现部分
首先,定义个物品类,用来记录物品的各种属性:
cla***esource:
def__init__( self, name, value, weight, volume):
self.Name = name
self.Value = value
self.Weight = weight
self.Volume = volume
然后就可以设定物品信息和条件了:设定背包的最大承载重量为10kg,最大容量为4L
items = [Resource( " 面粉", 1680, 0.265, .41),
Resource( " 黄油", 1440, 0.5, .13),
Resource( " 糖", 1840, 0.441, .29)]
maxWeight = 10
maxVolume = 4
我们的目标是在这些限制条件下,将背包里的东西价值最大化。
我们可以想想,如何通过完成这个目标。
首先我们当然是希望价值与重量比和价值与体积比最优的物品优先——这样我们可以得到尽可能高的总价值。
当我们不能再把性价比最好的资源塞进去的时候,我们就要考虑用下一个最有价值的资源填满剩余的空间,以此类推。
一旦背包装满了,我们还需要考虑,我们是否可以用其他类型的项目组合来代替一种类型的项目,以便于最大限度的增加背包内物品的总价值。
然后定义一个用于记录当前背包中资源信息的类:
classItemQuantity:
def__init__( self, item, quantity):
self.Item = item
self.Quantity = quantity
def__eq__( self, other):
returnself.Item == other.Item andself.Quantity == other.Quantity
定义健壮性类:背包算法里面,肯定是轻、小、贵为最优,所以需要重量、容积和价值三个成员变量。在对比的时候,优先对比价值,价值相同的时候情况下,对比重量,最后对比容量。
classFitness:
def__init__( self, totalWeight, totalVolume, totalValue):
self.TotalWeight = totalWeight
self.TotalVolume = totalVolume
self.TotalValue = totalValue
def__gt__( self, other):
ifself.TotalValue != other. TotalValue:
returnself