Changeset 2385 for trunk


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

mip start sos

Location:
trunk/Cbc/src
Files:
2 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      }
  • trunk/Cbc/src/CbcSolver.cpp

    r2382 r2385  
    57495749                                    int status = computeCompleteSolution( babModel_, colNames, mipStart, &x[0], obj );
    57505750                                    if (!status) {
    5751                                         babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
    5752                                         babModel_->setSolutionCount(1);
     5751                                      // need to check more babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
     5752                                      OsiBabSolver dummy;
     5753                                      babModel_->passInSolverCharacteristics(&dummy);
     5754                                      babModel_->createContinuousSolver();
     5755                                      babModel_->setBestSolution(CBC_Message::CBC_ROUNDING,
     5756                                                                 obj,&x[0], 1 );
     5757                                      babModel_->clearContinuousSolver();
     5758                                      babModel_->passInSolverCharacteristics(NULL);
    57535759                                    }
    57545760                                }
Note: See TracChangeset for help on using the changeset viewer.