【问题标题】:optimised minimum value using findall/3使用 findall/3 优化最小值
【发布时间】:2013-07-19 15:19:55
【问题描述】:

我正在尝试优化并找到函数的最小成本。下面的程序使用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).

上面的代码已经过修改,使其更简洁,但符合问题的目的。

【问题讨论】:

  • 问题是什么
  • 就像它说的那样——“优化程序,让它只考虑程序产生的最小值”

标签: optimization prolog swi-prolog clpfd


【解决方案1】:

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

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

我们可以得到下层元素

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

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

以那段代码为例,注意nb_setarg的用法。

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

:- [lag].

optimise(Input, Arguments, Cost):-
    integrate(min, some_predicate(Input, Arguments), Cost).

【讨论】:

  • 感谢您提供这些信息,但是,我不只是想要较低的元素,我想优化它以找到最小值,因为它需要使用成本函数
  • 也许你没有抓住重点: some_predicate 将被调用直到它失败,完全就像 findall/3 一样。集成/3 它是(更好的)节省空间替代品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2021-04-05
  • 2012-05-03
  • 2013-11-03
相关资源
最近更新 更多