我通过C#API使用CPLEX 12.5.0.0。使用CPLEX进行二次规划的目标常数?
到现在为止,我从来没有过一个具有常数项的目标 - 只有约束条件。有了约束,我总能重新排列方程,所以常数总是在一边,这意味着每个ILinearNumExpr
本身没有常数项。
现在我有一个二次规划问题,具有以下类型的一个目的:
MAX Z =
c[1,2] * a[1] * a[2] - c[1,2] * (1 - a[1] * a[2]) +
c[1,3] * a[1] * a[3] - c[1,2] * (1 - a[1] * a[3]) +
c[2,3] * a[2] * a[3] - c[2,2] * (1 - a[2] * a[3])
C [,]是一个常数,对称成本矩阵。 a [i]是二元变量。
因此,看着上面三行的左半部分,将[i]和a [j]放在一起会使客观价值成为c [i,j]。这是目前实施,测试和工作的内容。
我想修改目标,以便如果[i]和a [j]不都等于1,而不是不向目标值贡献c [i,j],则会将其减去。
现在,我查阅了CPLEX文档(作者显然对提供清晰的解释或示例过敏),并且似乎有一个ILinearNumExpr.Constant
属性,它允许我为给定表达式设置常量。
当我试图修改我的代码IQuadNumExpr
,我注意到它没有那.Constant
属性。
有什么方法可以将常数项添加到二次客观函数函数在CPLEX中吗?
c [1,2] a [1] a [2] -C [1,2](1-a [1] a [2]) == 2c [1,2] x [1] x [2] - c [1,2]。那真的是你想要做的吗? –
@DavidNehme是的,你可以重新安排这样的表达。我以这种形式离开,因为它更容易理解和解释。然而,重新安排并没有改变我的问题,因为在目标函数中仍然存在一个-c [1,2]常数项。 – Ozzah
您可以忽略目标函数中的常数项。常数项不会改变最佳解决方案。另外,由于[i]是二进制的,所以最好将它建模为线性MIP。 –