如何解决 CPLEX 错误 5002:'co01#0#1'不是凸>



我试图解决混合整数线性规划与CPLEX 12.10 OPL和面对一个错误。

我运行配置并得到这个错误:
-Exception from IBM ILOG CPLEX: CPLEX error 5002: 'co01#0#1' is not convex.->。
-处理失败。

这是我在CPLEX中的模型:

// Define Indecies
int S=...;   
int T=...;   
range Segments = 1..S;
range Time = 0..T;
// Define Parameters and Data
float f = ...;
float Cpm = ...;
float L = ...;
float SDLL0[Segments]=...;
float d[Segments] = ...;  
float alfa = ...;   
float beta = ...;   
float SDLLumt=...;
// variables
dvar boolean z [Time];
dvar boolean x [Segments][Time];
dvar boolean y [Segments][Time];
dvar float+ SDLL[Segments][Time];
dvar float R[Segments][Time];
// Objective Function
minimize 
sum( t in Time ) ( z[t] * f + sum (s in Segments) x[s][t] * L * Cpm) ;

// Constraints
subject to {

forall(s in Segments, t in Time: t>=1)   
co01:    SDLL[s][t] == SDLL[s][t-1] + d[s] - (x[s][t] * R[s][t])  ;  
forall(s in Segments, t in Time: t==1)     
co02:    SDLL[s][t-1] == SDLL0[s] ; 
forall(s in Segments, t in Time: t>=1)
co03:    R[s][t] == alfa * ( SDLL[s][t-1] + d[s] ) + beta ;
forall(s in Segments, t in Time: t>=1)    
co04:    SDLL[s][t] <= SDLLumt ;     

forall(t in Time: t>=1, s in 1..(S-1))    
co05:    y[s][t] >= x[s][t] - x[s+1][t] ;         

forall(t in Time: t>=1 , s in Segments : s==S)    
co06:    y[s][t] >= x[s][t] ;      

forall(s in Segments, t in Time: t>=1)   
co07:    z[t] >= x[s][t] ;                                                               
}

我将最优性目标设置为3,但问题尚未解决。我还试图通过将dvar float更改为dexpr float(决策表达式)来在OPL CPLEX中使用CPO,但遇到了一些冲突。

我认为当t=1或t-1=0 (t>=1)时,函数SDLL[s][t]和SDLL[s][t-1]的初始值存在问题。

谁能告诉我为什么我得到这个错误?为什么约束不是凸的?我怎样才能改变它,让它发挥作用呢?

提前谢谢你。

在co01中,您可以将bo_saman dvar与float dvar相乘。

你应该把它线性化。

参见如何使用opl:

中的示例https://www.linkedin.com/pulse/how-opl-alex-fleischer

如何在CPLEX中将决策变量乘以布尔决策变量?

// suppose we want b * x <= 7 
dvar int x in 2..10;
dvar boolean b;
dvar int bx;
maximize x;
subject to
{

// Linearization  
bx<=7;

2*b<=bx;
bx<=10*b;
bx<=x-2*(1-b);
bx>=x-10*(1-b);
// if we use CP we could write directly
// b*x<=7
// or rely on logical constraints within CPLEX
// (b==1) => (bx==x);
// (b==0) => (bx==0);
}

最新更新