Выражение многопеременных ограничений с помощью OR-Tools

Я изучаю Cp-SAT Google для моделирования определенного типа ограничения, которое выглядит следующим образом:

Ограничения:

Переменная X может принимать значения 1, 2 и 3
Переменная Y может принимать значения 2, 3 и 4
Переменная Z может принимать значения 5, 6 и 7
Когда значение переменной X равно 1, тогда Y может принимать только значения принять 3 или 4
Когда значение переменной Y равно 3, тогда Z может принять только 7

Если значение переменной Y равно 3, а значение Z не равно 7, найдите возможные значения для X и Z.

Мне не удалось смоделировать это с помощью Java-интерфейса Google CP-SAT. Кто-нибудь может помочь?

Я изучил следующие примеры, но все еще не смог понять: https://github.com/google/or-tools/blob/stable/ortools/linear_solver/samples/LinearProgrammingExample.java

https://github.com/google/or-tools/blob/stable/ortools/linear_solver/samples/SimpleMipProgram.java


person sdare    schedule 14.03.2020    source источник


Ответы (1)


Вы смешиваете решатели (интерфейс CP-SAT и интерфейс линейного решателя).

Вам следует взглянуть на решатель CP-SAT, в частности на это ограничение:

http://google.github.io/or-tools/java/classcom_1_1google_1_1ortools_1_1sat_1_1CpModel.html#a07c24a31bdfe0db93e53fbf38655f200

Начните с чтения вводной документации:

https://developers.google.com/optimization/cp

и список простых рецептов

https://github.com/google/or-tools/blob/stable/ortools/sat/doc/README.md

person Laurent Perron    schedule 14.03.2020
comment
Спасибо, Лоран Перрон. Это очень помогло. У меня есть другой вопрос: как я могу добиться чего-то подобного в CP-SAT: (A == i) - ›(B == j && C == k), где A, B, C - IntVars, а i, j , k - целые числа. - person sdare; 15.03.2020
comment
Кстати, я решил проблему, похожую на вопрос выше, используя следующий подход: int numVals1 = 3; IntVar x1 = model2.newIntVar (0, 1, x); IntVar y1 = model2.newIntVar (0, 2, y); IntVar z1 = model2.newIntVar (0, 2, z); model2.addEquality (y1, 1); model2.addDifferent (z1, 0); IntVar [] yz = новая IntVar [2]; yz [0] = y1; yz [1] = z1; int [] [] vals = новый int [2] [2]; vals [0] [0] = 0; vals [0] [1] = 0; vals [1] [0] = 1; vals [1] [1] = 1; model2.addAllowedAssignments (yz, vals); CpSolverStatus status2 = solver.solve (model2); - person sdare; 15.03.2020
comment
См. github.com/google/or-tools/blob/stable/ortools/sat/doc/, основная идея - создать промежуточное логическое значение, а затем model.Add(B == j).OnlyEnforceIf(boolean) и model.Add(C == k).OnlyEnforceIf(boolean) - person Stradivari; 15.03.2020