Ограничение MiniZinc: набор переменных = набор связанных доменов

Я новичок в MiniZinc и пытаюсь смоделировать то, что, по моему мнению, должно быть простым ограничением, однако я действительно изо всех сил пытаюсь понять синтаксис, и просмотр различной документации оставил меня более смущенным.

В основном я хочу ограничить определенные наборы переменных определенными наборами связанных с ними доменов, которые в моем случае просто 0..1. Вот неработающий пример того, чего я хочу добиться:

set of int: DOMAIN = 0..1;

var DOMAIN: x11;
var DOMAIN: x12;
var DOMAIN: x13;
var DOMAIN: x21;
var DOMAIN: x22;
var DOMAIN: x23;

% obviously these constraint don't work but this is the gist is what i'm going for
constraint [x11, x12, x13] = [1, 0, 1] \/ [1, 0, 0] \/ [0, 1, 0]; 
constraint [x11, x21] = [1,0] \/ [1,1];
% ... etc (ultimately every variable will appear in 2 constraints and this situation
% represents a grid of 1's and 0's)

(Тогда я просто хочу использовать solve satisfy;, чтобы просто присвоить переменным 0..1 так, чтобы все ограничения были выполнены)

Прошу прощения за неряшливое объяснение, но, как вы можете сказать, я явно новичок в этом. Если бы кто-нибудь мог помочь мне сформулировать эти ограничения, я был бы очень признателен - я полагаю, что сильно упростил синтаксис, не уверен, будут ли задействованы ограничения таблицы?


person Emily    schedule 17.04.2021    source источник
comment
Я думаю, вы ищете то, что называется ограничением таблицы. У одного из разработчиков minizinc есть несколько ответов здесь, в SO, по этому поводу, что действительно выглядит подходящим.   -  person sascha    schedule 17.04.2021
comment
Ах, отлично, это именно то, что мне нужно! Ясно, что я слеп, не замечая эту нить раньше! Большое спасибо :))   -  person Emily    schedule 17.04.2021


Ответы (1)


Как сказал @sascha, использование ограничения таблицы, вероятно, лучший вариант, когда есть много вариантов. Ваши ограничения могут быть записаны как:

constraint table([x11, x12, x13], [|
    1,0,1 |
    1,0,0 |
    0,1,0 |
|]);
constraint table([x11, x21], [|
    1,0 |
    1,1 |
|]);

Если существует много (небольших) (логических) ограничений таблицы, то для некоторых решателей может быть более эффективным использование логических предложений напрямую. Синтаксис для этого на самом деле очень похож на ваш нерабочий пример:

constraint [x11, x12, x13] = [1, 0, 1] \/ [x11, x12, x13] = [1, 0, 0] \/ [x11, x12, x13] = [0, 1, 0]; 
constraint [x11, x21] = [1,0] \/ [x11, x21] = [1,1];
person Dekker1    schedule 19.04.2021