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

Подпрограмма:  MLC2R (модуль MLC2R_p)

Назначение

Решение задачи линейного целочисленного программирования методом Гомори (полностью целочисленный алгоритм).

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

Для решения задачи

                        n
   max  ( z0  +  ∑   cj (-xj) ) ,    A x ≤ b ,   xj ≥ 0 ,
      x                j=1 

где  c и  x  - целочисленные векторы из En, A - целочисленная матрица порядка  m на n,  b - целочисленный вектоp из Em,  z0 - заданное число, используется полностью целочисленный алгоритм Гомори.

Исходная информация задается в виде расширенной матрицы А порядка (2 + m + n) на (1 + n):

            |   z0       cT   |

            |   0      - E    |
 А  =
           |   b        A     |

           |   o        0 T   | 

где E - единичная матрица порядка  n на n,  0 - нулевой вектор.

Hа каждой итерации метода на месте последней строки матрицы А строится дополнительное целочисленное ограничение, котоpое используется в качестве ведущей строки.

Если решение существует, то оно определяется за конечное число итераций.

Xу T., Целочисленное программирование и потоки в сетях, М., Мир, 1974.

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

procedure MLC2R(var A :Array of Integer; M :Integer;
                N :Integer; var MR :Array of Integer;
                MAX :Integer; EPS :Real; var IERR :Integer);

Параметры

A - заданная целая матрица А порядка (2 + m + n) на  (n + 1);
M - число стpок в матрице А, pавное 2 + m + n (тип: целый);
N - число столбцов в матрице А, pавное  n + 1 (тип: целый);
MR - целый вектоp длины 2M + 2N, используемый в подпрограмме как рабочий;
MAX - заданное целое число (см. замечания по использованию);
EPS - заданная абсолютная погрешность округления вещественного числа до целого (тип: вещественный);
IERR - целая переменная, указывающая причину окончания процесса вычислений:
IERR= 0 - если найдено оптимальное решение;
IERR=65 - если такое решение не существует.

Версии: нет

Вызываемые подпрограммы: нет

Замечания по использованию

  1. 

Используются служебные подпрограммы: MLC21, MLC22, MLC23, MLC24, MLC25, MLC26, MLC27.

  2. 

Задаваемое значение параметра MAX должно быть оценкой свеpху для суммы компонент вектоpа  x, т.е.

                  n
                 ∑  xj ≤ MAX
                 j=1 
  3. 

B процессе вычислений производится округление некоторых вещественных чисел с использованием параметра EPS, 0 < EPS < 0.5. B частности, вещественное число Y заменяется целым K, если ABS (Y - K) ≤ EPS. Выбор конкретного значения параметра EPS во многом определяется коэффициентами условий задачи, однако, обычно EPS берется из интервала (10 - 7, 10 - 4).

  4.  По окончании работы программы элемент A (1, 1) содержит оптимальное значение линейной формы,  n следующих элементов первого столбца - компоненты оптимального вектоpа  x,  m следующих - значения компонент вектоpа  (b - A x)  дополнительных переменных.

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

   Максимизировать       4 x1 + 5 x2 + x3
 при условиях 
                3 x1  +  2 x2            ≤ 10
                   x1  +  4 x2            ≤ 11
                3 x1  +  3 x2  +  x3   ≤ 13 ,

                  x1,  x2,  x3  ≥ 0 ,  целые

                |  0    -4    -5    -1 |
                |  0    -1     0     0  |
                |  0     0    -1     0  |
                |  0     0     0    -1  |
       А  =  | 10     3     2     0  |
                | 11     1     4     0  |
                | 13     3     3     1  |
                |   0     0     0     0  |

Unit TMLC2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, MLC2R_p;

function TMLC2R: String;

implementation

function TMLC2R: String;
var
IERR,I :Integer;
MR :Array [0..23] of Integer;
const
A :Array [0..31] of Integer = ( 0,0,0,0,10,11,13,0,-4,-1,0,0,3,1,3,0,-5,0,-1,0,
2,4,3,0,-1,0,0,-1,0,0,1,0 );
M :Integer = 8;
N :Integer = 4;
МАХ :Integer = 10;
EPS :Real = 0.001;
begin
Result := '';  { результат функции }
MLC2R(A,M,N,MR,MAX,EPS,IERR);
Result := Result + #$0D#$0A;
for I:=1 to 4 do
 begin
  Result := Result + Format('%3d ',[A[(I-1)+0]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TMLC2R',Result);  { вывод результатов в файл TMLC2R.res }
exit;
end;

end.

Результаты:

      max  z   =  A(1, 1)  =  19

             x1  =  A(2, 1)  =  2
             x2  =  A(3, 1)  =  2
             x3  =  A(4, 1)  =  1