我正在使用CGAL来解决一些quadratic programming问题。
假设我希望x^2
x
的{{1}}值从-oo
( - 无穷大)到+oo
最小化
Program qp (CGAL::SMALLER, false, 0, false, 0);
qp.set_d(0, 0, 2);
Solution s = CGAL::solve_quadratic_program(qp, ET());
。这可以通过以下方式轻松解决:
0
当然会返回x^2
作为结果。现在假设我想要最大化
-x^2
。为此,我必须尽量减少 Program qp (CGAL::SMALLER, false, 0, false, 0);
qp.set_d(0, 0, -2);
Solution s = CGAL::solve_quadratic_program(qp, ET());
。但以下不“工作”
在CGAL:
D = [-2]
因为现在的矩阵0
不是正半定的(二次规划问题的API“要求”D为半正半球)。通过运行上面的代码段,会返回错误的结果-oo
,而不是x^2
。
如何在CGAL中最大化像{{1}}这样的目标函数,我该怎么办?
答案 0 :(得分:3)
CGAL的documentation说你的目标函数必须是凸函数的最小化。您正在尝试最小化-x ^ 2,这不是凸的 - 因此您无法使用CGAL执行此操作。
此外,在我链接的文档的第10.2.2节中,它表示尝试最小化非凸函数可能甚至不警告您问题是非凸的,而是返回消息而不是最优解被找到。也就是说,如果您要将QAL用于QP,请确保它是凸二次的,否则您将得到错误的答案。
您可能会考虑一个可以处理非凸非线性优化的求解器。 IPOPT是开源的,如果您的目标函数和约束是连续可微分的两倍,它将起作用。 COIN-OR有几个可能适合您的解算器(请参阅“优化确定性非线性”)。 KNITRO是一位优秀的商业解决方案。