我怎样才能加速这一计划? 这是一个硬币保持器计算(How can I speed up this

2019-10-20 03:44发布

因此,这是它计算的最少数量的硬币与这些硬币一定值进行的程序。 该项目工程,但它的方式太慢了......当您更换或小于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))
    ).

任何帮助表示赞赏! 谢谢!

Answer 1:

第一观察:如果你把labeling(Coins)之前labeling(Values) ,时间大大提高。 粗略地说,这是因为在这个问题上硬币数量比硬币的价值更重要。

第二个观察:你不能低于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}).


文章来源: How can I speed up this program? It is a coin holder calculation