我正在使用Gurobi(通过C ++)作为我的MSc论文的一部分来解决Quadratic Knapsack Problem instances。到目前为止,我能够生成一个具有二元决策变量,二次目标函数和容量约束的模型,而Gurobi解决它就好了。然后我想解决QKP的持续放松问题。我像以前一样构建模型,但是使用连续变量而不是二进制变量,当我尝试优化时,Gurobi给我一个例外:
10020 - Objective Q not PSD (negative diagonal entry)
由于形成问题实例的所有值都≥0,因此使我感到困惑。在准备发布这个问题时,我写了两个模型到文件并发现原因:
NAME (null)
* Max problem is converted into Min one
这当然意味着所有以前的正值现在都是负数。现在我知道为什么Q不是PSD,但我该如何解决这个问题呢?我可以阻止从Max问题转换为Min问题吗?我是否需要以不同方式配置模型以进行持续放松?
从我的(无经验的)观点看,它看起来就像是Gurobi在脚下射击。
答案 0 :(得分:2)
当您使用Gurobi或任何其他凸优化器最大化二次目标时,您的'Q'矩阵必须是负半定的,当您最小化时,您的'Q'矩阵需要是正定的。改变符号和客观感不会改变任何东西。
Gurobi不会验证您的问题是凸的,但会报告它找到的任何非凸性。事实上你的原始问题似乎解决了MIP是一个意外,你不应该依赖它。
您应该使用二元变量将二次目标建模为线性问题,并使用一些简单的transformations。如果x和y是二进制的,那么如果添加约束,表达式x*y
可以更改为z
z <= x
z <= y
z >= x + y - 1