|
Текст подпрограммы и версий mlc3r_c.zip |
Тексты тестовых примеров tmlc3r_c.zip |
Решение задачи линейного целочисленного программирования модифицированным методом Гомори (полностью целочисленный алгоритм с компактным хранением исходной информации).
Для решения задачи
n
max ( z0 + ∑ cj (-xj) ) , A x ≤ b , xj ≥ 0 ,
j=1
где c и x - целочисленные векторы из En, A - целочисленная матрица порядка m на n, b - целочисленный вектоp из Em, z0 - заданное число, используется полностью целочисленный алгоритм Гомори. Исходная информация задается в компактной форме.
Ненулевые элементы матрицы условий A задаются в виде одномерного массива IA, каждый элемент которого содержит очередной (по стpокам) ненулевой элемент ai j матрицы A и номер столбца j в виде условного числа ai j * 103 + j.
Количество ненулевых элементов в i - ой стpоке матрицы задается в i - ой компоненте вектоpа KV длины m.
Руднева Т.Л., Яранов М.Г. Программная реализация полностью целочисленного алгоритма Гомори. В сб. "Математические вопросы задач оптимизации и управления", M., МГУ, 1981.
int mlc3r_c (integer *lia, integer *m, integer *n, integer *ia,
integer *kv, integer *x, integer *c, integer *z, integer *max,
integer *b, integer *mr, real *eps, integer *ierr)
Параметры
| lia - | число ненулевых элементов в матрице A (тип: целый); |
| m - | число стpок в матрице A (тип: целый); |
| n - | число столбцов в матрице A (тип: целый); |
| ia - | заданный целый вектоp длины lia, содержащий ненулевые элементы исходной матрицы A по стpокам в виде условных чисел; |
| kv - | заданный целый вектоp длины m, содержащий количество ненулевых элементов матрицы A по стpокам; |
| x - | целый вектоp длины n + m (см. замечания по использованию); |
| c - | заданный целый вектоp длины n, содержащий коэффициенты линейной формы; |
| z - | целая переменная; на входе содержит заданное значение z0, на выходе - оптимальное значение целевой функции; |
| max - | заданная оценка свеpху на сумму компонент вектоpа x (тип: целый); |
| b - | целая матрица n на n, используемая в подпрограмме как рабочая; |
| mr - | целый вектоp длины 4 + 5n + 2 max (n, m), используемый в подпрограмме как рабочий; |
| eps - | заданная абсолютная точность округления вещественного числа до целого (тип: вещественный); |
| ierr - | целая переменная, указывающая причину окончания процесса вычислений: |
| ierr= 0 - | если найдено оптимальное решение; |
| ierr=65 - | если решения не существует. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
Используются служебные подпрограммы: mlc32_c, mlc33_c, mlc34_c, mlc35_c, mlc36_c, mlc37_c, mlc38_c, mlc39_c, mlc3a_c, mlc3b_c, mlc3l_c, mlc3m_c, mlc3v_c. | |
| 2. |
Задаваемое значение параметра max должно быть оценкой свеpху для суммы компонент вектоpа x, т.е. n
∑ xj ≤ max
j=1
| |
| 3. |
Hа входе первые n компонент вектоpа x полагаются равными нулю, а следующие m компонент должны содержать коэффициенты вектоpа ограничений b. Hа выходе первые n компонент вектоpа x содержат оптимальное решение задачи, а m последующих - значения дополнительных переменных, т. е. x (n + i) = [b - ax] i, i = 1,..., m. | |
| 4. | B процессе вычислений производится округление некоторых вещественных чисел с использованием параметра eps, 0 < eps < 0.5. b частности, вещественное число y заменяется целым k, если abs (y - k) ≤ eps. Выбор конкретного значения параметра eps во многом определяется коэффициентами условий задачи, однако, обычно eps берется из интервала (10 - 7, 10 - 4). |
Максимизировать 4 x1 + 5 x2 + x3
при условиях
3 x1 + 2 x2 ≤ 10
x1 + 4 x2 ≤ 11
3 x1 + 3 x2 + x3 ≤ 13 ,
x1, x2, x3 ≥ 0 , целые
int main(void)
{
/* Initialized data */
static int ia[7] = { 3001,2002,1001,4002,3001,3002,1003 };
static int max__ = 19;
static int kv[3] = { 2,2,3 };
static int x[6] = { 0,0,0,10,11,13 };
static int z__ = 0;
static float eps = 1e-4f;
static int c__[3] = { -4,-5,-1 };
static int lia = 7;
static int m = 3;
static int n = 3;
/* Local variables */
static int ierr;
extern int mlc3r_c(int *, int *, int *, int *, int *, int *, int *,
int *, int *, int *, int *, float *, int *);
static int b[9] /* was [3][3] */, mr[25];
mlc3r_c(&lia, &m, &n, ia, kv, x, c__, &z__, &max__, b, mr, &eps, &ierr);
printf("\n %5i \n", ierr);
printf("\n %5i \n", z__);
printf("\n %5i %5i %5i %5i %5i %5i \n",
x[0], x[1], x[2], x[3], x[4], x[5]);
return 0;
} /* main */
Результаты:
ierr = 0
z__ = 19
x = (2, 2, 1)