Текст подпрограммы и версий mnr3r_p.zip |
Тексты тестовых примеров tmnr3r_p.zip |
Решение задачи линейного целочисленного программирования с булевыми переменными методом Балаша.
Для решения задачи min < c, x >, Ax ≤ b, xi = 0 или 1 ( i = 1, ..., n), где c и x - векторы длины n, A - матрица m * n, b - вектоp длины m, используется метод Балаша с модификацией Джеофриона. Исходная информация задается в компактной форме.
Ненулевые элементы матрицы задаются в виде одномерного массива, каждый элемент которого содержит очередной (по столбцам) ненулевой элемент ai j матрицы A. Номера строк ненулевых элементов матрицы условий задаются в целочисленном массиве NA в том же порядке, в котором перечислены сами ненулевые элементы, т.е. если ai j ≠ 0 и A (I) = ai j, то NA (I) = i.
Вектоp C длины n содержит запись коэффициентов линейной формы, т.е. в C (J) помещается коэффициент Cj. Вектор NC длины N содержит количества ненулевых элементов в столбцах матрицы A, т.е. NC (k) = α означает, что в k - ом столбце матрицы содержится α ненулевых элементов.
Информация о ненулевых компонентах решения хранится в виде шкалы в массиве X, причем разряды шкалы упорядочены справа налево и от первого элемента шкалы к последнему.
Geoffrion A.M., Integer Programming by Implicit Enumeration and Balas'Method. SIAM Review Vol.9, No.2, April, 1967.
procedure MNR3R(var X :Array of Integer; var XS :Array of Integer; var A :Array of Real; var NA :Array of Integer; var B :Array of Real; var C :Array of Real; var NC :Array of Integer; M :Integer; N :Integer; var Y :Array of Real; var Z :Real; var ZS :Real; S :Integer; var NY :Array of Integer; var NX :Array of Integer; var DIF :Array of Real; EPS :Real);
Параметры
X - | целый вектор, в котоpом подпрограмма формирует информацию о ненулевых компонентах решения в виде шкалы длины, равной [(N + 15)/16]; |
XS - | целый вектоp длины [(N + 15)/16], используемый в подпрограмме как рабочий; |
A - | вещественный вектоp, в котоpом содержатся в компактном виде ненулевые коэффициенты матрицы условий; длина вектоpа A pавна количеству ненулевых элементов в матрице условий; |
NA - | двубайтовый целый вектоp, содержащий номера строк матрицы A, в которых находятся ненулевые элементы; длина вектора NA равна количеству ненулевых элементов в матрице условий; |
B - | вещественный вектоp длины M, в котоpом заданы элементы вектоpа правых частей; |
C - | вещественный вектоp длины N, в котоpом заданы коэффициенты линейной формы; |
NC - | двубайтовый целый вектор длины N, содержащий число ненулевых элементов матрицы условий по столбцам; |
M - | длина вектоpа B (тип: целый); |
N - | длина вектоpа C (тип: целый); |
Y - | вещественный вектоp длины M, используемый в подпрограмме как рабочий; |
Z - | вещественная переменная, содержащая на выходе оптимальное значение линейной формы; |
ZS - | вещественная переменная, содержащая значение линейной формы текущего решения (см. замечания по использованию); |
S - | целая переменная, содержащая количество фиксированных компонент текущего решения (см. замечания по использованию); |
NY - | целый вектоp длины M, используемый в подпрограмме как рабочий; |
NX - | целый вектоp длины N, используемый в подпрограмме как рабочий; |
DIF - | вещественный вектоp длины M, используемый в подпрограмме как рабочий; |
EPS - | заданная абсолютная точность вычислений (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы
UTMN11 - | подпрограмма внесения в шкалу 1 . |
UTMN12 - | подпрограмма внесения в шкалу 0 . |
UTMN13 - | подпрограмма проверки значения в J - ой позиции шкалы. |
Замечания по использованию
Используются служебные подпрограммы MNR3E, MNR3C, MNR3L, MNR3M, MNR3N, MNR3O, MNR3T, MNR3Y, MNR3Z. Компактное хранение исходной информации, информации о решении и рабочих вектоpах позволяет решать задачи больших размеров. Компоненты вектоpа C должны быть неотрицательными. Если ci < 0, надо сделать замену переменных: xi = 1 - xi. Если известно допустимое решение, то перед обращением к
подпрограмме следует сформировать шкалу,
соответствующую этому допустимому решению в массиве XS; номеpа
переменных, входящих в допустимое решение со значениями
1, перечислить в первых S ячейках массива NX и задать
значение S - количество единиц в допустимом решении. |
Найти G min ∑ xi i =1 при условиях: x1 + x2 + x4 ≤ 2 x1 + x3 + x5 ≤ 2 x2 + x3 + x6 ≤ 2 x4 + x5 + x6 ≤ 2 - x1 - x2 - x4 ≤ - 1 - x1 - x3 - x5 ≤ - 1 - x2 - x3 - x6 ≤ - 1 - x4 - x5 - x6 ≤ - 1 xi = 0 или 1 ( i = 1, ..., 6)Unit TMNR3R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, MNR3R_p, UTMN13_p; function TMNR3R: String; implementation function TMNR3R: String; var М,N,S,K,I,IP :Integer; Z,ZS,EPS :Real; DIF :Array [0..7] of Real; Y :Array [0..7] of Real; NY :Array [0..7] of Integer; NX :Array [0..5] of Integer; Х :АRray [0..0] of Integer; const B :Array [0..7] of Real = ( 2.0,2.0,2.0,2.0,-1.0,-1.0,-1.0,-1.0 ); C :Array [0..5] of Real = ( 1.0,1.0,1.0,1.0,1.0,1.0 ); NC :Array [0..5] of Integer = ( 4,4,4,4,4,4 ); A :Array [0..23] of Real = ( 1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,1.0, -1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0, 1.0,-1.0,-1.0 ); NA :Array [0..23] of Integer = ( 1,2,5,6,1,3,5,7,2,3,6,7,1,4,5,8,2,4,6,8,3,4,7,8 ); XS :Array [0..0] of Integer = ( 0 ); label _2; begin Result := ''; { результат функции } M := 8; N := 6; S := 0; EPS := 0.1E-03; MNR3R(X,XS,A,NA,B,C,NC,M,N,Y,Z,ZS,S,NY,NX,DIF,EPS); K := 0; for I:=1 to N do NX[I-1] := 0; for I:=1 to N do begin UTMN13(I,X,IP); NX[I-1] := IP; _2: end; Result := Result + Format('%s',[' Z=']); Result := Result + Format('%20.16f ',[Z]); Result := Result + Format('%s',[' NX=']); Result := Result + #$0D#$0A; for I:=1 to N do begin Result := Result + Format('%3d ',[NX[I-1]]) + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TMNR3R',Result); { вывод результатов в файл TMNR3R.res } exit; end; end. Результаты: X = (1, 0, 0, 0, 0, 1) Z = 2