Оператор if в линейном программировании
У меня есть две переменные a>=1 и b = {0,1}, поэтому a - целочисленная положительная переменная / = 0, а b - двоичная переменная. Я хочу сделать b = 1, когда a = 1, и b = 0, когда a> 1, и мне нужно записать это в линейную программу. Итак, условие:
если a = 1, то b = 1, иначе b = 0
что эквивалентно:
если a<2, то b = 1, иначе b = 0
потому что не может быть 0 из-за других ограничений.
кто-нибудь знает, как написать это в линейной программе?
2 ответа
OP, при условии, что M больше любого возможного значения положительного целого числа a, ответ, который вы предлагаете в своем комментарии, является правильным, а именно:
a <= b + My; a>= b + 2y; b + y = 1, где y является двоичным
Чтобы подтвердить, мы просто должны изучить этот набор утверждений, чтобы продемонстрировать, что (1) желаемые результаты достижимы и (2) все остальные результаты являются невозможными. Поскольку в этом случае b является двоичной переменной, "все остальные результаты" означают просто другой результат: b=0 против b=1.
Для начала рассмотрим условие:
если а = 1, то б = 1
Пусть a = 1 в предложенном вами ответе, получив:
1 <= b + My; 1>= b + 2y; b + y = 1
Ясно, что b = 1 выполнимо, потому что мы можем найти значение y, которое позволяет всем утверждениям быть истинными (а именно, y = 0):
1 <= 1 + М *0; 1 >= 1+2*0; 1+0 = 1
С другой стороны, если мы допустим b = 0:
1 <= 0 + My; 1>= 0 + 2y; 0 + y = 1
Это означает, что y = 1, что приводит к противоречию во втором утверждении:
1 <= 0 + M * 1; 1>= 0 + 2 * 1; 0 + 1 = 1
Следовательно, если a = 1, то должно быть, что b = 1.
Далее рассмотрим контрапозитив предыдущего условия (для удовлетворения условия "else"):
если a>1, то b = 0
Следуя той же процедуре, пусть a>1 в предложенном вами ответе - я поставлю 5, потому что у меня нет LaTeX, доступного для записи \tilde{a} или чего-то в этом роде, но имейте в виду, что это может быть любое целое число больше 1:
5 <= b + My; 5>= b + 2y; b + y = 1
Мы видим, что b = 0 выполнимо, потому что мы можем найти значение y, которое делает все утверждения истинными (а именно, y = 1):
5 <= 0 + M * 1; 5>= 0 + 2 * 1; 0 + 1 = 1
(Это та точка, в которой важно, чтобы M было больше любого возможного значения a, в противном случае первое утверждение может быть неверным.)
С другой стороны, если мы допустим b = 1:
5 <= 1 + My; 5>= 1 + 2y; 1 + y = 1
Это означает, что y = 0, что приводит к противоречию в первом неравенстве:
5 <= 1 + M * 0; 5>= 1 + 2 * 0; 1 + 0 = 1
Следовательно, если a>1, то должно быть, что b = 0.
Следовательно, этот набор утверждений удовлетворяет условию:
если a = 1, то b = 1, иначе b = 0
Пример в C++:
#include <iostream>
int main()
{
// declare variables at top...
int a = 1;
int b = 0;
// then some code that changes the initial value of a...
// code to check the value of a and change the value of b...
if (a == 1) {
b = 1;
} else if (a > 1) {
b = 0;
}
// output value of b
std::cout << "Value of b: " << b << std::endl;
return 0;
}