Линейное программирование: ограничение по модулю

Я использую Coin-Or’s репетировать реализовать линейное программирование.

Мне нужно ограничение по модулю. Пример: x должен быть кратным 3,

OsiCbcSolverInterface solver;
CelModel model(solver);
CelNumVar x;
CelIntVar z;

unsigned int mod = 3;

// Maximize

solver.setObjSense(-1.0);

model.setObjective(x);

model.addConstraint(x <= 7.5);

// The modulo constraint:

model.addConstraint(x == z * mod);

Результат для x должно быть 6. Однако z установлен в 2.5, что не должно быть возможным, как я объявил это как CellIntVar,

Как я могу обеспечить z быть целым числом?

1

Решение

Я никогда не использовал эту библиотеку, но вы, я думаю, вы должны следовать тесты.

Основное сообщение приходит от readme:

Если вы хотите, чтобы некоторые из ваших переменных были целыми числами, используйте CelIntVar вместо CelNumVar. Необходимо также связать решатель с решателем целочисленного линейного программирования, например, Coin-cbc.

Смотря на Репетировать / tests / testRehearse.cpp -> instancele4 () (здесь представлен: неполный код; без копирования-вставки):

OsiClpSolverInterface *solver = new OsiClpSolverInterface();

CelModel model(*solver);

...
CelIntVar x1("x1");
...
solver->initialSolve();       // this is the relaxation (and maybe presolving)!
...
CbcModel cbcModel(*solver);   // MIP-solver
cbcModel.branchAndBound();    // Use MIP-solver

printf("Solution for x1 : %g\n", model.getSolutionValue(x1, *cbcModel.solver()));
printf("Solution objvalue = : %g\n", cbcModel.solver()->getObjValue());

Этот вид использования (используйте Osi для получения LP-решателя; создайте MIP-решатель поверх этого Osi-обеспеченного LP-решателя и вызовите brandAndBound) в основном следует внутреннему интерфейсу Cbc (с Python cylp это выглядит похоже).

Так же как ссылка: это официальный CoinOR Cbc (Репетиция свободной) пример из Вот:

// Copyright (C) 2005, International Business Machines
// Corporation and others.  All Rights Reserved.

#include "CbcModel.hpp"
// Using CLP as the solver
#include "OsiClpSolverInterface.hpp"
int main (int argc, const char *argv[])
{
OsiClpSolverInterface solver1;

// Read in example model in MPS file format
// and assert that it is a clean model
int numMpsReadErrors = solver1.readMps("../../Mps/Sample/p0033.mps","");
assert(numMpsReadErrors==0);

// Pass the solver with the problem to be solved to CbcModel
CbcModel model(solver1);

// Do complete search
model.branchAndBound();

/* Print the solution.  CbcModel clones the solver so we
need to get current copy from the CbcModel */
int numberColumns = model.solver()->getNumCols();

const double * solution = model.bestSolution();

for (int iColumn=0;iColumn<numberColumns;iColumn++) {
double value=solution[iColumn];
if (fabs(value)>1.0e-7&&model.solver()->isInteger(iColumn))
printf("%d has value %g\n",iColumn,value);
}
return 0;
}
2

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

Других решений пока нет …