Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • stable/2.8/Cbc/src/CbcMipStartIO.cpp

    r1902 r2012  
    1111#include <OsiSolverInterface.hpp>
    1212#include "CbcMessage.hpp"
     13#include "CbcHeuristic.hpp"
    1314#include <CbcModel.hpp>
    1415#include "CbcMipStartIO.hpp"
     
    2324
    2425   for ( size_t i=0 ; i<l ; ++i )
    25       if (!(isdigit(str[i])||(str[i]=='.')))
     26     if (!(isdigit(str[i])||(str[i]=='.')||(str[i]=='-')))
    2627         return false;
    2728
     
    8182      model->messageHandler()->message(CBC_GENERAL, model->messages())
    8283        << printLine << CoinMessageEol;
     84      if (colValues.size()<model->getNumCols()) {
     85        int numberColumns = model->getNumCols();
     86        OsiSolverInterface * solver = model->solver();
     87        vector< pair< string, double > > fullValues;
     88        /* for fast search of column names */
     89        map< string, int > colIdx;
     90        for (int i=0;i<numberColumns;i++) {
     91          fullValues.push_back( pair<string, double>(solver->getColName(i),0.0) );
     92          colIdx[solver->getColName(i)] = i;
     93        }
     94        for ( int i=0 ; (i<(int)colValues.size()) ; ++i )
     95          {
     96            map< string, int >::const_iterator mIt = colIdx.find( colValues[i].first );
     97            if ( mIt != colIdx.end() ) {
     98              const int idx = mIt->second;
     99              double v = colValues[i].second;
     100              fullValues[idx].second=v;
     101            }
     102          }
     103        colValues=fullValues;
     104      }
    83105   } else
    84106   {
     
    113135   int notFound = 0;
    114136   char colNotFound[256] = "";
     137   int nContinuousFixed = 0;
    115138   for ( int i=0 ; (i<(int)colValues.size()) ; ++i )
    116139   {
     
    130153         if (lp->isInteger(idx))  // just to avoid small
    131154            v = floor( v+0.5 );   // fractional garbage
     155         else
     156           nContinuousFixed++;
    132157         lp->setColBounds( idx, v, v );
    133158         ++fixed;
     
    154179      model->messageHandler()->message(CBC_GENERAL, model->messages())
    155180        << "Warning: mipstart values could not be used to build a solution." << CoinMessageEol;
    156       status = 1;
    157       goto TERMINATE;
     181      if (nContinuousFixed) {
     182        model->messageHandler()->message(CBC_GENERAL, model->messages())
     183          << "Trying just fixing integer variables." << CoinMessageEol;
     184        int numberColumns = lp->getNumCols();
     185        const double * oldLower = model->solver()->getColLower();
     186        const double * oldUpper = model->solver()->getColUpper();
     187        for ( int i=0 ; i<numberColumns ; ++i ) {
     188          if (!lp->isInteger(i)) {
     189            lp->setColLower(i,oldLower[i]);
     190            lp->setColUpper(i,oldUpper[i]);
     191          }
     192        }
     193        lp->initialSolve();
     194        if (!lp->isProvenOptimal())
     195          model->messageHandler()->message(CBC_GENERAL, model->messages())
     196            << "Still no good." << CoinMessageEol;
     197      }
     198      if (!lp->isProvenOptimal()) {
     199        status = 1;
     200        goto TERMINATE;
     201      }
    158202   }
    159203
     
    165209        << printLine << CoinMessageEol;
    166210      double start = CoinCpuTime();
     211#if 1
     212      CbcSerendipity heuristic(*model);
     213      heuristic.setFractionSmall(2.0);
     214      heuristic.setFeasibilityPumpOptions(1008013);
     215      int returnCode = heuristic.smallBranchAndBound(lp,
     216                                                     1000, sol,
     217                                                     compObj,
     218                                                     model->getCutoff(),
     219                                                     "ReduceInMIPStart");
     220      if ((returnCode&1) != 0) {
     221         sprintf( printLine,"Mini branch and bound defined values for remaining variables in %.2f seconds.",
     222                  CoinCpuTime()-start);
     223         model->messageHandler()->message(CBC_GENERAL, model->messages())
     224           << printLine << CoinMessageEol;
     225         foundIntegerSol = true;
     226         obj = compObj;
     227      }
     228#else
    167229      CbcModel babModel( *lp );
    168230      babModel.setLogLevel( 0 );
     
    180242         obj = compObj = babModel.getObjValue();
    181243      }
     244#endif
    182245      else
    183246      {
Note: See TracChangeset for help on using the changeset viewer.