
- •Глава 7. Целочисленное программирование
- •7.1. Проблема целочисленности
- •X1, x2 0, int (целые).
- •7.2. Метод отсечений
- •Пример 7.1. Выведем условие отсечения для задачи
- •X1, x2 0, целые.
- •7.3. Метод ветвей и границ
- •7.4. Аддитивный алгоритм
- •7.5. Другие методы
- •7.6. Задания для самостоятельной работы
Глава 7. Целочисленное программирование
Целочисленное программирование (ЦП) – это наиболее важный раздел дискретного программирования. Задачи дискретного программирования отличаются тем, что на переменные накладывается требование дискретности, в частном случае – целочисленности. В качестве примеров можно привести задачи о раскрое (разд. 4.11.5), о ранце, коммивояжера и др.
Характерные источники целочисленности (дискретности):
неделимость объектов, представляемых переменными (например, x – число рабочих или отправляемых вагонов);
вариантность типа “да-нет” (например, включать или нет данный пакет в портфель ценных бумаг);
заданность возможных значений нормативными документами (например, сечения проводов, диаметров труб, размеров профилей и т.п.);
комбинаторность (например, размещение объектов, порядок обхода объектов, упорядочение);
логические условия (например, фиксированные затраты имеют место только при производстве продукции).
Различают задачи полностью целочисленные/дискретные и частично целочисленные (смешанные). В последних требование целочисленности накладывается не на все переменные.
Любой ряд дискретных значений может быть представлен линейной комбинацией целочисленных переменных. Поэтому дискретная задача легко сводится к целочисленной за счет значительного увеличения числа переменных.
В этой главе рассматриваются только линейные целочисленные задачи.
7.1. Проблема целочисленности
На первый взгляд может показаться, что целочисленная задача решается проще непрерывной. При малой размерности и узких диапазонах переменных задачу можно решить простым перебором. В других случаях необходимы соответствующие методы.
Несмотря на линейность модели допустимое множество целочисленной задачи не является выпуклым. Так, в полностью целочисленной задаче оно представляет собой множество отдельных точек, имеющих целочисленные координаты. Методы линейного программирования базируются на
выпуклости допустимого множества и поэтому непосредственно не могут быть применимы к целочисленным задачам.
Можно, конечно, пренебречь требованием целочисленности и использовать один из методов ЛП, но тогда, за редким исключением, результат не будет целочисленным. Округление дробных значений переменных проблематично. Действительно, так как оптимальное решение непрерывной задачи лежит в вершине допустимого множества, округление может привести к недопустимости. При двух дробных переменных имеется 4, а при n переменных – 2n вариантов округления! Какие из них дают допустимые решения, можно определить только после проверки всех ограничений. При этом следует иметь в виду, что, во-первых, целочисленная задача может оказаться неразрешимой несмотря на разрешимость непрерывной задачи; во-вторых, допустимость округленного решения еще не означает его оптимальность. Проиллюстрируем последний тезис известной задачей о садовнике.
По расчетам садовника требуется внести в почву комплексные удобрения в количестве 107 кг. Удобрения продаются только в расфасованном виде: 1) мешок весом 35 кг стоит 140 руб.; 2) мешок весом 24 кг стоит 120 руб. Необходимо определить вариант закупки удобрений с минимальными затратами.
Запишем модель задачи:
L=140x1+120x2min;
35x1+24x2 107;