Оператор 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;
}
Другие вопросы по тегам