Я хочу максимизировать разницу между двумя переменными:
:- use_module(library(clpfd)).
maximize(X) :-
X = [A,B],
X ins 1..5,
% I want to write a constraint to have maximum difference between A and B.
Я хочу максимизировать разницу между двумя переменными:
:- use_module(library(clpfd)).
maximize(X) :-
X = [A,B],
X ins 1..5,
% I want to write a constraint to have maximum difference between A and B.
Нет никаких ограничений для выражения максимальной разницы. Нет никаких ограничений для выражения максимального значения 1. Чтобы разрешить такую конструкцию, потребуется некоторая форма количественной оценки. И / или возникнут проблемы с монотонностью.
Однако есть кое-что связанное с этим: вы можете захотеть сгенерировать такие значения, чтобы сначала вырабатывалось наибольшее значение:
:- use_module(library(clpfd)).
maximize(Xs) :-
Xs = [A,B],
Xs ins 1..5,
labeling([max(abs(A-B))],Xs).
?- maximize(Xs).
Xs = [1, 5] ;
Xs = [5, 1] ;
Xs = [1, 4] ;
Xs = [2, 5] ;
Xs = [4, 1] ...
Таким образом, он начинается с самого большого расстояния, а затем уменьшается одно за другим.
Сначала такое поведение может вас удивить, но вспомните то, что указано в руководстве а>
Маркировка всегда завершена, всегда завершается и не приводит к дублированию решений.
Это очень сильная гарантия!
Если теперь вам нужно только первое решение, оберните once/1
вокруг labeling/2
, но имейте в виду, что тогда вы вышли из области чистых, монотонных программ.
Сноска 1: можно выразить максимум двух переменных max(X,Y)
, но это не ограничивает максимальное значение максимально возможным значением! Это будет только самое большое значение X
и Y
.
D
- person false; 22.04.2014