2016-08-24 9 views
2

私はコースでプロローグを勉強しています。ナップザック問題を実装するための練習があります。 私はコードを書くことに成功しましたが、すべての可能な解決策から最大利益を見つける方法を理解することはできません。ナップザック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量など

+0

実装が_all_解決策を示している場合、特定の順序ではなく、常にすべてを収集して最大値を選択することができます。例については、[here](http://stackoverflow.com/questions/27317069/collect-all-minimum-solutions-from-a-predicate)を参照してください。ところで、あなたはすべてのPrologで利用可能な述語を書き直しているようです(何十年も続いています)。 –

+1

あなたはあなたのソリューションをどのようなリストで収集しますか? – coder

+0

@coderこれは 'knapsack_go/4'の最後の引数になるでしょう。最上位レベルからプログラムを呼び出す例を質問に含める必要があります。 –

答えて

2

にあなたが使用することができます

findall(Profit-Amounts,knapsack_go([a-7-9, b-11-14, c-19-24], 100, Amounts, Profit),L). 

これは、リストLのすべてのソリューションを収集します.Lは、[Profit-Amounts | T]という形式のリストになります。今

、あなたが書くことができ、最大の利益を見つける:

max([First | Rest], Result) :- First =FirstP-_ 
    maxC(Rest, First,FirstP, Result). 

    maxC([], Sofar, _, Sofar). 

    maxC([First | Rest], _, Max, Result) :- 
    First = FirstP-_ 
    Max =< FirstP, 
    maxC(Rest, First, FirstP,Result). 

    maxC([First | Rest], Sofar,Max,Result):- 
    First = FirstP-_ 
    Max > FirstP, 
    maxC(Rest, Sofar, Max, Result). 

これは、あなたが金額のリストをしたい場合、あなたが今FirstP-_であるFirstP-金額を超える使用するであろう利益の最大を返します。述語max、maxC。

+0

ありがとう!私はもう一つの質問があります。私のadd_listでは、[a、b、c]と同じものを一度受け取り、[a、b、c | _1111]という別の時間を受け取ります。 – Infested

+0

@Infested、私はあなたがswi-prologを使用しているためにあなたのコードを実行できなかったのでわからないし、プログラムを実行しないで繰り返し述語を認識しなかったので、問題はです。 – coder

関連する問題