Changeset 2215


Ignore:
Timestamp:
Sep 27, 2015 6:46:20 PM (3 years ago)
Author:
unxusr
Message:

proper translation of mipstart variables to preprocessed model and use of CbcModel? mipstart values when available

File:
1 edited

Legend:

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

    r2211 r2215  
    54895489#endif
    54905490                                const int * originalColumns = preProcess ? process.originalColumns() : NULL;
    5491                                 //if (model.getMIPStart().size())
    5492                                 // mipStart = model.getMIPStart();
     5491                                if (model.getMIPStart().size())
     5492                                                    mipStart = model.getMIPStart();
    54935493                                if (mipStart.size() && !mipStartBefore.size() && babModel_->getNumCols())
    54945494                                {
    5495                                    std::vector< std::string > colNames;
    5496                                    if (preProcess)
    5497                                    {
    5498                                      std::vector< std::pair< std::string, double > > mipStart2;
    5499                                      for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i ) {
    5500                                        int iColumn = babModel_->originalColumns()[i];
    5501                                        if (iColumn>=0) {
    5502                                          colNames.push_back( model_.solver()->getColName( iColumn ) );
    5503                                          babModel_->solver()->setColName(i,model_.solver()->getColName(iColumn));
    5504                                          mipStart2.push_back(mipStart[iColumn]);
    5505                                        } else {
    5506                                          // created variable
    5507                                          char newName[15];
    5508                                          sprintf(newName,"C%7.7d",i);
    5509                                          colNames.push_back( newName );
    5510                                        }
    5511                                      }
    5512                                      mipStart = mipStart2;
    5513                                    } else {
    5514                                       for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i )
    5515                                          colNames.push_back( model_.solver()->getColName(i) );
    5516                                    }
    5517                                    //printf("--- %s %d\n", babModel_->solver()->getColName(0).c_str(), babModel_->solver()->getColNames().size() );
    5518                                    //printf("-- SIZES of models %d %d %d\n", model_.getNumCols(),  babModel_->solver()->getNumCols(), babModel_->solver()->getColNames().size() );
    5519                                    std::vector< double > x( babModel_->getNumCols(), 0.0 );
    5520                                    double obj;
    5521                                    int status = computeCompleteSolution( babModel_, colNames, mipStart, &x[0], obj );
    5522                                    if (!status) {
    5523                                      babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
    5524                                      babModel_->setSolutionCount(1);
    5525                                    }
     5495                                    std::vector< std::string > colNames;
     5496                                    if (preProcess)
     5497                                    {
     5498                                        /* translating mipstart solution */
     5499                                        std::map< std::string, double > mipStartV;
     5500                                        for ( size_t i=0 ; (i<mipStart.size()) ; ++i )
     5501                                            mipStartV[mipStart[i].first] = mipStart[i].second;
     5502
     5503                                        std::vector< std::pair< std::string, double > > mipStart2;
     5504                                        for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i ) {
     5505                                            int iColumn = babModel_->originalColumns()[i];
     5506                                            if (iColumn>=0) {
     5507                                                std::string cname = model_.solver()->getColName( iColumn );
     5508                                                colNames.push_back( cname );
     5509                                                babModel_->solver()->setColName( i, cname );
     5510                                                std::map< std::string, double >::const_iterator msIt = mipStartV.find( cname );
     5511                                                if ( msIt != mipStartV.end() )
     5512                                                    mipStart2.push_back( std::pair< std::string, double>( cname, msIt->second ) );
     5513                                            } else {
     5514                                                // created variable
     5515                                                char newName[15];
     5516                                                sprintf(newName,"C%7.7d",i);
     5517                                                colNames.push_back( newName );
     5518                                            }
     5519                                        }
     5520                                        mipStart = mipStart2;
     5521                                    } else {
     5522                                        for ( int i=0 ; (i<babModel_->solver()->getNumCols()) ; ++i )
     5523                                            colNames.push_back( model_.solver()->getColName(i) );
     5524                                    }
     5525                                    //printf("--- %s %d\n", babModel_->solver()->getColName(0).c_str(), babModel_->solver()->getColNames().size() );
     5526                                    //printf("-- SIZES of models %d %d %d\n", model_.getNumCols(),  babModel_->solver()->getNumCols(), babModel_->solver()->getColNames().size() );
     5527                                    std::vector< double > x( babModel_->getNumCols(), 0.0 );
     5528                                    double obj;
     5529                                    int status = computeCompleteSolution( babModel_, colNames, mipStart, &x[0], obj );
     5530                                    if (!status) {
     5531                                        babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
     5532                                        babModel_->setSolutionCount(1);
     5533                                    }
    55265534                                }
    55275535
Note: See TracChangeset for help on using the changeset viewer.