Пытаясь свести одну задачу к целочисленному линейному программированию, столкнулся с такой проблемой: у меня есть целочисленная переменная, принимающая 3 значения:
. А нужна булевская,
, которая бы принимала значение
, когда
, и
в остальных случаях. Методом тыка довольно легко нашел, что проблема решается добавлением неравенств
.
Однако применение того же метода к случаю
, которая бы принимала значение
, когда
, как-то не пошло, получалось, что это (написать такое неравенство) невозможно. Нарисовав картинку на плоскости
, понял, почему: я пытался "вырезать" выпуклый многоугольник, в котором целых точек было бы
,
,
и
. Однако на отрезке с концами
и
лежит "лишняя" точка
, от которой, таким образом, нельзя избавиться.
Пришлось пойти длинным путем: ввести признак равенства двум (
, которая принимает значение
, когда
), тогда проблемы лишней точки нет,
задается неравенством
, а уж признак равенства единице
задаем через
и
:
, по MIP-вски, соответственно,
.
Вопрос, собс-но, нет ли какой-то общей технологии решения такого сорта задач? скажем, для переменной с 4 значениями все еще усложняется, не хочется изобретать велосипеды.
Может быть, есть какая-то книжка (типа "Математическая логика и целочисленное программирование")?