Текст подпрограммы и версий mnr3r_c.zip |
Тексты тестовых примеров tmnr3r_c.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.
int mnr3r_c (real *x, real *xs, real *a, shortint *na, real *b, real *c__, shortint *nc, integer *m, integer *n, real *y, real *z__, real *zs, integer *s, integer *ny, integer *nx, real *dif, real *eps)
Параметры
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_c - | подпрограмма внесения в шкалу 1; |
utmn12_c - | подпрограмма внесения в шкалу 0; |
utmn13_c - | подпрограмма проверки значения в j - ой позиции шкалы. |
Замечания по использованию
Используются служебные подпрограммы mnr3d_c, mnr3c_c, mnr3l_c, mnr3m_c, mnr3n_c, mnr3o_c, mnr3t_c, mnr3y_c, mnr3z_c. Компактное хранение исходной информации, информации о решении и рабочих векто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)int main(void) { /* Initialized data */ static float b[8] = { 2.f,2.f,2.f,2.f,-1.f,-1.f,-1.f,-1.f }; static float c__[6] = { 1.f,1.f,1.f,1.f,1.f,1.f }; static shortint nc[6] = { 4,4,4,4,4,4 }; static float a[24] = { 1.f,1.f,-1.f,-1.f,1.f,1.f,-1.f,-1.f,1.f,1.f,-1.f, -1.f,1.f,1.f,-1.f,-1.f,1.f,1.f,-1.f,-1.f,1.f,1.f,-1.f,-1.f }; static shortint na[24] = { 1,2,5,6,1,3,5,7,2,3,6,7,1,4,5,8,2,4,6,8,3,4,7, 8 }; static int xs[1] = { 0 }; /* System generated locals */ int i__1; /* Local variables */ extern int mnr3r_c(int *, int *, float *, shortint *, float *, float *, shortint *, int *, int *, float *, float *, float *, int *, int *, int *, float *, float *); static int i__, k, m, n, s, x[1]; static float y[8], z__; extern int utmn13_c(int *, int *, int *); static int ip, nx[6], ny[8]; static float zs, dif[8], eps; m = 8; n = 6; s = 0; eps = 1e-4f; mnr3r_c(x, xs, a, na, b, c__, nc, &m, &n, y, &z__, &zs, &s, ny, nx, dif, &eps); k = 0; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { utmn13_c(&i__, x, &ip); if (ip == 0) { goto l2; } ++k; nx[k - 1] = i__; l2: ; } printf("\n %7.0f \n", z__); printf("\n %5i %5i \n",nx[0], nx[1]); return 0; } /* main */ Результаты: x = (1, 0, 0, 0, 0, 1) z = 2