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
{
}
效果很好
我在公式中有以下 objective 函数。
我知道像 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
{
}
效果很好