本文整理汇总了C++中OsiSolverInterface::getColLower方法的典型用法代码示例。如果您正苦于以下问题:C++ OsiSolverInterface::getColLower方法的具体用法?C++ OsiSolverInterface::getColLower怎么用?C++ OsiSolverInterface::getColLower使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类OsiSolverInterface
的用法示例。
在下文中一共展示了OsiSolverInterface::getColLower方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: infeasible
bool OsiColCut::infeasible(const OsiSolverInterface &im) const
{
const double * oldColLb = im.getColLower();
const double * oldColUb = im.getColUpper();
const CoinPackedVector & cutLbs = lbs();
const CoinPackedVector & cutUbs = ubs();
int i;
for ( i=0; i<cutLbs.getNumElements(); i++ ) {
int colIndx = cutLbs.getIndices()[i];
double newLb= cutLbs.getElements()[i] > oldColLb[colIndx] ?
cutLbs.getElements()[i] : oldColLb[colIndx];
double newUb = oldColUb[colIndx];
if ( cutUbs.isExistingIndex(colIndx) )
if ( cutUbs[colIndx] < newUb ) newUb = cutUbs[colIndx];
if ( newLb > newUb )
return true;
}
for ( i=0; i<cutUbs.getNumElements(); i++ ) {
int colIndx = cutUbs.getIndices()[i];
double newUb = cutUbs.getElements()[i] < oldColUb[colIndx] ?
cutUbs.getElements()[i] : oldColUb[colIndx];
double newLb = oldColLb[colIndx];
if ( cutLbs.isExistingIndex(colIndx) )
if ( cutLbs[colIndx] > newLb ) newLb = cutLbs[colIndx];
if ( newUb < newLb )
return true;
}
return false;
}
示例2: CoinMax
//-------------------------------------------------------------------
// Generate Stored cuts
//-------------------------------------------------------------------
void
CglStoredUser::generateCuts(const OsiSolverInterface & si, OsiCuts & cs,
const CglTreeInfo info) const
{
// Get basic problem information
const double * solution = si.getColSolution();
if (info.inTree&&info.pass>numberPasses_) {
// only continue if integer feasible
int numberColumns=si.getNumCols();
int i;
const double * colUpper = si.getColUpper();
const double * colLower = si.getColLower();
int numberAway=0;
for (i=0;i<numberColumns;i++) {
double value = solution[i];
// In case slightly away from bounds
value = CoinMax(colLower[i],value);
value = CoinMin(colUpper[i],value);
if (si.isInteger(i)&&fabs(value-fabs(value+0.5))>1.0e-5)
numberAway++;
}
if (numberAway)
return; // let code branch
}
int numberRowCuts = cuts_.sizeRowCuts();
for (int i=0;i<numberRowCuts;i++) {
const OsiRowCut * rowCutPointer = cuts_.rowCutPtr(i);
double violation = rowCutPointer->violated(solution);
if (violation>=requiredViolation_)
cs.insert(*rowCutPointer);
}
}
示例3: CoinMax
// Return "down" estimate
double
CbcSimpleIntegerPseudoCost::downEstimate() const
{
OsiSolverInterface * solver = model_->solver();
const double * solution = model_->testSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
double value = solution[columnNumber_];
value = CoinMax(value, lower[columnNumber_]);
value = CoinMin(value, upper[columnNumber_]);
if (upper[columnNumber_] == lower[columnNumber_]) {
// fixed
return 0.0;
}
double integerTolerance =
model_->getDblParam(CbcModel::CbcIntegerTolerance);
double below = floor(value + integerTolerance);
double above = below + 1.0;
if (above > upper[columnNumber_]) {
above = below;
below = above - 1;
}
double downCost = CoinMax((value - below) * downPseudoCost_, 0.0);
return downCost;
}
示例4: CoinMax
double
CbcNWay::infeasibility(const OsiBranchingInformation * /*info*/,
int &preferredWay) const
{
int numberUnsatis = 0;
int j;
OsiSolverInterface * solver = model_->solver();
const double * solution = model_->testSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
double largestValue = 0.0;
double integerTolerance =
model_->getDblParam(CbcModel::CbcIntegerTolerance);
for (j = 0; j < numberMembers_; j++) {
int iColumn = members_[j];
double value = solution[iColumn];
value = CoinMax(value, lower[iColumn]);
value = CoinMin(value, upper[iColumn]);
double distance = CoinMin(value - lower[iColumn], upper[iColumn] - value);
if (distance > integerTolerance) {
numberUnsatis++;
largestValue = CoinMax(distance, largestValue);
}
}
preferredWay = 1;
if (numberUnsatis) {
return largestValue;
} else {
return 0.0; // satisfied
}
}
示例5: applyBounds
// Apply bounds
void OsiSolverBranch::applyBounds(OsiSolverInterface &solver, int way) const
{
int base = way + 1;
assert(way == -1 || way == 1);
int numberColumns = solver.getNumCols();
const double *columnLower = solver.getColLower();
int i;
for (i = start_[base]; i < start_[base + 1]; i++) {
int iColumn = indices_[i];
if (iColumn < numberColumns) {
double value = CoinMax(bound_[i], columnLower[iColumn]);
solver.setColLower(iColumn, value);
} else {
int iRow = iColumn - numberColumns;
const double *rowLower = solver.getRowLower();
double value = CoinMax(bound_[i], rowLower[iRow]);
solver.setRowLower(iRow, value);
}
}
const double *columnUpper = solver.getColUpper();
for (i = start_[base + 1]; i < start_[base + 2]; i++) {
int iColumn = indices_[i];
if (iColumn < numberColumns) {
double value = CoinMin(bound_[i], columnUpper[iColumn]);
solver.setColUpper(iColumn, value);
} else {
int iRow = iColumn - numberColumns;
const double *rowUpper = solver.getRowUpper();
double value = CoinMin(bound_[i], rowUpper[iRow]);
solver.setRowUpper(iRow, value);
}
}
}
示例6: createResult
// Create result
void OsiSolverResult::createResult(const OsiSolverInterface &solver, const double *lowerBefore,
const double *upperBefore)
{
delete[] primalSolution_;
delete[] dualSolution_;
if (solver.isProvenOptimal() && !solver.isDualObjectiveLimitReached()) {
objectiveValue_ = solver.getObjValue() * solver.getObjSense();
CoinWarmStartBasis *basis = dynamic_cast< CoinWarmStartBasis * >(solver.getWarmStart());
assert(basis);
basis_ = *basis;
int numberRows = basis_.getNumArtificial();
int numberColumns = basis_.getNumStructural();
assert(numberColumns == solver.getNumCols());
assert(numberRows == solver.getNumRows());
primalSolution_ = CoinCopyOfArray(solver.getColSolution(), numberColumns);
dualSolution_ = CoinCopyOfArray(solver.getRowPrice(), numberRows);
fixed_.addBranch(-1, numberColumns, lowerBefore, solver.getColLower(),
upperBefore, solver.getColUpper());
} else {
// infeasible
objectiveValue_ = COIN_DBL_MAX;
basis_ = CoinWarmStartBasis();
;
primalSolution_ = NULL;
dualSolution_ = NULL;
}
}
示例7: defined
/* Generate cuts for the model data contained in si.
The generated cuts are inserted into and returned in the
collection of cuts cs.
*/
bool
AbcCutGenerator::generateCuts( OsiCuts & cs , bool fullScan)
{
int howOften = whenCutGenerator_;
if (howOften == -100)
return false;
if (howOften > 0)
howOften = howOften % 1000000;
else
howOften = 1;
if (!howOften)
howOften = 1;
bool returnCode = false;
OsiSolverInterface * solver = model_->solver();
#if defined(ABC_DEBUG_MORE)
std::cout << "model_->getNodeCount() = " << model_->getNodeCount()
<< std::endl;
#endif
if (fullScan || (model_->getNodeCount() % howOften) == 0 ) {
CglProbing* generator =
dynamic_cast<CglProbing*>(generator_);
if (!generator) {
generator_->generateCuts(*solver,cs);
} else {
// Probing - return tight column bounds
CglTreeInfo info;
generator->generateCutsAndModify(*solver,cs,&info);
const double * tightLower = generator->tightLower();
const double * lower = solver->getColLower();
const double * tightUpper = generator->tightUpper();
const double * upper = solver->getColUpper();
const double * solution = solver->getColSolution();
int j;
int numberColumns = solver->getNumCols();
double primalTolerance = 1.0e-8;
for (j=0; j<numberColumns; j++) {
if (tightUpper[j] == tightLower[j] &&
upper[j] > lower[j]) {
// fix
solver->setColLower(j, tightLower[j]);
solver->setColUpper(j, tightUpper[j]);
if (tightLower[j] > solution[j] + primalTolerance ||
tightUpper[j] < solution[j] - primalTolerance)
returnCode = true;
}
}
}
}
return returnCode;
}
示例8: CoinMin
double
CbcSimpleIntegerPseudoCost::infeasibility(const OsiBranchingInformation * /*info*/,
int &preferredWay) const
{
OsiSolverInterface * solver = model_->solver();
const double * solution = model_->testSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
if (upper[columnNumber_] == lower[columnNumber_]) {
// fixed
preferredWay = 1;
return 0.0;
}
double value = solution[columnNumber_];
value = CoinMax(value, lower[columnNumber_]);
value = CoinMin(value, upper[columnNumber_]);
/*printf("%d %g %g %g %g\n",columnNumber_,value,lower[columnNumber_],
solution[columnNumber_],upper[columnNumber_]);*/
double nearest = floor(value + 0.5);
double integerTolerance =
model_->getDblParam(CbcModel::CbcIntegerTolerance);
double below = floor(value + integerTolerance);
double above = below + 1.0;
if (above > upper[columnNumber_]) {
above = below;
below = above - 1;
}
double downCost = CoinMax((value - below) * downPseudoCost_, 0.0);
double upCost = CoinMax((above - value) * upPseudoCost_, 0.0);
if (downCost >= upCost)
preferredWay = 1;
else
preferredWay = -1;
// See if up down choice set
if (upDownSeparator_ > 0.0) {
preferredWay = (value - below >= upDownSeparator_) ? 1 : -1;
}
if (preferredWay_)
preferredWay = preferredWay_;
if (fabs(value - nearest) <= integerTolerance) {
return 0.0;
} else {
// can't get at model so 1,2 don't make sense
assert(method_ < 1 || method_ > 2);
if (!method_)
return CoinMin(downCost, upCost);
else
return CoinMax(downCost, upCost);
}
}
示例9: checkDisjSide
/// check if (column!) cuts compatible with solver interface
int CouenneDisjCuts::checkDisjSide (OsiSolverInterface &si, OsiCuts *cuts) const {
int retval = COUENNE_FEASIBLE;
const double
*lower = si.getColLower (),
*upper = si.getColUpper ();
// check each colcut in cuts (there should be just one)
for (int i = cuts -> sizeColCuts (); i--;) {
// lower bounds
const CoinPackedVector &lbs = cuts -> colCutPtr (i) -> lbs ();
const int *lindices = lbs.getIndices ();
const double *lvalues = lbs.getElements ();
for (int j = lbs.getNumElements (); j--;) {
register double lb = *lvalues++;
register int ind = *lindices++;
if (lb > upper [ind] + COUENNE_EPS) // fathom node
return COUENNE_INFEASIBLE;
if (lb > lower [ind] + COUENNE_EPS)
retval = COUENNE_TIGHTENED;
}
// upper bounds
const CoinPackedVector &ubs = cuts -> colCutPtr (i) -> ubs ();
const int *uindices = ubs.getIndices ();
const double *uvalues = ubs.getElements ();
for (int j = ubs.getNumElements (); j--;) {
register double ub = *uvalues++;
register int ind = *uindices++;
if (ub < lower [ind] - COUENNE_EPS) // fathom node
return COUENNE_INFEASIBLE;
if (ub < upper [ind] - COUENNE_EPS)
retval = COUENNE_TIGHTENED;
}
}
return retval;
}
示例10: BlisBranchObjectInt
// Creates a branching object from this infeasible object.
BcpsBranchObject *
BlisObjectInt::createBranchObject(BcpsModel *m, int direction) const
{
BlisModel *model = dynamic_cast<BlisModel* >(m);
OsiSolverInterface * solver = model->solver();
double integerTolerance = model->BlisPar()->entry(BlisParams::integerTol);
const double * solution = solver->getColSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
double value = solution[columnIndex_];
//std::cout << "COL"<< columnIndex_ << ": x = " << value << std::endl;
// Force value in bounds.
value = CoinMax(value, lower[columnIndex_]);
value = CoinMin(value, upper[columnIndex_]);
double nearest = floor(value + 0.5);
assert (upper[columnIndex_] > lower[columnIndex_]);
int hotstartStrategy = model->getHotstartStrategy();
if (hotstartStrategy <= 0) {
if (fabs(value - nearest) < integerTolerance) {
// Already integeral.
std::cout << "ERROR: COL" << columnIndex_ << ": x=" << value
<< ", nearest=" << nearest
<< ", intTol=" << integerTolerance << std::endl;
assert(0);
}
}
else {
const double * incumbent = model->incumbent();
double targetValue = incumbent[columnIndex_];
if (direction > 0) {
value = targetValue - 0.1;
}
else {
value = targetValue + 0.1;
}
}
return new BlisBranchObjectInt(model, objectIndex_, direction, value);
}
示例11: floor
// Compute the infeasibility based on currently relax solution.
double
BlisObjectInt::infeasibility(BcpsModel *m, int & preferredWay) const
{
BlisModel * model = dynamic_cast<BlisModel *>(m);
OsiSolverInterface * solver = model->solver();
const double * solution = solver->getColSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
double value = solution[columnIndex_];
value = std::max(value, lower[columnIndex_]);
value = std::min(value, upper[columnIndex_]);
//printf("%d %g %g %g %g\n",columnIndex_,value,lower[columnIndex_],
// solution[columnIndex_],upper[columnIndex_]);
double nearest = floor(value + (1.0 - breakEven_));
double integerTolerance = model->BlisPar()->entry(BlisParams::integerTol);
if (nearest > value) {
preferredWay = 1;
}
else {
preferredWay = -1;
}
double weight = fabs(value - nearest);
// normalize so weight is 0.5 at break even
if (nearest < value) {
weight = (0.5/breakEven_) * weight;
}
else {
weight = (0.5/(1.0 - breakEven_)) * weight;
}
if (fabs(value - nearest) <= integerTolerance) {
return 0.0;
}
else {
return weight;
}
}
示例12: CoinMax
// Returns true if current solution satsifies one side of branch
bool
OsiSolverBranch::feasibleOneWay(const OsiSolverInterface & solver) const
{
bool feasible = false;
int numberColumns = solver.getNumCols();
const double * columnLower = solver.getColLower();
const double * columnUpper = solver.getColUpper();
const double * columnSolution = solver.getColSolution();
double primalTolerance;
solver.getDblParam(OsiPrimalTolerance,primalTolerance);
for (int base = 0; base<4; base +=2) {
feasible=true;
int i;
for (i=start_[base];i<start_[base+1];i++) {
int iColumn = indices_[i];
if (iColumn<numberColumns) {
double value = CoinMax(bound_[i],columnLower[iColumn]);
if (columnSolution[iColumn]<value-primalTolerance) {
feasible=false;
break;
}
} else {
abort(); // do later (other stuff messed up anyway - e.g. CBC)
}
}
if (!feasible)
break;
for (i=start_[base+1];i<start_[base+2];i++) {
int iColumn = indices_[i];
if (iColumn<numberColumns) {
double value = CoinMin(bound_[i],columnUpper[iColumn]);
if (columnSolution[iColumn]>value+primalTolerance) {
feasible=false;
break;
}
} else {
abort(); // do later (other stuff messed up anyway - e.g. CBC)
}
}
if (feasible)
break; // OK this way
}
return feasible;
}
示例13: assert
// Generate cuts
void
CglFakeClique::generateCuts(const OsiSolverInterface& si, OsiCuts & cs,
const CglTreeInfo info) const
{
if (fakeSolver_) {
assert (si.getNumCols()==fakeSolver_->getNumCols());
fakeSolver_->setColLower(si.getColLower());
fakeSolver_->setColSolution(si.getColSolution());
fakeSolver_->setColUpper(si.getColUpper());
CglClique::generateCuts(*fakeSolver_,cs,info);
if (probing_) {
// get and set branch and bound cutoff
double cutoff;
si.getDblParam(OsiDualObjectiveLimit,cutoff);
fakeSolver_->setDblParam(OsiDualObjectiveLimit,cutoff);
probing_->generateCuts(*fakeSolver_,cs,info);
}
} else {
// just use real solver
CglClique::generateCuts(si,cs,info);
}
}
示例14: CoinMax
// Infeasibility - large is 0.5
double
CbcSimpleIntegerFixed::infeasibility(int & preferredWay) const
{
OsiSolverInterface * solver = model_->solver();
const double * solution = model_->testSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
double value = solution[columnNumber_];
value = CoinMax(value, lower[columnNumber_]);
value = CoinMin(value, upper[columnNumber_]);
/*printf("%d %g %g %g %g\n",columnNumber_,value,lower[columnNumber_],
solution[columnNumber_],upper[columnNumber_]);*/
double nearest = floor(value+(1.0-breakEven_));
assert (breakEven_>0.0&&breakEven_<1.0);
double integerTolerance =
model_->getDblParam(CbcModel::CbcIntegerTolerance);
if (nearest>value)
preferredWay=1;
else
preferredWay=-1;
if (preferredWay_)
preferredWay=preferredWay_;
double weight = fabs(value-nearest);
// normalize so weight is 0.5 at break even
if (nearest<value)
weight = (0.5/breakEven_)*weight;
else
weight = (0.5/(1.0-breakEven_))*weight;
if (fabs(value-nearest)<=integerTolerance) {
if (upper[columnNumber_]==lower[columnNumber_])
return 0.0;
else
return 1.0e-5;
} else {
return weight;
}
}
示例15: CoinMax
// Force this object within exiting bounds, then fix the bounds at the
// the nearest integer value. Assume solution value is within tolerance of
// the nearest integer.
void
BlisObjectInt::feasibleRegion(BcpsModel *m)
{
BlisModel *model = dynamic_cast<BlisModel* >(m);
OsiSolverInterface * solver = model->solver();
const double * solution = solver->getColSolution();
const double * lower = solver->getColLower();
const double * upper = solver->getColUpper();
double value = solution[columnIndex_];
// 1) Force value to be in bounds.
value = CoinMax(value, lower[columnIndex_]);
value = CoinMin(value, upper[columnIndex_]);
double nearest = floor(value + 0.5);
// 2) Fix variable at the nearest integer
assert (fabs(value - nearest) <= 0.01);
solver->setColLower(columnIndex_, nearest);
solver->setColUpper(columnIndex_, nearest);
}