Почему мое алгебраическое выражение не дает ошибок и не получает значения в переменных решения? - PullRequest
0 голосов
/ 04 апреля 2019

В настоящее время я работаю над внедрением SLRG (Shared Risk Link Group) в инфраструктуру связи, предназначенную для обработки важной информации. Для этого я реализую алгоритм разнонаправленной задачи минимальной стоимости SRLG. Алгоритм выглядит следующим образом:

мин с * (х1 + х2)

такой, что

A * xi = u, i = 1,2 (1)

H * xi <= 41 * zi, i = 1,2 <strong>(2)

z1 + z2 <= 1 <strong>(3)


A - матрица 30x41 ;

xi является переменной решения и вектором 41x1 ;

H - матрица 2x41 ;

z является переменной решения и вектором 2x1 ;

c - это вектор 41x1 ;

u - это вектор 30x1 .

Все переменные двоичные , включая переменные решения

В основном я пытался реализовать код, который прекрасно скомпилировался, но в итоге переменные решения не имеют никакого значения.

dvar boolean x1[1..41]; //decision variable of path 1
dvar boolean x2[1..41]; //decision variable of path 2
dvar boolean z1[1..2]; //risk path 1
dvar boolean z2[1..2]; //risk path 2

int A[1..30][1..41] =...; //incidence matrix

int u[1..30]=...; //source and destiny nodes

int H[1..2][1..41] =...; //risk links

int c[1..41] =...; // cost

dexpr int total = sum (p in 1..41) (x1[p]+x2[p]); //x1+x2

int cs = sum (p in 1..41) c[p]; // c

minimize (cs * (total) ); // c*(x1+x2)

subject to {

   forall (i in 1..30)
     sum (j in 1..41)
       A[i][j]*x1[j] == u[i];  //A*x1=u

   forall (i in 1..30)
     sum (j in 1..41)
       A[i][j]*x2[j] == u[i]; //A*x2=u

   forall (i in 1..2)
     sum (j in 1..41)
       H[i][j]*x1[j] - 41*z1[i] <= 0; //H*x1=41*z1

   forall (i in 1..2)
     sum (j in 1..41)
       H[i][j]*x2[j] - 41*z2[i] <= 0; //H*x2=41*z2 

   forall (i in 1..2)
     z1[i]+z2[i] <= 1; //z1+z2<=1

}


Я ожидал, что переменные решения будут равны 0 и 1, показывая правильный маршрут, но выводится "Нет значения"

Спасибо.

Журнал двигателя

Warning:  Non-integral bounds for integer variables rounded.
Row 'c1' infeasible, all entries at implied bounds.
Presolve time = 0,00 sec. (0,04 ticks)
Root node processing (before b&c):
  Real time             =    0,00 sec. (0,07 ticks)
Parallel b&c, 4 threads:
  Real time             =    0,00 sec. (0,00 ticks)
  Sync time (average)   =    0,00 sec.
  Wait time (average)   =    0,00 sec.
Total (root+branch&cut) =    0,00 sec. (0,07 ticks)

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Одна возможная подсказка находится в строке вывода: Строка 'c1' невыполнима который говорит вам, что ваша модель неосуществима. Поэтому совсем не удивительно, что CPLEX не может найти значение для ваших переменных решения. Попробуйте выяснить, где / почему ваша модель неосуществима.

0 голосов
/ 04 апреля 2019

Подсказка о том, почему модель недопустима, может быть в предупреждении Non-integral bounds for integer variables rounded. Вы ожидали, что границы ваших целочисленных переменных не все целые?

...