为什么我的代数表达式不给出错误并且在决策变量中没有得到值?

时间:2019-04-04 08:57:21

标签: cplex opl

我目前正在致力于在旨在处理关键信息的通信基础架构中实施SLRG(共享风险链接小组)。 为此,我正在实现最小成本SRLG多样化路由问题算法。算法如下:

min c *(x1 + x2)

这样

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

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

z1 + z2 <= 1 (3)


A 30x41 矩阵;

xi 是决策变量和 41x1 向量;

H 2x41 矩阵;

z 是决策变量和 2x1 向量;

c 41x1 向量;

u 30x1 向量。

所有变量都是 binary (包括决策变量)

我所做的基本上是尝试实现可以​​正确编译的代码,但最终决定变量没有任何价值。

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 个答案:

答案 0 :(得分:2)

一个可能的线索是在输出行中: 行“ c1”不可行 告诉您您的模型不可行。因此,CPLEX找不到决策变量的值也就不足为奇了。尝试找出模型不可行的地方/原因。

答案 1 :(得分:0)

警告Non-integral bounds for integer variables rounded中可能暗示了该模型不可行的原因。您是否期望整数变量的边界不都是整数?