|
Текст подпрограммы и версий ml01r_c.zip |
Тексты тестовых примеров tml01r_c.zip |
Решение задачи линейного программирования модифицированным симплекс - методом.
Решается задача линейного пpoгpaммирования:
min (c, x) ( или max (c, x) ) ,
A x = b ,
x ≥ 0 ,
где A - матрица размерности m на n, x и c - векторы длины n, b - вектоp длины m.
Используется модифицированный симплекс - метод. Исходная информация задается в виде расширенной матрицы | a11 a12 . . . a1n
| . . . . . . . . . . . . . . . . . . . . . .
A1 = | am1 am2 . . . amn
| c1 c2 . . . cn
| am+2,1 am+2,2 . . . am+2,N
где ai j ( i = 1, ... , m ; j = 1, ... , n ) - элементы матрицы A ,
am+2, j = - ( a1 j + a2 j + ... + am j ) для j = 1, ... , n .
Вектоp b дополняется двумя компонентами bm + 1 = 0, bm + 2 = - (b1 + ... + bm).
Точность вычислений характеризуется величиной невязки
r = bm+2 - ∑ am+2, j x j
j
С.Гасс, Линейное программирование, Физматгиз, 1961.
int ml01r_c (real *a, integer *m, real *u, integer *n, real *x,
integer *nb, integer *p, real *eps, real *xk)
Параметры
| a - | вещественный двумерный массив размерности m + 2 на n, содержащий элементы расширенной матрицы A1; |
| m - | число стpок матрицы A1 (тип: целый); |
| u - | рабочий массив размерности m на m (тип: вещественный); |
| n - | число столбцов матрицы A1 (тип: целый); |
| x - |
вещественный вектоp длины m, при этом на входе
x (i) = bi,
i = 1, ..., m, на выходе для
i = 1, ... , m - 2 ; x (i) - ненулевые компоненты решения, x (m - 1) - минимальное (или максимальное) значение линейной формы, x (m) - величина невязки r; |
| nb - | вектоp длины m, содержащий номеpа ненулевых компонент решения т.е. xnb (i) = x (i) для i = 1, ... , m - 2 (тип: целый); |
| p - | целая переменная, при обращении к подпрограмме задается равной 1, если требуется найти максимум линейной формы, и не равной 1, в противном случае; на выходе: |
| p = 1 - | если найдено решение, |
| p = 2 - | если задача несовместна, |
| p = 3 - | если значение линейной формы неограничено; |
| eps - | заданная абсолютная погрешность вычислений (тип: вещественный); |
| xk - | вещественный рабочий вектоp длины m. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Задача должна быть приведена к виду, в котоpом компоненты вектоpа b неотрицательны. Подпрограмма рекомендуется для использования, если матрица A содержит много ненулевых элементов. Подпрограмма ml01r_c использует служебные подпрограммы mlu01_c, mlu02_c, mlu03_c, mlu04_c, mlu05_c, mlu06_c, mlu07_c, mlu08_c, mlu09_c, mlu10_c. |
int main(void)
{
/* Initialized data */
static float a[20] /* was [5][4] */ = { 1.f,2.f,1.f,1.f,-4.f,2.f,1.f,2.f,
2.f,-5.f,3.f,5.f,1.f,3.f,-9.f,0.f,0.f,1.f,-1.f,-1.f };
static float x[5] = { 15.f,20.f,10.f,0.f,-45.f };
static int nb[5] = { 0,0,0,0,0 };
static int p = 1;
static int m = 5;
static int n = 4;
static float eps = .01f;
/* Local variables */
extern int ml01r_c(float *, int *, float *, int *, float *, int *,
int *, float *, float *);
static float u[25] /* was [5][5] */, xk[5];
ml01r_c(a, &m, u, &n, x, nb, &p, &eps, xk);
printf("\n %5i \n", p);
printf("\n %12.2f %12.2f %12.2f %12.2f %12.2f \n",
x[0], x[1], x[2], x[3], x[4]);
printf("\n %5i %5i %5i %5i %5i \n",
nb[0], nb[1], nb[2], nb[3], nb[4]);
return 0;
} /* main */
Результаты:
x = ( 2.5, 2.5, 2.5, 15., -0.00 )
nb = ( 2, 3, 1 )
p = 1
то есть решение x = ( 2.5, 2.5, 2.5, 0. )
(c, x) = 15.0
невязка r = 0.00