背包找到最大

时间:2016-08-24 21:46:03

标签: prolog win-prolog

我正在课程中学习prolog,我有练习实现背包问题。 我成功地编写了代码,但我无法弄清楚如何从所有可能的解决方案中找到最大利润。

这是代码

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).

我如何才能获得利润最大化?

编辑: 这是我如何运行它:

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

我想我问我如何制作prolog产生所有解决方案,因为现在我得到了一个解决方案,我可以按空间来获得下一个解决方案。 那么我如何生成所有解决方案,将它们保存在列表或其他内容中,并选择最佳利润。

更多信息 - L是Item-Size-Value的列表,Limit是包中的剩余空间,Amounts是Item1金额,Item2金额等的列表

1 个答案:

答案 0 :(得分: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-Amounts之上使用的Amounts列表,那么这将返回最大的利润,现在是谓词max,maxC中的FirstP-_。