簡體   English   中英

cplex 中的冪非線性約束

[英]power Nonlinear constraint in cplex

我正在嘗試在我的 cplex 代碼中實現非線性約束:

forall (j in agent)
    pu[j] == pow(W[j],K)*pow(u[j],-K);

其中 pu 和 u 是 float+ 決策向量變量,W 是參數向量,K 是常數。 如何將約束轉換為線性約束?

這是代碼的rest:

int N =3;

range task = 1..N; 

range agent = 1..N; 

dvar boolean x[task][agent];

dvar float+ u[agent];

dvar float+ pu[agent];

int B[agent] = [9,7,4];

int W[agent] = [2,5,4];

int V[agent] = [1,6,4];

int P[task] = [5,2,1];

int K = 3;

float UV = 10;

dexpr float z = sum(i in task, j in agent) (P[i]*(B[j]+ pu[j]) )*x[i,j];

minimize z;

subject to {
    
  forall (j in agent)
    pu[j] == pow(W[j],K)*pow(u[j],-K);
    
    
  forall (i in task)
    sum(j in agent) x[i,j]==1;
    
   forall ( j in agent)
    sum(i in task) x[i,j]==1;
    
    sum(j in agent) V[j]*u[j]<= UV;
    
}  

您可以在 CPLEX 中使用 CPOptimizer 並編寫

using CP;

int N =3;

range task = 1..N;

range agent = 1..N;

dvar boolean x[task][agent];

int scale=100000;

dvar int+ scaleu[agent];

dexpr float u[j in agent]=scaleu[j]/scale;



int B[agent] = [9,7,4];

int W[agent] = [2,5,4];

int V[agent] = [1,6,4];

int P[task] = [5,2,1];

int K = 3;

float UV = 10;

dexpr float  pu[j in agent]=pow(W[j],K)*pow(u[j],-K);;

dexpr float z = sum(i in task, j in agent) (P[i]*(B[j]+ pu[j]) )*x[i,j];

minimize z;

subject to {

//forall (j in agent) pu[j] == pow(W[j],K)*pow(u[j],-K);

forall (i in task) sum(j in agent) x[i,j]==1;

forall ( j in agent) sum(i in task) x[i,j]==1;

sum(j in agent) V[j]*u[j]<= UV;

}

效果很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM