Читайте также: |
|
Бинарная целая переменная — называемая также переменной 0/1 — является частным случаем целочисленной переменной, значениями которой могут быть только 0 или 1. Она часто используются как индикатор для включения или исключения некоторого количества.
Ниже приведен пример задачи о производстве нескольких изделий из некоторых составляющих, в которой 0/1-переменная используется именно таким образом. Вы являетесь менеджером по производству предприятия со сложной схемой производства. Ваша новейшая модель METEOR приносит наибольшую прибыль на единицу изделия по сравнению с любой другой производимой вами моделью и наименьшими затратами по ее наладке. Может быть вам ничего другого и не надо производить … или все же надо?
Эта модель имеется в поддиректории «Samples» под именем PRODMIX.LNG. Как и раньше, мы сначала покажем всю модель, и после того, как вы с ней ознакомитесь, вернемся к началу и объясним ее.
PRODMIX.LNG
MODEL:
1]SETS:
2] PRODUCT/ROCKET,METEOR,STREAK,COMET,JET,BIPLANE /
3]: PROFIT,QTY,SETUP,BUILD;
4] RESOURCES/STEEL,COPPER,PLASTIC,RUBBER,GLASS,PAINT/
5]: AVAIL;
6] RXP(RESOURCES, PRODUCT): USAGE;
7]ENDSETS
8]
9][MAX] MAX = @SUM(PRODUCT(I):
10] PROFIT(I) * QTY(I) - SETUP(I) * BUILD(I));
11]@FOR(RESOURCES(I):
12] @SUM(PRODUCT(J):USAGE(I,J)*QTY(J))<=AVAIL(I));
13]
14]@FOR(PRODUCT(I):
15] QTY(I) <= 1000 * BUILD(I);
16] @BIN(BUILD(I));
17] @GIN(QTY(I)));
18]
19]DATA:
20]! ROCKET METEOR STREAK COMET JET BIPLANE;
21]
22]PROFIT= 30 45 24 26 24 30;
23] SETUP= 35 20 60 70 75 30;
24]
25]AVAIL =!STEEL; 800
26]!COPPER; 1160
27]!PLASTIC; 1780
28]!RUBBER; 1050
29]!GLASS; 1360
30]!PAINT; 1240;
31]
32]USAGE =!STEEL; 1 4 0 4 2 0
33]!COPPER; 4 5 3 0 1 0
34]!PLASTIC; 0 3 8 0 1 0
35]!RUBBER; 2 0 1 2 1 5
36]!GLASS; 2 4 2 2 2 4
37] PAINT; 1 4 1 4 3 4;
38]
39]ENDDATA
END
Многое вам к этому моменту уже знакомо. В секции SETS нет ничего нового, но обратите внимание, что в множестве, названном PRODUCT (изделия), имеется атрибут с именем BUILD. Он введен как переменная типа «0/1-индикатор», иногда называемая «переключателем», то есть DUILD(I), будет равно 1, если продукт производится, и 0 — если нет.
В целевой функции сообщается системе LINGO, что необходимо минимизировать сумму произведений PROFIT (прибыль единицы изделия) на количество QTY произведенных изделий для каждого PRODUCT за вычетом начальных затрат SETUP, умноженных на переменную BUILD. Безусловно, если переменная BUILD равна нулю (изделие не производится), то начальные затраты SETUP должны быть исключены:
[MAX] MAX = @SUM(PRODUCT(I):
PROFIT(I) * QTY(I) - SETUP(I) * BUILD(I));
В следующем операторе ограничения требуется, чтобы сумма используемых (USAGE) для каждого элемента ресурсов (RESOURCES), умноженных на количество QTY каждого из производимых PRODUCT, была меньше или равна наличного запаса (AVAILability) этого ресурса:
@FOR(RESOURCES(I):
@SUM(PRODUCT(J): USAGE(I, J) * QTY(J)) <= AVAIL(I));
Теперь посмотрим на ограничение, которое обязывает переменную BUILD принимать значения только 0 или 1:
@FOR(PRODUCT(I):
QTY(I) <= 1000 * BUILD(I);
@BIN(BUILD(I));
@GIN(QTY(I)));
Когда количество QTY производимого изделия PRODUCT не равно нулю, единственный способ, которым LINGO может удовлетворить ограничению, это положить BUILD также не равным нулю. Число 1000 выбрано потому, что оно соответствует максимально возможному количеству, которое может быть произведено. Точно также, когда количество QTY равно нулю, BUILD тоже будет установлено в ноль, поскольку коэффициент SETUP (первоначальные затраты) в целевой функции, на который умножается BUILD, отрицателен.
BUILD принудительно устанавливается либо в ноль, либо в единицу посредством:
@BIN(BUILD(I));
Последняя строка заставляет количество каждого из космических аппаратов быть целым. Как и в случае задачи составления штатного расписания, какая-то часть космического аппарата сама по себе ничего не стоит.
Заметим, что когда функции @BIN или @GIN находятся внутри скобок, принадлежащих оператору @FOR, то они применяются ко всем элементам множества PRODUCT.
Ниже приведена часть решения, демонстрирующая принцип, что «не следует быть чрезмерно жадным». Такой привлекательный и красивый Meteor исключен из списка, оказавшись просто пустым звуком.
VARIABLE VALUE REDUCED COST
QTY(ROCKET) 96.00000 -30.00000
QTY(METEOR).0000000 -45.00000
QTY(STREAK) 195.0000 -24.00000
QTY(COMET).0000000 -26.00000
QTY(JET) 191.0000 -24.00000
QTY(BIPLANE) 94.00000 -30.00000
BUILD(ROCKET) 1.000000 35.00000
BUILD(METEOR).0000000 20.00000
BUILD(STREAK) 1.000000 60.00000
BUILD(COMET).0000000 70.00000
BUILD(JET) 1.000000 75.00000
BUILD(BIPLANE) 1.000000 30.00000
ROW SLACK OR SURPLUS DUAL PRICE
MAX 14764.00 1.000000
Дата добавления: 2015-11-16; просмотров: 89 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Обобщенные целочисленные переменные | | | Освобожденные» переменные и простые границы |