Последовательные вызовы lp_solve для «решения» неверны - PullRequest
1 голос
/ 29 августа 2011

Мне нужно решить простую задачу, похожую на целочисленное программирование, я взял библиотеку lp_solve.Задача состоит в том, чтобы получить значения переменных для некоторых последовательных значений линейной функции с возможными простыми (линейными) ограничениями на переменные (на самом деле я столкнулся с проблемой даже без каких-либо дополнительных ограничений).Например, у меня есть линейная функция 4a + 5b.Первые значения, которые меня интересуют: (значение функции - значения переменных):

0 - (0, 0); 4 - (1, 0); 5 - (0, 1); 8 - (2, 0); 9 - (1, 1)

Проблема в том, что после получения 8 - (2, 0), lp_solve возвращает код NUMFAILURE (5)решая задачу и решая ее как 0 - (0, 0)

Если я не использую последовательные вызовы функции 'решить' и просто начинаю с 9, тогда я получил правильный ответ (9 - (1, 1)).Кто-нибудь, пожалуйста, объясните это?Код следующий.

#include <iostream>
#include <cstdio>

#include <lpsolve/lp_lib.h>

# if defined ERROR
#   undef ERROR
# endif
# define ERROR() { fprintf(stderr, "Error\n"); exit(1); }

using std::cout;
using std::endl;

void print_res(REAL * vars, int size) {
    cout << "(";
    for (int i = 0; i < size - 1; ++i) {
        cout << round(vars[i]) << ", ";
    }
    cout << round(vars[size - 1]) << ")";
}

int main()
{

    lprec *lp;
    int majorversion, minorversion, release, build, min = 0;

    lp_solve_version(&majorversion, &minorversion, &release, &build);


    const int l = 5;   // number of iterations
    const int dim = 2; // dimension ot current task
    char p_data[] = "4 5"; // objective function: p(a, b) = 4a + 5b


    if ((lp=make_lp(0,  dim)) == NULL)
        ERROR();
    set_verbose(lp, CRITICAL);

    if (!str_add_constraint(lp, p_data, GE, min)) // p(a, b) >= min
      ERROR();

    // objective function - p
    if (!str_set_obj_fn(lp, p_data))
      ERROR();

    // work with integer non-negative variables
    set_int(lp, 1, TRUE);
    set_int(lp, 2, TRUE);
    set_lowbo(lp, 1, 0);
    set_lowbo(lp, 2, 0);

    for (int i = 0; i < l; ++i) {
        cout <<  "Status: " << solve(lp) << endl;
        REAL vars[dim];
        get_variables(lp, vars);
        print_res(vars, dim);

        // increase minimum value for p
        min = round(get_objective(lp));
        cout << ", p = " << min << endl;

        if (!set_rh(lp, 1, min + 1))
          ERROR();
    }

    return 0;
}
...