[Osi] How to use integer/binary variables with coin-or OSI interface (cplex)
T L
tinlyx at gmail.com
Sat Mar 23 20:24:06 EDT 2019
Hi List members,
I am learning coin OSI programming using the C++ interface (using CPLEX). I
have the following example code that works for continuous variables and
Linear Programming (LP) (based on online coin examples).
But I couldn't find instructions on how to use integer decision variables.
Could anyone help explain how to change the two decision variables x0 and
x1 to integer and/or binary variables?
Also, I am currently use CPLEX and have clp installed. To use MILP with
coin-or instead of CPLEX, what additional package do I need?
Thanks and regards,
// Example of using COIN-OR OSI, building the instance internally
// with sparse matrix object
#include <iostream>
//#include <coin/OsiClpSolverInterface.hpp>
#include <coin/OsiCpxSolverInterface.hpp>
#include <coin/CoinPackedMatrix.hpp>
#include <coin/CoinPackedVector.hpp>
int
main(void)
{
// Create a problem pointer. We use the base class here.
OsiSolverInterface *si;
// When we instantiate the object, we need a specific derived class.
//si = new OsiClpSolverInterface;
si = new OsiCpxSolverInterface;
// Build our own instance from scratch
/*
* This section adapted from Matt Galati's example
* on thise COIN-OR Tutorial website.
*
* Problem from Bertsimas, Tsitsiklis page 21
*
* optimal solution: x* = (1,1)
*
* minimize -1 x0 - 1 x1
* s.t 1 x0 + 2 x1 <= 3
* 2 x0 + 1 x1 <= 3
* x0 >= 0
* x1 >= 0
*/
int n_cols = 2;
double * col_lb = new double[n_cols];//the column lower bounds
double * col_ub = new double[n_cols];//the column upper bounds
//Define the variable lower/upper bounds.
// x0 >= 0 => 0 <= x0 <= infinity
// x1 >= 0 => 0 <= x1 <= infinity
col_lb[0] = 0.0;
col_lb[1] = 0.0;
col_ub[0] = si->getInfinity();
col_ub[1] = si->getInfinity();
//Define the objective coefficients.
//minimize -1 x0 - 1 x1
// double * objective = new double[n_cols];//the objective coefficients
std::vector<double> objective(n_cols, 0.0); //the objective coefficients
objective[0] = -1.0;
objective[1] = -1.0;
int n_rows = 2;
double * row_lb = new double[n_rows]; //the row lower bounds
double * row_ub = new double[n_rows]; //the row upper bounds
//Define the constraint matrix.
CoinPackedMatrix * matrix = new CoinPackedMatrix(false,0,0);
matrix->setDimensions(0, n_cols);
//1 x0 + 2 x1 <= 3 => -infinity <= 1 x0 + 2 x2 <= 3
CoinPackedVector row1;
row1.insert(0, 1.0);
row1.insert(1, 2.0);
row_lb[0] = -1.0 * si->getInfinity();
row_ub[0] = 3.0;
matrix->appendRow(row1);
//2 x0 + 1 x1 <= 3 => -infinity <= 2 x0 + 1 x1 <= 3
CoinPackedVector row2;
row2.insert(0, 2.0);
row2.insert(1, 1.0);
row_lb[1] = -1.0 * si->getInfinity();
row_ub[1] = 3.0;
matrix->appendRow(row2);
//load the problem to OSI
si->loadProblem(*matrix, col_lb, col_ub, objective.data(), row_lb,
row_ub);
//write the MPS file to a file called example.mps
si->writeMps("example");
// Solve the (relaxation of the) problem
si->initialSolve();
// Check the solution
if ( si->isProvenOptimal() )
{
std::cout << "Found optimal solution!" << std::endl;
std::cout << "Objective value is " << si->getObjValue() << std::endl;
int n = si->getNumCols();
const double *solution;
solution = si->getColSolution();
// We could then print the solution or examine it.
}
else
{
std::cout << "Didn't find optimal solution." << std::endl;
// Could then check other status functions.
}
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/osi/attachments/20190323/45a7d3f8/attachment.html>
More information about the Osi
mailing list