CPLEX 无法提取表达式

问题描述 投票:0回答:1

我是 CPLEX 的新手,两天前,我在一个大学项目中从头开始使用它,并且我一直在努力使用它。我确信这不是最有效的方法,但这是我的 .mod 文件:

int n=...; //set of terminals
range N=1..n;

int t=...; //set of time periods
range T=1..t;

int v=...; //set of vehicles
range V=1..v;

range Np=1..n; range Vp=1..v;
   float p[Vp][Np][Np] =...;
   
range Nc=1..n; range Vc=1..v;
   float c[Vc][Nc][Nc] =...;
   
range Nd=1..n; range Td=1..t;
   float d[Td][Nd][Nd] =...;

range Nm=1..n; range Tm=1..t; range Vm=1..v;
   int m[Vm][Nm][Tm] =...;
   
range NA=1..n; range VA=1..v;
   int A[VA][NA][NA] =...;
   
range Ntau=1..n;;
   int tau[Ntau][Ntau] =...;
   
dvar boolean x[N][N][T][V]; 
dvar boolean y[N][N][T][V]; 

dexpr float f=sum(i in N,j in N:i!=j,t in T, v in V)(p[v][i][j]*x[i][j][t][v] - c[v][i][j]*y[i][j][t][v]);
   
maximize f;
subject to {
  forall(i in N, t in T, v in V)sum(j in N)(x[i][j][t][v] + y[i][j][t][v])- sum(k in N: k != i, t_ in T: t_ > tau[k][i])(x[k][i][t_-tau[k][i]][v] + y[k][i][t_-tau[k][i]][v])- y[i][i][t-1][v] == m[v][i][t];

  forall(i in N, j in N, t in T)
    sum(v in V) x[i][j][t][v] <= d[t][i][j];

  forall(i in N, j in N, t in T, v in V)
    A[v][i][j] == 0 => x[i][j][t][v] == 0 && y[i][j][t][v] == 0;

  forall(i in N, j in N, t in T, v in V)
    x[i][j][t][v] >= 0 && x[i][j][t][v] <= 1 && y[i][j][t][v] >= 0 && y[i][j][t][v] <= 1;
}
 

这就是我的 .dat 文件中的内容:

n = 6;
t = 6;
v = 2;

c = [[  [0 1 2 2 2 2]
 [1 0 2 2 2 2]
 [2 2 0 2 1 1]
 [2 2 2 0 1 1]
 [2 2 1 1 0 1]
 [2 2 1 1 1 0]]
 
 [  [0 3 3 2 2 2]
 [3 0 3 3 2 2]
  [3 3 0 1 2 2]
  [2 3 1 0 3 3]
  [2 2 2 3 0 3]
  [2 2 2 3 3 0]]
  ]; 
  
p = [[  [0 1.8 3.6 3.6 3.6 3.6]
 [1.8 0 3.6 3.6 3.6 3.6]
 [3.6 3.6 0 3.6 1.8 1.8]
 [3.6 3.6 3.6 0 3.6 3.6]
 [3.6 3.6 1.8 3.6 0 1.8]
 [3.6 3.6 1.8 3.6 1.8 0]]
 
 [  [0 4.2 4.2 3.6 3.6 3.6]
 [4.2 0 4.2 4.2 3.6 3.6]
  [4.2 4.2 0 4.5 3.6 3.6]
  [3.6 4.2 4.5 0 4.2 4.2]
  [3.6 3.6 3.6 4.2 0 4.2]
  [3.6 3.6 3.6 4.2 4.2 0]]
  ]; 
  
//d_ijt
d = [[[0 0 0 0 0 0] 
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]]
 
  [[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 3 0 0 0 0]
  [0 0 0 0 0 1]
  [0 0 0 0 0 0]]
  
  [[0 0 0 0 0 0]
  [0 0 3 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]]
  
  [[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]]
  
  [[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [2 0 0 0 0 0]
  [0 0 0 0 0 0]]
  
  [[0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]]
  ]; 
  
  
