python回溯法求解0-1揹包問題的最優值

#! /usr/bin/env python
#coding=utf-8
class BackSack():#定義揹包類
    def __init__(self,capacity):#類的初始化
        self.capacity=capacity #揹包最大容量(重量)
        self.currentWeight=0 #揹包當前重量
        self.bestValue=0 #揹包可容納貨物的最大價值,最優值
        self.currentValue=0 #揹包內當前已裝貨物的價值

    def Backtrack(self,i):#遍歷解空間尋找最優值,I:當前搜索的深度
        global length,weight,value,goods #全局變量 
        if(i>length):   
            if self.currentValue>self.bestValue: #更新最優值
                self.bestValue=self.currentValue
                self.currentCapacity=self.currentWeight#當前最優解下的揹包重量
                self.bestgoods=goods[0:5]
                print ('best:',self.bestgood)#輸出當前的最優解,最後一次輸出即是最終的最優解
            return
        if self.currentWeight+weight[i]<=self.capacity:#進入左子樹,即選取goods[i]放入揹包
            goods[i]=1
            self.currentWeight=self.currentWeight+weight[i]
            self.currentValue=self.currentValue+value[i]
            self.Backtrack(i+1)
            self.currentValue=self.currentValue-value[i]#進入右子樹,即捨棄goods[i],不放入揹包
            self.currentWeight=self.currentWeight-weight[i]
            goods[i]=0
        self.Backtrack(i+1)

def main():
    global length,weight,value,goods #全局變量,分別表示貨物數目,貨物的重量數組,價值數組,貨物的選取即0-1值
    currentWeight=0
    bestValue=0
    currentValue=0
    capacity=10
    weight=[2,2,6,5,4]
    value=[6,3,5,4,6]
    goods=[0,0,0,0,0]
    length=len(weight)-1
    backsack=BackSack(10)
    backsack.Backtrack(0)
    #backsack.Backtrack=Backtrack
    print backsack.bestValue,backsack.currentCapacity#輸出最優值和揹包內物品的總重量
    print backsack.bestgoods #輸出最優解

main()
点赞