Текст подпрограммы и версий ( Фортран ) ml02r.zip |
Тексты тестовых примеров ( Фортран ) tml02r.zip |
Текст подпрограммы и версий ( Паскаль ) ml02r_p.zip |
Тексты тестовых примеров ( Паскаль ) tml02r_p.zip |
Решение задачи линейного программирования модифицированным симплекс - методом. Матрица условий хранится компактно.
Решается задача линейного программирования:
min (c,x) ( или max (c,x) ) , A x = b , x ≥ 0 ,
где A - матрица размерности m на n, x и c - векторы длины n, b - вектоp длины m.
Используется модифицированный симплекс - метод. Исходная информация задается в компактной форме. Ненулевые элементы матрицы условий задаются в виде одномерного массива A, каждый элемент которого содержит очередной (по столбцам) ненулевой элемент ai j матрицы .
Номера строк ненулевых элементов матрицы условий задаются в целочисленном массиве NS в том же порядке, в котором перечислены сами ненулевые элементы. Т.е., если ai j ≠ 0 и A (K) = ai j, то NS (K) = 1.
Вектоp T длины n содержит запись коэффициентов линейной формы т.е. в T (J) помещается коэффициент Cj, Вектор NT длины N содержит количества ненулевых элементов в столбцах матрицы A. Т.е., NT (K) = L означает, что в k - м столбце матрицы содержится L ненулевых элементов.
Введен вспомогательный вектоp SUM длины n с компонентами SUМ j = - (a1 j +...+ am j), где ai j - элементы матрицы А. Вектоp b дополняется двумя компонентами bm+1 = 0, bm + 2 = - (b1 +...+ bm).
Точность вычислений характеризуется величиной невязки r = bm + 2 - (SUM, x).
С.Гасс, Линейное программирование, Физматгиз, 1961.
SUBROUTINE ML02R (A, DA, U, M, T, N, SUM, NSUM, NT, NS, X, P, EPS, XK,NX)
Параметры
A - | вещественный одномерный массив размерности DA, содержащий ненулевые элементы матрицы условий; |
DA - | число ненулевых элементов матрицы условий (тип: целый); |
U - | двумерный рабочий массив размерности m + 2 на m + 2 (тип: вещественный); |
M - | длина расширенного вектоpа b, т.е. M = m + 2 (тип: целый); |
T - | вещественный вектоp длины n, содержащий коэффициенты линейной формы ; |
N - | число столбцов матрицы условий (тип: целый); |
SUM - | вещественный вектоp длины n сумм элементов матрицы по столбцам с обратным знаком; |
NSUM - | одномерный целый рабочий массив длины [(N + 15)/16] (тип; целый); |
NT - | двубайтовый целый вектор длины N, содержащий количества ненулевых элементов в столбцах матрицы условий; |
NS - | двубайтовый целый вектор длины DA, содержащий номера строк матрицы A, в которых находятся ненулевые элементы; |
X - | вещественный вектоp длины M, при этом на входе X (I) = bI, I = 1,..., M; на выходе X (I) - ненулевые компоненты решения, X (M - 1) - минимальное (или максимальное) значение линейной формы, X (M) - величина невязки r; |
P - | целая переменная, при обращении к подпрограмме задается равной 1, если требуется найти максимум линейной формы, и не равной 1 в противном случае; на выходе: |
P= 1 - | если найдено решение, |
P= 2 - | если задача несовместна, |
P= 3 - | если значение линейной формы неограничено; |
EPS - | заданная абсолютная погрешность вычислений (тип: вещественный); |
XK - | вещественный рабочий вектоp длины M. |
NX - | целый массив (двубайтовый) длины M; на выходе содержит номера ненулевых компонент решения. |
Версии: нет
Вызываемые подпрограммы
UTMN11 - | подпрограмма занесения единицы в заданную позицию двоичной шкалы; |
UTMN12 - | подпрограмма занесения нуля в заданную позицию двоичной шкалы; |
UTMN13 - | подпрограмма проверки значений заданной позиции шкалы. |
Замечания по использованию
Задача должна быть приведена к виду, в котоpом компоненты вектоpа b неотрицательны. На выходе из подпрограммы номера элементов X (I) масссива X (I = 1,..., M - 2) находятся в массиве NX, так что xNX (I) = X (I). Остальные N - M компонент решения равны нулю. Используются служебные подпрограммы: MLU01, MLU05, MLU06, MLU07, MLU11, MLU12, MLU13, MLU14, MLU15, MLU16, MLU17, MLU34. Компактное хранение матрицы позволяет решать задачи большей размерности, но M ≤ 255. Подпрограмма рекомендуется для использования, когда матрица условий A является редкой, т.е. содержит много нулевых элементов. |
INTEGER P, NSUM(1) INTEGER*2 NX(5), NT(4), NS(10) REAL A(10), SUM(4), X(5), XK(5), T(4), U(5, 5) DATA A /1, 2, 1., 2., 1., 2., 3., 5., 1., 1./ DATA NS /1, 2, 3, 1, 2, 3, 1, 2, 3, 3/ DATA T /1., 2., 3., -1./ DATA NT /3, 3, 3, 1/ DATA SUM /-4., -5., -9., -1./ DATA X /15., 20., 10., 0., -45./ P = 1 M = 5 N = 4 EPS = 0.01 CALL ML02R (A, 10, U, M, T, N, SUM, NSUM, NT, NS, X, P, * EPS, XK, NX) Результаты: X = ( 2.5, 2.5, 2.5, 15., -0.00 ) NX = ( 2, 3, 1 ) Таким образом, x = ( 2.5, 2.5, 2.5, 0.0 ) (c, x) = 15.0 r = 0.0