ナップサックと呼ばれる興味深い問題が発生しました。あなたはすべて値と体重を持っているアイテムのリストを持っています。次に、合計されたオブジェクトの価値を最大化するアイテムの組み合わせを見つけ、一定の限度内に留まらなければなりません。私はどこか別の検索アルゴリズムを使うことができる検索問題だと見ました。今私はそれを幅優先で実装しようとしています。次のように非再帰的0/1幅優先探索を使用したナップザックアルゴリズム
BFS用の擬似アルゴリズムはウィキペディアで発見がある:
Breadth-First-Search(Graph, root):
create empty set S
create empty queue Q
root.parent = NIL
Q.enqueue(root)
while Q is not empty:
current = Q.dequeue()
if current is the goal
return current
for each node n that is adjacent to current:
if n is not in S:
add n to S
n.parent = current
Q.enqueue(n)
私は本当にナップザック問題にこれを適用する方法を理解しようとしてきました。
私が理解する限り、それは木を作ることです。私は一度に1つのレベルの各ノードを展開して探索する必要があります。 BFSの場合、FIFOキューが必要です。選択された各アイテムについて、私は2つの選択肢があります:アイテムを取るかどうか。具体的にはとにかく 、:私は理解していない何を、私の状況では、上記の擬似コードでは、次のとおりです。
- 私は項目を選択すると、私はキューに二回、それを押すととしてそれらのいずれかをマークします1つは使用されていませんか?
- 現在が目標かどうかはどのようにわかりますか?私は葉のノードにいることを意味する探索するノードがもうないときのようなものを仮定します。しかし、葉のノードがたくさんあるので、どのノードを選択するのですか?
- 現在と隣接しているとはどういう意味ですか?リストやアイテムの配列(アイテムにID、重み、値がある)しかない場合、どのアイテムが隣接しているかをどのように知ることができますか?
あなたの考えの大きな欠陥は、あなたが横断しているグラフが間違っていることです。入力セットのすべてのサブセットの1つをトラバースしたいグラフ。したがって、2つのサブセットは、正確に1つのアイテムによって異なる場合、隣接しています。 'もし現在のものが目標であれば、'は、グラフの特定のノード(例えば、パスサーチ)を検索するためのBFSの通常の使用に由来します。正確な解はグラフ全体を網羅的に検索する必要があるため、これは当てはまりません。トラバースするノード/サブセットがなくなると終了できます。 – Paul
@Paulご意見ありがとうございます!今私が作っているのは、バッグに収まるすべてのソリューションの組み合わせがあるツリーだということを理解しています。 私が今行うことは、上記の擬似コードとまったく同じです。しかし、私は、各部分の代わりに、2つのノードを(1つは、取られた項目を表すために、もう1つは、取られなかった項目について)押します。また、Whileループが終了した後でフルパスを抽出するために、親としてcurrentを追加しようとします。今思うように聞こえますか? – Werflow
実際はありません。たとえば、空集合などのアイテムの任意の選択を含む集合から始まるグラフを作成する必要があります。各ノードには、そのノードと同じ集合が含まれます。ただし、集合から単一の要素を追加または削除する点が異なります。パスを抽出する必要はありません。例えば、input-set = '{1,2,3,4}'、n = '{2}'ネイバー= {{}、{1,2}、{2,3}、{2,4}} '。このグラフをDFSまたはBFSでトラバースし、最適解でノードを抽出します。 [この回答](http://stackoverflow.com/a/41912756/4668606)はあなたがしたいことを要約しています。 – Paul