PROLOG CLPFD最小化表达式
我有一个有限域上的变量列表。例如:PROLOG CLPFD最小化表达式,prolog,label,clpfd,labeling,Prolog,Label,Clpfd,Labeling,我有一个有限域上的变量列表。例如: :- use_module(library(clpfd)). example :- L = [_,_,_], L ins 1..10, ... 此外,我还有一个谓词 pred(L,C) 对于域值的任何L赋值,都给出了一个代价C 问题是如何使用CLPFD的标记特性来找到使C最小化的L的赋值 example :- L = [_,_,_], L ins 1..10, pred(L,C), labeling
:- use_module(library(clpfd)).
example :-
L = [_,_,_],
L ins 1..10,
...
此外,我还有一个谓词
pred(L,C)
对于域值的任何L赋值,都给出了一个代价C
问题是如何使用CLPFD的标记特性来找到使C最小化的L的赋值
example :-
L = [_,_,_],
L ins 1..10,
pred(L,C),
labeling([min(C)],L),
write(L).
不起作用。它只选择第一个赋值(即[1,1,1])。很可能,
C
在本例中调用labeling/2
时已经实例化。然后,目标类似于:
标签([min(1)],Ls)
当然,在labeling/2
过程中,没有任何空间来实际最小化C
为了实现这一点,您必须制定pred/2
,以便C
通过约束与变量Vs
确定相关。例如:
:- use_module(library(clpfd)).
example :-
L = [_,_,_],
L ins 1..10,
...
sum(Vs,#=,C),
标签([min(C)],Vs)
如果成本函数是有限域变量之和Vs
,则按预期工作
我将您的示例改写为:
example(Ls) :-
Ls = [_,_,_],
Ls ins 1..10,
pred(Ls, C),
labeling([min(C)], Ls).
特别注意:
write/1
,因为当我查询?-示例(Ls)
时,Prolog顶层将为我显示解决方案很可能,
C
在本例中调用labeling/2
时已经实例化。然后,目标类似于:
标签([min(1)],Ls)
当然,在labeling/2
过程中,没有任何空间来实际最小化C
为了实现这一点,您必须制定pred/2
,以便C
通过约束与变量Vs
确定相关。例如:
:- use_module(library(clpfd)).
example :-
L = [_,_,_],
L ins 1..10,
...
sum(Vs,#=,C),
标签([min(C)],Vs)
如果成本函数是有限域变量之和Vs
,则按预期工作
我将您的示例改写为:
example(Ls) :-
Ls = [_,_,_],
Ls ins 1..10,
pred(Ls, C),
labeling([min(C)], Ls).
特别注意:
write/1
,因为当我查询?-示例(Ls)
时,Prolog顶层将为我显示解决方案也许这是唯一的解决方案,因为0无法使用?joel76,你在假设Pred的情况也许这是唯一的解决方案,因为0无法使用?joel76,你在假设Pred的情况谢谢,现在我明白为什么它不起作用了。然而,在这种情况下,我认为pred过于复杂,无法通过约束来描述它。约束具体化通常用于表示更复杂的约束。如果所有这些都失败了,您还可以实现一个自定义传播程序。谢谢,现在我明白了为什么它不起作用。然而,在这种情况下,我认为pred过于复杂,无法通过约束来描述它。约束具体化通常用于表示更复杂的约束。如果所有其他操作都失败,还可以实现自定义传播器。