m = [[  [0 0 0 0 0 0] //m_itv
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [1 0 0 0 0 0]]
 
 [  [0 0 0 0 0 0]
 [0 0 0 0 0 0]
  [0 0 0 0 0 0]
  [0 1 0 0 0 0]
  [0 0 0 0 0 0]
  [0 0 0 0 0 0]]
  ]; 
  
A = [[  [1 0 1 1 1 1] //A_ijv
 [0 1 1 1 1 1]
 [1 1 1 1 1 1]
 [1 1 1 1 1 1]
 [1 1 1 1 1 1]
 [1 1 1 1 1 1]]
 
 [[1 0 1 1 1 1]
 [0 1 1 1 1 1]
  [1 1 1 1 1 1]
  [1 1 1 1 1 1]
  [1 1 1 1 1 1]
  [1 1 1 1 1 1]]
  ]; 
  
  
tau = [[1 2 1 1 1 2] //tau_ij
 [2 1 2 1 2 3]
 [1 2 1 1 3 2]
 [1 1 1 1 1 3]
 [1 2 3 1 1 1]
 [2 3 2 3 1 1]];

基本上,我要做的就是使用文章上给出的数据,并使用该模型来证明它是有效的,并获得他们想要的解决方案。然而,当我运行这个时,我在第一个约束中遇到了 4 个错误:

-CPLEX cannot extract expression: forall...
-Index out of bound for array "y#0#0":0
-OPL cannot extract expression: forall...
-OPL cannot extract expression: sum...
cplex opl
1个回答
0
投票

如果你改变

forall(i in N, t in T, v in V)
    sum(j in N)(x[i][j][t][v] + y[i][j][t][v])

进入

forall(i in N, t in T, v in V:(t-1) in T)
    sum(j in N)(x[i][j][t][v] + y[i][j][t][v])

你的模型会工作得很好。您超出了范围。

完整的.mod 工作正常

int n=...; //set of terminals
range N=1..n;

int t=...; //set of time periods
range T=1..t;

int v=...; //set of vehicles
range V=1..v;

range Np=1..n; range Vp=1..v;
   float p[Vp][Np][Np] =...;
   
range Nc=1..n; range Vc=1..v;
   float c[Vc][Nc][Nc] =...;
   
range Nd=1..n; range Td=1..t;
   float d[Td][Nd][Nd] =...;

range Nm=1..n; range Tm=1..t; range Vm=1..v;
   int m[Vm][Nm][Tm] =...;
   
range NA=1..n; range VA=1..v;
   int A[VA][NA][NA] =...;
   
range Ntau=1..n;;
   int tau[Ntau][Ntau] =...;
   
dvar boolean x[N][N][T][V]; 
dvar boolean y[N][N][T][V]; 

dexpr float f=sum(i in N,j in N:i!=j,t in T, v in V)(p[v][i][j]*x[i][j][t][v] - c[v][i][j]*y[i][j][t][v]);
   
maximize f;
subject to {
  forall(i in N, t in T, v in V:(t-1) in T)
    sum(j in N)(x[i][j][t][v] + y[i][j][t][v])
      - sum(k in N: k != i, t_ in T:(t_ > tau[k][i]))  
      (x[k][i][t_-tau[k][i]][v] 
      + y[k][i][t_-tau[k][i]][v])
      - y[i][i][t-1][v] 
      == m[v][i][t];

  forall(i in N, j in N, t in T)
    sum(v in V) x[i][j][t][v] <= d[t][i][j];

  forall(i in N, j in N, t in T, v in V)
    A[v][i][j] == 0 => x[i][j][t][v] == 0 && y[i][j][t][v] == 0;

  forall(i in N, j in N, t in T, v in V)
    x[i][j][t][v] >= 0 && x[i][j][t][v] <= 1 && y[i][j][t][v] >= 0 && y[i][j][t][v] <= 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.