Ignore:
Timestamp:
Sep 19, 2018 11:40:00 AM (2 years ago)
Author:
forrest
Message:

mip start sos

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cbc/src/CbcMipStartIO.cpp

    r2349 r2385  
    195195      if (nContinuousFixed) {
    196196         model->messageHandler()->message(CBC_GENERAL, model->messages())
    197             << "Trying just fixing integer variables." << CoinMessageEol;
     197            << "Trying just fixing integer variables (and fixingish SOS)." << CoinMessageEol;
    198198         int numberColumns = lp->getNumCols();
    199199         const double *oldLower = model->solver()->getColLower();
    200200         const double *oldUpper = model->solver()->getColUpper();
     201         double * savedSol = CoinCopyOfArray(lp->getColLower(),numberColumns);
    201202         for ( int i=0 ; i<numberColumns ; ++i ) {
    202203            if (!lp->isInteger(i)) {
     
    205206            }
    206207         }
    207 
     208         // but look at SOS
     209         int numberObjects = model->numberObjects();
     210         for (int i=0;i<numberObjects;i++) {
     211           const OsiSOS * object =
     212             dynamic_cast<const OsiSOS *>(model->object(i));
     213           if (object) {
     214             int n=object->numberMembers();
     215             const int * members = object->members();
     216             int sosType = object->sosType();
     217             if (sosType==1) {
     218               // non zero can take any value - others zero
     219               int iColumn=-1;
     220               for (int j=0;j<n;j++) {
     221                 int jColumn=members[j];
     222                 if (savedSol[jColumn])
     223                   iColumn = jColumn;
     224               }
     225               for (int j=0;j<n;j++) {
     226                 int jColumn=members[j];
     227                 if (jColumn!=iColumn) {
     228                   lp->setColLower(jColumn,0.0);
     229                   lp->setColUpper(jColumn,0.0);
     230                 }
     231               }
     232             } else if (sosType==2) {
     233               // SOS 2 - make a guess if just one nonzero
     234               int jA=-1;
     235               int jB=-1;
     236               for (int j=0;j<n;j++) {
     237                 int jColumn=members[j];
     238                 if (savedSol[jColumn]) {
     239                   if (jA==-1)
     240                     jA = j;
     241                   jB = j;
     242                 }
     243               }
     244               if (jB>jA+1) {
     245                 jB = jA+1;
     246               } else if (jA==jB) {
     247                 if (jA==n-1)
     248                   jA--;
     249                 else
     250                   jB++;
     251               }
     252               for (int j=0;j<n;j++) {
     253                 if (j!=jA&&j!=jB) {
     254                   int jColumn=members[j];
     255                   lp->setColLower(jColumn,0.0);
     256                   lp->setColUpper(jColumn,0.0);
     257                 }
     258               }
     259             }
     260           }
     261         }
     262         delete [] savedSol;
    208263         lp->initialSolve();
    209264      }
Note: See TracChangeset for help on using the changeset viewer.