Текст подпрограммы и версий mlogr_c.zip |
Тексты тестовых примеров tmlogr_c.zip |
Решение задачи линейного программирования с двусторонними ограничениями на переменные модифицированным симплекс - методом с мультипликативным представлением обратной матрицы и с пересчетами.
Решается задача линейного пpoгpaммирования
min (c,x) ( или max (c,x) ) A x = b , 0 ≤ x ≤ α ≤ +∞ ,
где A - матрица размерности m * n, x, c, α - векторы длины n, b - вектоp длины m.
Используется модифицированный симплекс - метод с мультипликативным представлением обратной матрицы и с пересчетами мультипликаторов. Процедура пересчета элементарных матриц - мультипликаторов предназначена для эффективного использования оперативной памяти ЭВМ и осуществляется при выполнении заданного числа итераций, либо при заполнении участка оперативной памяти, отведенной для хранения мультипликаторов.
Информация о задаче задается в следующем виде:
Матрица условий A задается в трех массивах:
- в одномерном массиве A последовательно помещаются
ненулевые элементы матрицы по столбцам;
- в одномерном массиве NSA записываются номера строк
соответствующих ненулевых элементов;
- в массиве NTAB указывается количество ненулевых элементов
в каждом столбце матрицы.
Вектор C содержит коэффициенты линейной формы.
Вектор ограничений b задается в массиве B.
Выходными параметрами подпрограммы являются:
вещественная переменная F - оптимальное значение
линейной формы;
вещественный вектор RM после окончания
счета, содержащий в первых N ячейках компоненты решения;
и целая переменная IERR, указывающая причину окончания счета.
Вводится в рассмотрение расширенный вектор ограничений b длины M = m + 2, у которого b = bi для i = 1, ..., m, bM - 1 = 0, bM = - (b1 + ... + bm).
Точность вычислений характеризуется величиной невязки
n
r = bM - ∑ Sj x j , где Sj = - ( ai j + ... + am j ) .
j =1
С.Гасс, Линейное программирование, Физматгиз, M., 1961.
Г.Зойтендейк, Методы возможных направлений. Изд - во ИЛ, M., 1963.
int mlogr_c (integer *m, integer *n, integer *prp, real *a, shortint *nsa, shortint *ntab, real *alfa, shortint *nalfa, integer *kv, real *b, real *c, integer *lb, real *eps, integer *mnmx, real *f, shortint *im, real *rm, integer *ierr)
Параметры
m - | число строк расширенной матрицы (тип: целый); |
n - | число столбцов в матрице условий (тип: целый); |
prp - | целая переменная, задающая число итераций метода, через которое делается пересчет мультипликаторов (см. замечания по использованию); |
a - | вещественный вектор, задающий ненулевые элементы матрицы по столбцам; |
nsa - | массив индексов строк для соответствующих ненулевых элементов (тип: integer * 2); |
ntab - | вектор длины n - таблица ненулевых элементов матрицы по столбцам (тип: integer * 2); |
alfa - | вещественный вектоp длины kv, содержащий отличные от + ∞, компоненты вектора верхних ограничений α; |
nalfa - | массив номеров отличных от + ∞, компонент вектора верхних ограничений α (тип: integer * 2); |
kv - | количество отличных от + ∞ верхних ограничений на переменные (тип: целый); |
b - | вещественный вектор длины m содержащий ограничения; |
c - | вещественный вектоp длины n, содержащий коэффициенты линейной формы; |
lb - | целая переменная, задающая объем свободной оперативной памяти (см. замечания по использованию); |
eps - | вещественная переменная, задающая точность вычисления оптимального плана; |
mnmx - | целая переменная, задающая признак оптимизации: |
mnmx=0, | если задача поставлена на минимум; |
mnmx=1, | если - на максимум, |
f - | вещественная переменная, содержащая оптимальное значение линейной формы; |
im - | рабочий массив длины (1 + 6m + 2n + lb) (тип: integer * 2); |
rm - | вещественный рабочий массив длины (1 + 4m + n + lb), после окончания счета в первых n ячейках стоит решение; |
ierr - | целая переменная служащая для сообщения о причине окончания счета: |
ierr= 0 - | получено оптимальное решение; |
ierr=65 - | задача несовместна; |
ierr=66 - | линейная форма неограничена. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Задача должна быть приведена к виду, в котоpом компоненты вектоpа b неотрицательны. Вектор верхних ограничений на переменные α не должен содержать нулевых компонент и хотя бы одна его компонента должна быть отлична от + ∞. Процедура пересчета элементарных матриц предназначена
для эффективного использования оперативной памяти.
Обычно для хранения элементарных матриц используется
вся свободная память (lb). Число prp рекомендуется
выбрать равным 3m/2, где m - число ограничений задачи.
Выбор момента пересчета элементарных матриц осуществляется
программой. Пересчет производится при выполнении хотя бы
одного из условий: При определении lb следует иметь ввиду, что программа использует (2 + 8 * m + 4,5 * n + 1,5 * z) ячеек памяти без учета массива элементарных матриц, где z - количество ненулевых элементов в матрице условий. Длина входных векторов a и nsa должна быть не меньше z. После работы подпрограммы изменяются: |
max [(c, x) = x1 + 2x2 + 3x3 - x4 ] , x1 + 2x2 + 3x3 = 15 , 2x1 + x2 + 5x3 = 20 , x1 + 2x2 + x3 + x4 = 10 , 0 ≤ x1 ≤ 2 , 0 ≤ x2 , 0 ≤ x3 ≤ 3 , 0 ≤ x4 .int main(void) { /* Initialized data */ static float a[10] = { 1.f,2.f,1.f,2.f,1.f,2.f,3.f,5.f,1.f,1.f }; static int prp = 6; static int kv = 2; static int mnmx = 1; static int lb = 30; static float eps = .01f; static float alfa[2] = { 2.f,3.f }; static float b[5] = { 15.f,20.f,10.f,0.f,0.f }; static float c__[4] = { 1.f,2.f,3.f,-1.f }; static shortint nalfa[2] = { 1,3 }; static shortint nsa[10] = { 1,2,3,1,2,3,1,2,3,3 }; static shortint ntab[4] = { 3,3,3,1 }; static int m = 5; static int n = 4; /* Local variables */ static int ierr; static float f; extern int mlogr_c(int *, int *, int *, float *, shortint *, shortint *, float *, shortint *, int *, float *, float *, int *, float *, int *, float *, shortint *, float *, int *); static shortint im[69]; static float rm[55]; mlogr_c(&m, &n, &prp, a, nsa, ntab, alfa, nalfa, &kv, b, c__, &lb, &eps, &mnmx, &f, im, rm, &ierr); /* l300: */ printf("\n %10.5f %10.5f %10.5f %10.5f \n", rm[0], rm[1], rm[2], rm[3]); return 0; } /* main */ Результаты: ierr = 0 Значение линейной формы f = 14.571 Решение 2.0000 2.42857 2.71428 0.42857