Prolog 我怎样才能加快这个程序?这是一个硬币持有人的计算
因此,这是一个程序,它计算出这些硬币上携带的特定值的最少数量的硬币。这个程序可以运行,但是太慢了。。。当您替换值7或更小的长度时,它会起作用。。。但是8岁或以上,速度真的很慢。有没有办法加快这个计划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,
% 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}).