如何防止Gurobi将Max转换为Min问题



我使用Gurobi(通过c++)作为我的硕士论文的一部分来解决二次背包问题实例。到目前为止,我已经能够生成一个具有二元决策变量、二次目标函数和容量约束的模型,并且Gurobi很好地解决了它。然后我想解出QKP的连续松弛。我像以前一样构建模型,但使用连续变量而不是二进制变量,当我试图优化它时,Gurobi给了我一个异常:

10020 - Objective Q not PSD (negative diagonal entry)

这让我有点困惑,因为问题实例的所有值都≥0。在准备发布这个问题时,我将两个模型都写到了文件中,并发现了原因:

NAME (null)
* Max problem is converted into Min one

这当然意味着所有之前的正值现在都是负值。现在我知道为什么Q不是PSD,但我如何解决这个问题?我能阻止从最大问题到最小问题的转换吗?我是否需要为连续松弛配置不同的模型?

从我(没有经验)的角度来看,这看起来就像是Gurobi搬起石头砸自己的脚。

当你使用Gurobi或任何其他凸优化器最大化二次目标时,你的'Q'矩阵必须是负半定的,当你最小化时,你的'Q'矩阵需要是正定的。改变客观事物的符号和意义什么也改变不了。

robi不会验证你的问题是凸的,但是它会报告它发现的任何非凸性。你原来的问题似乎作为MIP解决了,这是一个意外,你不应该依赖它。

你应该把一个有二元变量的二次目标建模为一个有一些简单变换的线性问题。如果x和y是二进制,如果添加约束

,表达式x*y可以更改为z
z <= x
z <= y
z >= x + y - 1

最新更新