私はコースでプロローグを勉強しています。ナップザック問題を実装するための練習があります。 私はコードを書くことに成功しましたが、すべての可能な解決策から最大利益を見つける方法を理解することはできません。ナップザックFind Max
は、ここで私は利益で最高を行うことができますどのようにコード
between(Lo, Hi, Nu) :-
( integer(Lo),
integer(Hi),
integer(Nu)
-> Nu >= Lo,
Nu =< Hi
; integer(Lo),
integer(Hi),
var(Nu)
-> repeat(Lo, Hi, Nu)
).
add_list(A, [], [A]).
add_list(A, L, [A|L]).
add_list([], L, L).
add_list([H|T], L, L1) :- add(H, L2, L1), add_list(T, L, L2).
knapsack_go(L, Limit, Amounts, Profit):-
knapsack(L, Limit, Amounts, 0, Profit).
knapsack([], _, _, ProfitSoFar, ProfitSoFar).
knapsack([Item-Size-Value| Tail], Limit, Amounts, ProfitSoFar, Profit):-
Upper is Limit//Size,
between(0, Upper, A),
Profit2 is (A * Value) + ProfitSoFar,
Limit2 is Limit - (A*Size),
add_list(A, Amounts2, Amounts),
knapsack(Tail, Limit2, Amounts2, Profit2, Profit).
ですか? EDIT
:私は今、私は解決策を得るので、私は、すべてのソリューションを生成するプロローグ作るのですかと私はスペースを押すことができる方法を求めていると思う
knapsack_go([a-7-9, b-11-14, c-19-24], 100, Amounts, Profit).
:ここ は、私はそれを実行する方法です次のものを入手してください。 どのようにしてすべてのソリューションを生成し、リストや何かに保管して、最高の利益を得ます。
いくつかの詳細情報 - Lは、アイテムのサイズと値のリストで、リミットはバッグ内の残りの空間であり、金額、アイテム1の量のリストでアイテム2量など
実装が_all_解決策を示している場合、特定の順序ではなく、常にすべてを収集して最大値を選択することができます。例については、[here](http://stackoverflow.com/questions/27317069/collect-all-minimum-solutions-from-a-predicate)を参照してください。ところで、あなたはすべてのPrologで利用可能な述語を書き直しているようです(何十年も続いています)。 –
あなたはあなたのソリューションをどのようなリストで収集しますか? – coder
@coderこれは 'knapsack_go/4'の最後の引数になるでしょう。最上位レベルからプログラムを呼び出す例を質問に含める必要があります。 –