Текст подпрограммы и версий
ml01r_p.zip
Тексты тестовых примеров
tml01r_p.zip

Подпрограмма:  ML01R (модуль ML01R_p)

Назначение

Решение задачи линейного программирования модифицированным симплекс - методом.

Математическое описание

Решается задача линейного программирования:

           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.

Использование

procedure ML01R(var A :Array of Real; M :Integer;
                var U :Array of Real; N :Integer;
                var X :Array of Real; var NB :Array of Integer;
                var P :Integer; EPS :Real; var XK :Array of Real);

Параметры

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 использует служебные подпрограммы MLU01, MLU02, MLU03, MLU04, MLU05, MLU06, MLU07, MLU08, MLU09, MLU10.

Пример использования

Unit TML01R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ML01R_p;

function TML01R: String;

implementation

function TML01R: String;
var
_i :Integer;
ХК :Array [0..4] of Real;
U :Array [0..24] of Real;
const
A :Array [0..19] of Real = ( 1.0,2.0,1.0,1.0,-4.0,2.0,1.0,2.0,2.0,-5.0,3.0,
5.0,1.0,3.0,-9.0,0.0,0.0,1.0,-1.0,-1.0 );
X :Array [0..4] of Real = ( 15.0,20.0,10.0,0.0,-45.0 );
NB :Array [0..4] of Integer = ( 0,0,0,0,0 );
P :Integer = 1;
M :Integer = 5;
N :Integer = 4;
EPS :Real = 0.01;
begin
Result := '';  { результат функции }
ML01R(A,M,U,N,X,NB,P,EPS,XK);
Result := Result + Format('%s',[' P=']);
Result := Result + Format('%3d ',[P]);
Result := Result + Format('%s',[#$0D#$0A + ' X=']);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
 begin
  Result := Result + Format('%20.16f ',[X[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[#$0D#$0A + ' NB=']);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
 begin
  Result := Result + Format('%6d ',[NB[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TML01R',Result);  { вывод результатов в файл TML01R.res }
exit;
end;

end.

Результаты:

       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