Известные значения переменных в линейной программе, написанной на Mathprog

У меня есть линейная программа, написанная на MathProg. Моя неизвестная двоичная переменная представляет собой двумерный массив, определенный как:

var x{i in V, l in L}, >=0, <=1;

где V и L - наборы целых чисел.

Однако значения некоторых переменных известны заранее, и я хотел бы указать это для решателя, чтобы уменьшить размер ILP. Например, я знаю, что x [4, l], когда l = 2 равно 1, а для любых других значений l равно нулю. В настоящее время я указываю это как ограничение:

s.t. initial4{i in V: i=4}:   sum{l in L}(l*x[i,l]) = 2;

Мне было интересно, эффективен ли это способ заранее указать значения подмножества неизвестных.

В идеале я бы хотел разместить такую ​​информацию в отдельном файле вместе с разделом данных, а не в файле модели.


person Ari    schedule 16.05.2012    source источник


Ответы (1)


Создайте верхнюю и нижнюю границы для каждой переменной:

var x{i in index_set}, >=x_L[i], <=x_U[i];

и отрегулируйте нижнюю и верхнюю границы известных значений.

Вот фрагмент кода MathProg, устанавливающий x[2] на ноль:

set index_set;

param x_L{index_set};
param x_U{index_set};

var x{i in index_set}, >=x_L[i], <=x_U[i];

s.t.

dummy:
  sum{i in index_set} x[i] = 2;

solve;

display x;

data;

set index_set := 1, 2, 3;

param x_L default 0;
param x_U default 1 :=
2 0;

end;

Из (отфильтрованного) вывода ясно, что препроцессор достаточно умен, чтобы исправить x[2] на 0:

glpsol --math test.mod 

OPTIMAL SOLUTION FOUND BY LP PREPROCESSOR

x[1].val = 1
x[2].val = 0
x[3].val = 1
person Ali    schedule 16.05.2012
comment
Спасибо за ответ. Я использую GLPK и написал свою модель в GNU MathProg. К сожалению, в MathProg нет ключевого слова let. - person Ari; 16.05.2012
comment
Большой. Мне это нравится больше, чем мое решение. Я думаю, что краткое изложение вашего ответа состоит в том, чтобы создать верхнюю и нижнюю границы для каждой переменной: var x {i in index_set}, ›= x_L [i],‹ = x_U [i]; и отрегулируйте нижнюю и верхнюю границы известных значений. - person Ari; 17.05.2012
comment
Да, точно. Я отредактировал свой ответ, и он начинается не с вашего резюме. Спасибо, что указали на это. Удачи! - person Ali; 17.05.2012