0

現在、Python 3.2 でナップザックの問題をコーディングしようとしています。これをマトリックスで動的に実行しようとしています。私が使用しようとしているアルゴリズムは次のとおりです

ナップザック問題のメモリ関数メソッドを実装します
入力: 最初の数を示す非負の整数 i
考慮されているアイテムと、ナップザックの容量を示す非負の整数 j
出力: 最初の i 項目の最適な実行可能なサブセットの値
注: グローバル変数の入力配列 Weights[1..n]、Values[1...n] として使用します。
およびテーブル V[0...n, 0...W] のエントリは -1 で初期化されます。
0 で初期化された行 0 と列 0
if V[i, j] < 0
    if j < Weights[i]
        value <-- MFKnapsack(i - 1, j)

    else
        value <-- max(MFKnapsack(i -1, j),
            Values[i] + MFKnapsack(i -1, j - Weights[i]))

    V[i, j} <-- value

return V[i, j]

以下のコードを実行すると、重みをリストに挿入しようとすることがわかります。これは再帰を使用しているため、問題を見つけるのに苦労しています。また、「+」を使用してリストに整数を追加できませんというエラーが表示されます。最初の行と最初の列がすべて 0 で始まるようにマトリックスを初期化しました。それ以外はすべて -1 に初期化されています。どんな助けでも大歓迎です。

#Knapsack Problem 


def knapsack(weight,value,capacity):
    weight.insert(0,0)
    value.insert(0,0)

    print("Weights: ",weight)
    print("Values: ",value)

    capacityJ = capacity+1

    ## ------ initialize matrix F ---- ##
    dimension = len(weight)+1
    F = [[-1]*capacityJ]*dimension

    #first column zeroed
    for i in range(dimension):
        F[i][0] = 0
    #first row zeroed            
    F[0] = [0]*capacityJ
    #-------------------------------- ##

    d_index = dimension-2
    print(matrixFormat(F))

    return recKnap(F,weight,value,d_index,capacity)

def recKnap(matrix, weight,value,index, capacity):

    print("index:",index,"capacity:",capacity)
    if matrix[index][capacity] < 0:
        if capacity < weight[index]:
            value = recKnap(matrix,weight,value,index-1,capacity)
        else:
            value = max(recKnap(matrix,weight,value,index-1,capacity),
                        value[index] +
                        recKnap(matrix,weight,value,index-1,capacity-(weight[index]))

    matrix[index][capacity] = value
    print("matrix:",matrix)


    return matrix[index][capacity]


def matrixFormat(*doubleLst):
    matrix = str(list(doubleLst)[0])
    length = len(matrix)-1
    temp = '|'
    currChar = ''
    nextChar = ''
    i = 0

    while i < length:
        if matrix[i] == ']':
            temp = temp + '|\n|'
        #double digit
        elif matrix[i].isdigit() and matrix[i+1].isdigit():
            temp = temp + (matrix[i]+matrix[i+1]).center(4)
            i = i+2
            continue
        #negative double digit
        elif matrix[i] == '-' and matrix[i+1].isdigit() and matrix[i+2].isdigit():
            temp = temp + (matrix[i]+matrix[i+1]+matrix[i+2]).center(4)
            i = i + 2
            continue
        #negative single digit
        elif matrix[i] == '-' and matrix[i+1].isdigit():
            temp = temp + (matrix[i]+matrix[i+1]).center(4)
            i = i + 2
            continue




        elif matrix[i].isdigit():
            temp = temp + matrix[i].center(4)

        #updates next round
        currChar = matrix[i]
        nextChar = matrix[i+1]
        i = i + 1

    return temp[:-1]




def main():
    print("Knapsack Program")
    #num = input("Enter the weights you have for objects you would like to have:")
    #weightlst = []
    #valuelst = []
##    for i in range(int(num)):
##        value , weight = eval(input("What is the " + str(i) + " object value, weight you wish to put in the knapsack?  ex. 2,3: "))
##        weightlst.append(weight)
##        valuelst.append(value)
    weightLst = [2,1,3,2]
    valueLst = [12,10,20,15]
    capacity = 5

    value = knapsack(weightLst,valueLst,5)

    print("\n      Max Matrix")
    print(matrixFormat(value))

main()
4

3 に答える 3

1
F = [[-1]*capacityJ]*dimension

マトリックスを正しく初期化しません。[-1]*capacityJは問題ありませんが、まったく同じリストへの参照[...]*dimensionを作成します。したがって、1 つのリストを変更すると、それらすべてが変更されます。dimension

代わりに試す

F = [[-1]*capacityJ for _ in range(dimension)]

これは、よくある Python の落とし穴です。詳細については、この投稿を参照してください。

于 2012-04-16T01:08:12.310 に答える
0

キャッシュの説明のために、私は通常、次のようにデフォルトの dict を使用します。

from collections import defaultdict
CS = defaultdict(lambda: defaultdict(int)) #if i want to make default vals as  0
###or
CACHE_1 = defaultdict(lambda: defaultdict(lambda: int(-1))) #if i want to make default vals as -1 (or something else)

これにより、Pythonでオンザフライで2次元配列を作成できなくなります...

このアプローチを使用して z1knapsack への回答を表示するには:

http://ideone.com/fUKZmq

于 2015-07-26T18:38:53.903 に答える