Необязательные переменные и набор членства в MiniZinc - PullRequest
3 голосов
/ 13 июля 2020

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

Проблема в том, что MiniZin c, похоже, не любит необязательные переменные и наборы.

Как можно ли это переписать, чтобы MiniZin c не жаловался?

enum TYPES = { TYPE1, TYPE2 };
enum SUBTYPES = { SUBTYPE1, SUBTYPE2, SUBTYPE3, SUBTYPE4 };
var TYPES: mytype;
var opt SUBTYPES: subtype; % if "opt" is removed, it works

constraint mytype=TYPE1 -> subtype in { SUBTYPE1, SUBTYPE3 };

1 Ответ

5 голосов
/ 14 июля 2020

Ваша модель почти верна, но в вашем ограничении отсутствует обработка необязательной части subtype. Поскольку наличие subtype не гарантируется, мы не можем прямо сказать, что он должен быть в наборе {SUBTYPE1, SUBTYPE3}. Вместо этого мы должны (1) заставить значение subtype существовать и (2) затем убедиться, что его значение находится в пределах данного набора.

Мы можем заставить существовать необязательное значение, используя occurs внутренний c. На его значение, с другой стороны, можно влиять с помощью deopt intrinsi c. Таким образом, ограничение становится:

constraint mytype=TYPE1 -> (occurs(subtype) /\ deopt(subtype) in { SUBTYPE1, SUBTYPE3 });
...