Под задачей целочисленного программирования понимается задача, в которой все или некоторые переменные должны принимать целые значения.
В случае, когда ограничения и целевая функция задачи представляют собой линейные зависимости, задачу называют целочисленной задачей линейного программирования. Если хотя бы одна зависимость будет нелинейной, такая задача формулируется как целочисленная задача нелинейного программирования.
Модель целочисленной задачи линейного программирования:
(3.6)
(3.7)
(3.8)
(3.9)
Условие - условие целочисленности. Если n1 = n, то задачу называют полностью целочисленной; если n1 < n, то - частично целочисленной.
В ряде случаев задачу целочисленного программирования решают как непрерывную задачу линейного программирования, т.е. без условия целочисленности. Затем округляют переменные и проверяют допустимость округленного решения. Если решение допустимое, то оно принимается как целочисленное.
При необходимости точного решения применяют специальные методы, где учитывается, что число возможных решений любой целочисленной задачи - конечно. Методы целочисленной оптимизации можно разделить на три основные группы: методы отсечения, комбинаторные методы и приближенные методы.
Метод ветвей и границ
Метод ветвей и границ - один из комбинаторных методов. Идея состоит в разбиении допустимого множества на подмножества (правило ветвления) и вычислении оценок целевой функции на этих подмножествах, которые позволяют исключать из рассмотрения подмножества, заведомо не содержащие оптимальных точек.
Алгоритм решения задачи методом ветвей и границ
Шаг 1. Задача линейного программирования решается без учета целочисленности. Если все компоненты оптимального плана целые, то он является оптимальным планом.
Шаг 2. Далее рассматривают одну из переменных xj, на которую накладывают ограничение целочисленности, но которая получила дробное значение. На основе полученного решения составляют дополнительные ограничения:
хj ≤ [хj*] и хj ≥ [хj*] + 1,
где [хj*] - целая часть нецелочисленного значения переменной хj в оптимальном решении.
Шаг 3. Из исходной задачи формируются две задачи линейного программирования, в каждую из которых вошли все исходные ограничения и одно из дополнительных.
Шаг 4. Полученное решение новых задач проверяют на целочисленность переменных. Если решение не удовлетворяет требованию целочисленности, на основе каждой из задач составляют, аналогично предыдущим, две новые и т. д.
Если одно из решений удовлетворяет требованию целочисленности, значение целевой функции принимается за граничное . При этом рассмотрение других задач продолжается до тех пор, пока не будет получено:
- на одной из ветвей недопустимое решение;
- на одной из ветвей целочисленное решение. Тогда значение целевой функции сравнивается с (верхним - при max, нижним - при min); если полученное значение хуже, оно отбрасывается; если лучше, то принимается за граничное;
- на одной из ветвей нецелочисленное решение, однако при этом значение целевой функции хуже граничного. Тогда дальнейшее рассмотрение также прекращается.
На первом цикле расчета