CPLEX或Gurobi数学编程软件包可以处理此目标函数吗?

问题描述

我在公式中具有以下目标函数

formula

formula是0-1变量,而formula是常数。

我知道CPLEX和Gurobi之类的软件包可以处理二次目标函数和约束。但是,上面的目标函数的分母有变量,在我看来,标准的数学编程包无法解决这个问题。

我想知道我是否正确,如果不正确,我希望获得一些有关如何在.LP文件中表达这种目标函数的指针。

解决方法

第一个项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可以处理此问题,因为它允许在模型中的任意位置(即目标和约束)使用非凸二次项。所以我的第一个尝试是:

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

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

,

使用CPLEX,您可以依靠MP并尝试Erwin的建议。 您也可以使用CPOptimizer,然后就不需要重新建模。

例如,如果您使用OPL API编写,则可以直接使用

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
{
  
}

效果很好