Пакет квадратичного программирования CGAL находит неправильное решение

Я использую пакет CGAL QP для решения следующей квадратичной задачи:

введите описание изображения здесь

Я использую следующий файл MPS, чтобы определить проблему (first_qp.mps):

NAME first_qp
ROWS
E c0
COLUMNS
x0  c0  1
x1  c0  1
x2  c0  1
x3  c0  1
x4  c0  1
x5  c0  1
x6  c0  1
x7  c0  1
x8  c0  1
RHS
rhs c0  1
BOUNDS
UP  BND  x0  0.2
UP  BND  x1  0.2
UP  BND  x2  0.2
UP  BND  x3  0.2
UP  BND  x4  0.2
UP  BND  x5  0.2
UP  BND  x6  0.2
UP  BND  x7  0.2
UP  BND  x8  0.2
QUADOBJ
x0  x0  39.07
x1  x0  25.54
x2  x0  27.29
x3  x0  28.56
x4  x0  24.38
x5  x0  10.23
x6  x0  11.12
x7  x0  15.26
x8  x0  25.17
x1  x1  38.82
x2  x1  18.11
x3  x1  20.67
x4  x1  17.20
x5  x1  8.10
x6  x1  12.41
x7  x1  9.82
x8  x1  14.69
x2  x2  39.97
x3  x2  26.82
x4  x2  22.55
x5  x2  12.81
x6  x2  10.90
x7  x2  16.17
x8  x2  26.42
x3  x3  29.00
x4  x3  24.61
x5  x3  10.37
x6  x3  10.65
x7  x3  14.93
x8  x3  23.61
x4  x4  49.71
x5  x4  7.04
x6  x4  6.20
x7  x4  17.41
x8  x4  25.87
x5  x5  12.47
x6  x5  8.21
x7  x5  7.53
x8  x5  9.73
x6  x6  19.02
x7  x6  7.47
x8  x6  7.87
x7  x7  16.04
x8  x7  14.95
x8  x8  28.90
ENDATA

Обратите внимание, что я использую QUADOBJ для определения матрицы D. В случае QUADOBJ должны быть указаны только элементы 2D на диагонали или ниже, записи выше диагонали выводятся из симметрии. Затем я передаю этот файл решателю (first_qp_from_mps.cpp):

// example: read quadratic program in MPS format from file
// the QP below is the first quadratic program example in the user manual
#include <iostream>
#include <fstream>
#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

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

int main() {
std::ifstream in ("first_qp.mps");
Program qp(in);         // read program from file
assert (qp.is_valid()); // we should have a valid mps file

// solve the program, using ET as the exact type
Solution s = CGAL::solve_quadratic_program(qp, ET());

// output solution
std::cout << s;
return 0;
}

Проект компилируется, исполняемый файл запускается и возвращает вектор решения (0 1 0 0 0 0 0 0 0), а значение целевой функции равно 0. Я знаю, что это неверно. Вектор решения не удовлетворяет ограничению верхней границы. Целевая функция, оцениваемая по этому вектору решения, не может быть равна 0.

Я ошибаюсь, указав файл MPS для моей задачи квадратичного программирования, или мне нужно что-то скорректировать в том, как решатель ищет решение? Может ли моя проблема быть связана с точным типом, который использует CGAL?

Например, я попытался изменить <int> в <double> в следующей строке

typedef CGAL::Quadratic_program_from_mps<int> Program;

Программа скомпилировалась, но когда я запустил исполняемый файл, решатель вернул, что решение не выполнимо. Но я знаю, что есть реальное решение — я нашел решение с использованием решателя в Excel.

3

Решение

Вы действительно должны использовать вместо типа программы. Но кроме того, ET должен быть typedef’d как CGAL :: Gmpzf (точный тип с плавающей точкой), а не CGAL :: Gmpz (точный целочисленный тип).

0

Другие решения


По вопросам рекламы [email protected]