Changeset 2235


Ignore:
Timestamp:
Jan 16, 2016 7:47:43 PM (2 years ago)
Author:
unxusr
Message:

proper use of mipstart

File:
1 edited

Legend:

Unmodified
Added
Removed
  • stable/2.9/Cbc/src/CbcSolver.cpp

    r2233 r2235  
    54345434#endif
    54355435                                const int * originalColumns = preProcess ? process.originalColumns() : NULL;
    5436                                 //if (model.getMIPStart().size())
    5437                                 // mipStart = model.getMIPStart();
    5438                                 if (mipStart.size() && !mipStartBefore.size() && babModel_->getNumCols())
     5436
     5437                                if (model.getMIPStart().size())
     5438                                                    mipStart = model.getMIPStart();
     5439
     5440                                if (mipStart.size() && !mipStartBefore.size() && babModel_->getNumCols())
    54395441                                {
    5440                                    std::vector< std::string > colNames;
    5441                                    if (preProcess)
    5442                                    {
    5443                                      std::vector< std::pair< std::string, double > > mipStart2;
    5444                                      int numberOriginalColumns = model_.solver()->getNumCols();
    5445                                      for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i ) {
    5446                                        int iColumn = babModel_->originalColumns()[i];
    5447                                        if (iColumn>=0 && iColumn < numberOriginalColumns) {
    5448                                          colNames.push_back( model_.solver()->getColName( iColumn ) );
    5449                                          babModel_->solver()->setColName(i,model_.solver()->getColName(iColumn));
    5450                                          mipStart2.push_back(mipStart[iColumn]);
    5451                                        } else {
    5452                                          // created variable
    5453                                          char newName[15];
    5454                                          sprintf(newName,"C%7.7d",i);
    5455                                          colNames.push_back( newName );
    5456                                        }
    5457                                      }
    5458                                      mipStart = mipStart2;
    5459                                    } else {
    5460                                       for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i )
    5461                                          colNames.push_back( model_.solver()->getColName(i) );
    5462                                    }
    5463                                    //printf("--- %s %d\n", babModel_->solver()->getColName(0).c_str(), babModel_->solver()->getColNames().size() );
    5464                                    //printf("-- SIZES of models %d %d %d\n", model_.getNumCols(),  babModel_->solver()->getNumCols(), babModel_->solver()->getColNames().size() );
    5465                                    std::vector< double > x( babModel_->getNumCols(), 0.0 );
    5466                                    double obj;
    5467                                    int status = computeCompleteSolution( babModel_, colNames, mipStart, &x[0], obj );
    5468                                    if (!status) {
    5469                                      babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
    5470                                      babModel_->setSolutionCount(1);
    5471                                    }
    5472                                 }
     5442                                    std::vector< std::string > colNames;
     5443                                    if (preProcess)
     5444                                    {
     5445                                        /* translating mipstart solution */
     5446                                        std::map< std::string, double > mipStartV;
     5447                                        for ( size_t i=0 ; (i<mipStart.size()) ; ++i )
     5448                                            mipStartV[mipStart[i].first] = mipStart[i].second;
     5449
     5450                                        std::vector< std::pair< std::string, double > > mipStart2;
     5451                                        for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i ) {
     5452                                            int iColumn = babModel_->originalColumns()[i];
     5453                                            if (iColumn>=0) {
     5454                                                std::string cname = model_.solver()->getColName( iColumn );
     5455                                                colNames.push_back( cname );
     5456                                                babModel_->solver()->setColName( i, cname );
     5457                                                std::map< std::string, double >::const_iterator msIt = mipStartV.find( cname );
     5458                                                if ( msIt != mipStartV.end() )
     5459                                                    mipStart2.push_back( std::pair< std::string, double>( cname, msIt->second ) );
     5460                                            } else {
     5461                                                // created variable
     5462                                                char newName[15];
     5463                                                sprintf(newName,"C%7.7d",i);
     5464                                                colNames.push_back( newName );
     5465                                            }
     5466                                        }
     5467                                        mipStart = mipStart2;
     5468                                    } else {
     5469                                        for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i )
     5470                                            colNames.push_back( model_.solver()->getColName(i) );
     5471                                    }
     5472                                    //printf("--- %s %d\n", babModel_->solver()->getColName(0).c_str(), babModel_->solver()->getColNames().size() );
     5473                                    //printf("-- SIZES of models %d %d %d\n", model_.getNumCols(),  babModel_->solver()->getNumCols(), babModel_->solver()->getColNames().size() );
     5474                                    std::vector< double > x( babModel_->getNumCols(), 0.0 );
     5475                                    double obj;
     5476                                    int status = computeCompleteSolution( babModel_, colNames, mipStart, &x[0], obj );
     5477                                    if (!status) {
     5478                                        babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
     5479                                        babModel_->setSolutionCount(1);
     5480                                    }
     5481                               }
     5482
    54735483
    54745484                                if (solutionIn && useSolution >= 0) {
Note: See TracChangeset for help on using the changeset viewer.