CGAL解决了二次规划问题

时间:2014-05-11 19:53:35

标签: cgal

我有一个qp问题:

Minimize: -5x0 - x1 - 4x2 - 5x5 + 1000x0x2 + 1000x1x2 + 1000x0x3 
      + 1000x1x3 + 1000x0x4 +1000x1x4

Subject to: x0>=0 x1>=0 x2>=0 x3>=0 x4>=0 x5>=0
        x0+x1+x5<=5      
        x2+x3+x4<=5

答案应为X0 = 0 X1 = 0 X2 = 5 X3 = 0 X4 = 0 X5 = 5且obj = -45。

但CGAL给我X0 = 5 X1 = 0 X2 = 0 X3 = 0 X4 = 0 X5 = 0且obj = -25。

代码粘贴如下:

任何建议都将不胜感激。

凯莉

#include <iostream>
#include <climits>
#include <cassert>
#include <CGAL/basic.h>
#include <CGAL/QP_models.h>
#include <CGAL/QP_functions.h>
// choose exact integral type
#ifdef CGAL_USE_GMP
#include <CGAL/Gmpz.h>
typedef CGAL::Gmpz ET;
#else
#include <CGAL/MP_Float.h>
typedef CGAL::MP_Float ET;
#endif

using namespace std;

// program and solution types
typedef CGAL::Quadratic_program<int> Program;
typedef CGAL::Quadratic_program_solution<ET> Solution;

int
main(){
    Program qp (CGAL::SMALLER, true, 0.0, false, 0.0);

    qp.set_c(0, -5);
    qp.set_c(1, -1);
    qp.set_c(2, -4);
    qp.set_c(5, -5);

    int g = 1000;
    qp.set_d(2, 0, g);
    qp.set_d(2, 1, g);
    qp.set_d(3, 0, g);
    qp.set_d(3, 1, g);
    qp.set_d(4, 0, g);
    qp.set_d(4, 1, g);

    int nRow = 0;
    qp.set_a(0, nRow,  1.0);
    qp.set_a(1, nRow,  1.0);
    qp.set_a(5, nRow,  1.0);
    qp.set_b(nRow, 5);

    nRow++;
    qp.set_a(2, nRow,  1.0);
    qp.set_a(3, nRow,  1.0);
    qp.set_a(4, nRow,  1.0);
    qp.set_b(nRow, 5);

    Solution s = CGAL::solve_quadratic_program(qp, ET());
    assert (s.solves_quadratic_program(qp));
    CGAL::print_nonnegative_quadratic_program(std::cout, qp, "first_qp");

    std::cout << s;
    return 0;
}          

1 个答案:

答案 0 :(得分:0)

由于矩阵D(二次目标函数)不是正半正定,因此您的结果并不令人惊讶。 CGAL并不保证在全球最低限度,而是向本地最低标准。您获得的是当地最低限度,尊重您施加的限制。

如果您通过编写x2x5qp.set_l(2,true,1); qp.set_l(5,true,1);的最小边界设置为1,您将看到您收敛到您计算的解决方案。