Текст подпрограммы и версий ( Фортран ) mlc6r.zip |
Тексты тестовых примеров ( Фортран ) tmlc6r.zip |
Текст подпрограммы и версий ( Си ) mlc6r_c.zip |
Тексты тестовых примеров ( Си ) tmlc6r_c.zip |
Текст подпрограммы и версий ( Паскаль ) mlc6r_p.zip |
Тексты тестовых примеров ( Паскаль ) tmlc6r_p.zip |
Решение задачи целочисленного линейного программирования с булевыми переменными методом вектора спада
Решается задача N min ∑ cj x j , j =1 n ∑ ai j x j = bj , i = 1, ..., Q j =1 n ∑ ai j x j ≤ bj , i = Q + 1, ..., M , j =1 x j = 0 или 1 ( j = 1,...,N ) , где c = ( c1, ... , cN ) - целый вектор длины N , b = ( b1, ... , bM ) - целый вектор длины M , ai j - элементы целочисленной матрицы размеров M на N
Используется метод вектора спада. Исходная информация задается в компактной форме (см.замечания по использованию)
Сергиенко И.В., Лебедев Т.Т., Рощин В.А. "Приближенные методы решения дискретных задач оптимизации", Киев, "Наука думка", 1980.
SUBROUTINE MLC6R (A, B, C, IERR, M, MIN, N, P, Q, UP, X)
Параметры
A - | целый вектор, в котором в упакованном виде хранятся ненулевые элементы матрицы условий, упорядоченные по столбцам; длина вектора A равна количеству ненулевых элементов в матрице условий; |
B - | целый вектор длины M, в котором содержатся коэффициенты вектора ограничений; |
C - | целый вектор длины N, в котором компактно заданы коэффициенты линейной формы и информация о количестве ненулевых элементов в столбцах исходной матрицы; |
IERR - | целая переменная, указывающая причину выхода из подпрограммы |
IERR= 0 - | найден локальный минимум; |
IERR= 5 - | истекло заданное время; |
IERR=65 - | не найдена допустимая точка; |
M - | число строк в матрице условий, т.е. общее количество ограничений (тип: целый); |
MIN - | целая переменная, содержащая на выходе наименьшее найденное значение линейной формы (если была найдена допустимая точка); |
N - | длина вектора X (тип: целый); |
P - | целый рабочий вектор длины M; |
Q - | количество ограничений - равенств (тип: целый); |
UP - | вещественный вектор управляющих параметров длины 2: |
UP(1) - | время, отведенное центральному процессору на решение задачи, задается пользователем в секундах; на выходе содержит время в секундах, затраченное на решение задачи; |
UP(2) - | признак печати сообщения о завершении работы подпрограммы: |
UP(2)=0. - | печати не будет; |
UP(2)=1. - | будет напечатано сообщение о причине окончания работы подпрограммы; |
X - | целый вектор длины N; при обращении к подпрограмме содержит заданную начальную точку, на выходе - решение задачи, т.е. ту точку, в которой найдено наименьшее значение линейной формы |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Матрица условий должна быть представлена в компактной форме. Ее ненулевые элементы задаются в виде вектора A, каждый элемент которого содержит очередной (по столбцам) ненулевой элемент ai j матрицы условий и номер строки i в виде условного числа ai j * 1000 + i. Количество ненулевых элементов в j - том столбце матрицы задается вместе с j - тым коэффициентом линейной формы в виде условного числа в векторе C. Для упаковки исходной информации можно воспользоваться служебными подпрограммами UTMLCN и UTMLCI. SUBROUTINE UTMLCN (I, AI) Упаковывает два целых числа I, AI, где I < 1000, в одно условное целое число AI * 1000 + I. На выходе параметр AI содержит требуемое условное число. SUBROUTINE UTMLCI (A1, NA1, A) Упаковывает попарно массив целых чисел. На входе: A1 - массив целых чисел вида ..., I, AI, ... , предназначенных для попарной упаковки; NA1 - длина массива A1. На выходе: A - массив, состоящий из условных целых чисел, полученных после упаковки. Для проверки правильности задания входной информации можно воспользоваться подпрограммой UTMLC1, которая распечатывает упакованную матрицу условий: SUBROUTINE UTMLC1 (A, NA, C, N) Входные параметры: Если из заданной начальной точки допустимая точка не будет
найдена, рекомендуется взять другую начальную точку. |
Найти минимальное значение функции (C, X) = - x1 - 2x2 - 3x3 - 4x4 при условиях x1 + x2 + x3 + x4 = 2 x1 + x2 + x3 + x4 ≤ 4 , где все x j = 0 или 1 , j = 1, 2, 3, 4 . Начальное приближение X = (0, 0, 0, 0) . INTEGER A, A1, B, C, C1, N, M, Q, P, X, NOM, AN REAL UP DIMENSION A(8), A1(16), B(2), C(4), C1(8), P(2), UP(2), X(4) DATA A1 /1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1/ DATA C1 /2, - 1, 2, - 2, 2, - 3, 2, - 4/ DATA B, N, M, Q /2, 4, 4, 2, 1/ DATA X /4*0/ DATA UP /600., 1./ CALL UTMLCI (A1, 16, A) CALL UTMLCI (C1, 8, C) 10 CONTINUE CALL UTMLC1 (A, 8, C, 4) CALL MLC6R (A, B, C, IERR, M, MIN, N, P, Q, UP, X) END Результаты счета: Подпрограмма MLC6R, библиотека НИВЦ МГУ MIN = - 7 X = 0011