CPLEX 或 Gurobi 数学规划包可以处理此 objective 函数吗?

Can CPLEX or Gurobi mathematical programming packages handle this objective function?

我在公式中有以下 objective 函数。

是 0-1 变量, 是常量。

我知道像 CPLEX 和 Gurobi 这样的包可以处理二次 objective 函数和约束。但是,上面的 objective 函数在分母中有变量,在我看来标准数学编程包无法处理这个问题。

我想知道我是否正确,如果不正确,我希望得到一些关于如何在 .LP 文件中表达这样一个 objective 函数的指示。

第一项 sum(i, (s(i)*x(i,j))^2 ) 实际上是线性的,因为 x^2=x 是二进制变量。所以这只是 sum(i, s(i)^2*x(i,j)).

比例比较难。可以改写为

 ratio(j)*sum(i,x(i,j)) = sum(i,s(i)*x(i,j))^2

当然这可以由 Gurobi 处理,因为它允许模型中任何地方的 non-convex 二次项(即 objective 和约束)。所以我的第一次尝试是:

 min sum(j, w2(j) - ratio(j))         (linear)
 v(j) = sum(i,x(i,j))                 (linear)  
 w(j) = sum(i,s(i)*x(i,j))            (linear)  
 w2(j) =  sum(i, s(i)^2*x(i,j))       (linear)
 ratio(j)*v(j) = w(j)^2               (quadratic)     
  

并使用 Gurobi 的非凸二次求解器。当然,我们不知道模型的其余部分可能会产生进一步简化这一点的可能性。

对于 CPLEX,您可以依赖 MP 并尝试 Erwin 的建议。 你也可以使用COPtimizer,这样你就不需要改造了。

如果你使用OPLAPI你可以直接写

using CP;

int n=4;
int m=5;

int s[1..n]=[1,2,3,8];
dvar boolean x[1..n][1..m];


minimize 
  sum(j in 1..m)(
   sum(i in 1..n)(s[i]*x[i][j])^2-
   (sum(i in 1..n)(x[i][j]*s[i]))^2/sum(i in 1..n)x[i][j]);
subject to
{
  
}

效果很好