使用findall / 3优化最小值

时间:2013-07-19 15:19:55

标签: optimization prolog swi-prolog clpfd

我正在尝试优化并找到函数的最低成本。下面的程序使用findall/3来迭代使用SWI-Prolog提供的clpfd库生成的所有可能的值选项。

使用下面的程序生成了几个Cost值,这些值被收集到一个列表中。我知道为了获得最小值,我可以简单地使用min_list/2谓词。但是,我想要的是,一旦程序找到一个当前最小的值,在计算其他选项时,如果该值大于最小值,则不会添加列表。

基本上,我想优化程序,以便它只考虑程序生成的最小值。

optimise(input, arguments, Cost):-
    findall(Cost, some_predicate(input, arguments, Cost), List).

some_predicate(input, arguments, Cost):-
    Option in input..arguments, label(Option),
    find_data(Option, Value),
    find_cost(Value, Cost).

上面的代码已经过修改,因此它是精简的,但却符合问题的目的。

1 个答案:

答案 0 :(得分:0)

我认为发现它不是正确的工具:here是我之前写的一些代码,可以帮到你。例如,给定

member_(X,Y) :- member(Y,X).

我们可以获得较低的元素

?- integrate(min, member_([1,2,4,-3]), M).
M = -3

我将通常的约定应用于postfix,并使用下划线交换参数的库谓词,以便能够元调用它。

以该代码为例,注意nb_setarg用法。

要查看它是否可以“开箱即用”,请尝试:

:- [lag].

optimise(Input, Arguments, Cost):-
    integrate(min, some_predicate(Input, Arguments), Cost).
相关问题