Используя CP-SAT из google or-tools Я пытаюсь написать это ограничение:
q >= (50x + 100y + 150z + 200k + 250p + 300v) / (x + y + z + k + p + v)
Где q
- простое целое число.
Дело в том, что мне нужно округлить правую часть уравнения (назовем его expression
) следующим образом:
if(expression < 75) {
expression = 50;
} else if(expression < 125) {
expression = 100;
} else if(expression < 175) {
expression = 150;
} else if(expression < 225) {
expression = 200;
} else if(expression < 275) {
expression = 250;
} else {
expression = 300;
}
Итак, мне нужно округлить выражение
(50x + 100y + 150z + 200k + 250p + 300v) / (x + y + z + k + p + v)
Чтобы он получил одно из следующих значений:
{50, 100, 150, 200, 250, 300}
Давайте рассмотрим 2 случая:
Случай 1
q = 180
и expression = 176
.
Хотя условие 180 >= 176
равно true
, после округления от 176 до 200 проверяемое условие должно быть 180 >= 200
, что равно false
.
Итак, для q = 180
и expression = 176
я бы хотел, чтобы условие возвращало false
.
Случай 2
q = 210
и expression = 218
.
Хотя условие 210 >= 218
равно false
, после округления от 218 до 200 в меньшую сторону Условие должно быть 210 >= 200
, что равно true
.
Поэтому для q = 210
и expression = 218
я бы хотел, чтобы условие возвращало true
.
У меня есть отличный ответ здесь для решения этой проблемы над линейным выражением, но теперь мне нужно решить эту проблему для нелинейного выражения.
Есть предложения?