Prolog 我怎样才能加快这个程序?这是一个硬币持有人的计算

Prolog 我怎样才能加快这个程序?这是一个硬币持有人的计算,prolog,eclipse-clp,Prolog,Eclipse Clp,因此,这是一个程序,它计算出这些硬币上携带的特定值的最少数量的硬币。这个程序可以运行,但是太慢了。。。当您替换值7或更小的长度时,它会起作用。。。但是8岁或以上,速度真的很慢。有没有办法加快这个计划 % LIBRARIES NEEDED FOR FUNCTION TO WORK :- lib(ic). :- lib(ic_global). :- lib(branch_and_bound). questionSix(Values, Coins) :- init_vars(Values,

因此,这是一个程序,它计算出这些硬币上携带的特定值的最少数量的硬币。这个程序可以运行,但是太慢了。。。当您替换值7或更小的长度时,它会起作用。。。但是8岁或以上,速度真的很慢。有没有办法加快这个计划

% LIBRARIES NEEDED FOR FUNCTION TO WORK
:- lib(ic).
:- lib(ic_global).
:- lib(branch_and_bound).

questionSix(Values, Coins) :-
    init_vars(Values, Coins),
    coin_cons(Values, Coins, Pockets),
    clever_cons(Values, Coins),
    Min #= sum(Coins),
    minimize((labeling(Values), labeling(Coins), check(Pockets)), Min).

init_vars(Values, Coins) :-
    length(Values, 8),
    occurrences(5, Values, 1),
    Values :: 1..99,
    increasing(Values),
    length(Coins, 8),
    Coins :: 0..99.

increasing(List) :-
    ( fromto(List, [This, Next | Rest], [Next | Rest], [_])
    do
        This #< Next
    ).

clever_cons(Values, Coins) :-
    ( fromto(Values, [V1 | NV], NV, []), 
      fromto(Coins, [N1 | NN], NN, [])
     do
        ( NV = [V2 | _]
            -> N1*V1 #< V2;
            N1*V1 #< 100
        )
    ).

coin_cons(Values, Coins, Pockets) :-
    ( for(Price, 1, 99),
    foreach(CoinsforPrice, Pockets),
    param(Coins, Values)
    do
        price_cons(Price, Coins, Values, CoinsforPrice)
    ).

price_cons(Price, Coins, Values, CoinsforPrice) :-
    ( foreach(V, Values), foreach(C, CoinsforPrice), foreach(Coin, Coins),
    foreach(Prod, ProdList)
    do
        Prod = V*C,
        0 #=< C,
        C #=< Coin
    ),
    Price #= sum(ProdList).

check(Pockets) :-
    ( foreach(CoinsforPrice, Pockets)
    do
        once(labeling(CoinsforPrice))
    ).
%函数工作所需的库
:-lib(ic)。
:-lib(ic_全局)。
:-lib(分支和绑定)。
问题六(价值、硬币):-
初始变量(值、硬币),
硬币(价值、硬币、口袋),
聪明的骗局(价值观、硬币),
最小值=总和(硬币),
最小化((标签(值)、标签(硬币)、支票(口袋)),最小值)。
初始变量(值、硬币):-
长度(值8),
事件(5,值,1),
值::1..99,
增加(数值),
长度(硬币,8),
硬币:0..99。
增加(列表):-
(fromto(List,[这个,下一个| Rest],[下一个| Rest],[下一个| Rest])
做
这是下一个
).
聪明的敌人(价值观、硬币):-
(fromto(值,[V1 | NV],NV,[]),
fromto(硬币,[N1 | NN],NN,[]))
做
(NV=[V2 | u]
->N1*V1#

感谢您的帮助!谢谢

第一个观察:如果将
标记(硬币)
放在
标记(值)
之前,时间会显著缩短。粗略地说,这是因为在这个问题上,硬币的数量比硬币的价值重要得多

第二个观察:无论你允许多少个值,你都不能得到少于7个硬币。这是因为如果你用7个值运行你的程序,你可以看到每一枚硬币在最佳解决方案中使用一次。因此,如果您有超过7个值,则只会使用其中的7个,或者硬币的数量将超过7个,解决方案将不是最优的

记住这些观察结果,你就可以改变

minimize((labeling(Values), labeling(Coins), check(Pockets)), Min).

bb_min((labeling(Coins), labeling(Values), check(Pockets)), Min, bb_options{from:7}).