[英]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.