Есть ли явная поддержка работы по модулю в библиотеке eplex? - PullRequest
2 голосов
/ 03 июня 2019

Я использую библиотеку eplex и ic и пытаюсь решить проблему. Я вижу, что eplex и ic предоставляют явную поддержку addition,multiplication и subtraction, но нет поддержки modulo или division.

Точнее, у меня есть этот код:

    FirstResult #=  (Result[I] mod Val), % Here it gives error because Result[I] is not instantiated.
    NewVal is Val+1,
    SecondResult #= (Result[I] mod NewVal)

и mod требуют, чтобы два аргумента были обоснованы, но Result[I] не создается, а имеет диапазон значений. Поэтому мой вопрос заключается в том, как можно отложить такие ограничения, которые включают в себя операцию mod.

1 Ответ

1 голос
/ 06 июня 2019

Обычно вы можете переформулировать

R #= X mod Y

как

0 #=< R, R #=< Y-1,      %  R is between 0 and Y-1
X #= _*Y + R,            %  X is some multiple of Y, plus a remainder R

Это предполагает, что вы используете library(ic) и у вас нет особых требований к поведению с отрицательными аргументами.

Для library(eplex), который использует решатель MILP, вы можете сделать почти то же самое (если Y является целочисленным параметром), но вы должны быть немного более точными в отношении целостности:

0 $=< R, R $=< Y-1,
integers([K,R]),
X $= K*Y + R,
...