0

したがって、1-0 ナップザック問題のような解決策を必要とする問題の典型的な再帰的実装があります。メイン関数のコードは次のとおりです。

def knapsack(items,sizeLimit):
    P = {}

    def recurse(nItems,lim):
        if not P.has_key((nItems,lim)):
            if nItems == 0:
                P[nItems,lim] = 0
            elif itemSize(items[nItems-1]) > lim:
                P[nItems,lim] = recurse(nItems-1,lim)
            else:
                P[nItems,lim] = max(recurse(nItems-1,lim),
                    recurse(nItems-1,lim-itemSize(items[nItems-1])) +
                    itemValue(items[nItems-1]))
        return P[nItems,lim]

    return recurse(len(items),sizeLimit)

問題は、私が何百万ものデータを持っていることです.このアプローチはすべてのエントリを計算するように思われるため、明らかなメモリと速度の問題につながります. この実装をさらに最適化するために使用できる動的プログラミング/メモ化手法はありますか?

4

1 に答える 1

0

問題をスケーリングするときに問題があるようです特定のこのファイルのこのディレクトリの例を見てください

以下は、指定された URL から取得されます。

ナップザックの問題が (1,2)、(1.5,1)、(0.5,3) で定義される 3 つの項目 (重量、値) と最大重量 2 のバッグで構成される場合、次のように簡単に解くことができます。 :

sage: from sage.numerical.knapsack import knapsack
sage: knapsack( [(1,2), (1.5,1), (0.5,3)], max=2)
[5.0, [(1, 2), (0.500000000000000, 3)]]

超増加シーケンス

シーケンスが超増加しているかどうかをテストできます::

sage: from sage.numerical.knapsack import Superincreasing
sage: L = [1, 2, 5, 21, 69, 189, 376, 919]
sage: seq = Superincreasing(L)
sage: seq
Super-increasing sequence of length 8
sage: seq.is_superincreasing()
True
sage: Superincreasing().is_superincreasing([1,3,5,7])
False

超増加シーケンスとターゲット合計のサブセット合計問題を解く::

sage: L = [1, 2, 5, 21, 69, 189, 376, 919]
sage: Superincreasing(L).subset_sum(98)
[69, 21, 5, 2, 1]

"""

また、Number Jackからのものもあります。これをテストするには、必要なすべてのファイルをインポートする必要があります。

于 2012-12-23T19:22:32.993 に答える