Ignore:
Timestamp:
Nov 21, 2012 4:38:56 AM (7 years ago)
Author:
forrest
Message:

add Proximity heuristic (Fischetti and Monaci) - shouldn't break anything

File:
1 edited

Legend:

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

    r1798 r1802  
    24312431      User hook, says John.
    24322432    */
    2433     if ( intParam_[CbcMaxNumNode] < 0)
    2434         eventHappened_ = true; // stop as fast as possible
     2433    if ( intParam_[CbcMaxNumNode] < 0
     2434      ||numberSolutions_>=getMaximumSolutions())
     2435      eventHappened_ = true; // stop as fast as possible
    24352436    stoppedOnGap_ = false ;
    24362437    // See if can stop on gap
     
    39593960            secondaryStatus_ = 4;
    39603961            status_ = 1 ;
    3961         } else if (eventHappened_) {
    3962             handler_->message(CBC_EVENT, messages_) << CoinMessageEol ;
    3963             secondaryStatus_ = 5;
    3964             status_ = 5 ;
     3962        } else if (numberSolutions_ >= intParam_[CbcMaxNumSol]) {
     3963            handler_->message(CBC_MAXSOLS, messages_) << CoinMessageEol ;
     3964            secondaryStatus_ = 6;
     3965            status_ = 1 ;
    39653966        } else if (isNodeLimitReached()) {
    39663967            handler_->message(CBC_MAXNODES, messages_) << CoinMessageEol ;
     
    39723973            status_ = 1 ;
    39733974        } else {
    3974             assert(numberSolutions_ >= intParam_[CbcMaxNumSol]);
    3975             handler_->message(CBC_MAXSOLS, messages_) << CoinMessageEol ;
    3976             secondaryStatus_ = 6;
    3977             status_ = 1 ;
     3975            handler_->message(CBC_EVENT, messages_) << CoinMessageEol ;
     3976            secondaryStatus_ = 5;
     3977            status_ = 5 ;
    39783978        }
    39793979    }
     
    1312613126        // Modify based on size etc
    1312713127        adjustHeuristics();
    13128         // See if already withing allowable gap
     13128        // See if already within allowable gap
    1312913129        bool exitNow = false;
    1313013130        for (i = 0; i < numberHeuristics_; i++) {
     
    1313313133        }
    1313413134        if (!exitNow) {
     13135          /** -1 first time otherwise number of solutions last time */
     13136          int lastSolutionCount = -1;
     13137          while (lastSolutionCount) {
     13138            int thisSolutionCount=0;
    1313513139#ifdef CBC_THREAD
    1313613140            if ((threadMode_&4) != 0) {
     
    1315513159                        if (!heuristic_[i]->shouldHeurRun(0))
    1315613160                            continue;
     13161                        if (lastSolutionCount>0&&
     13162                            (heuristic_[i]->switches()&16)==0)
     13163                          continue; // no point
    1315713164                        parameters[i-iChunk].solutionValue = heuristicValue;
    1315813165                        // Don't want a strategy object
     
    1320213209                                    incrementUsed(newSolution);
    1320313210                                    // increment number of solutions so other heuristics can test
    13204                                     numberSolutions_++;
     13211                                    thisSolutionCount++;
    1320513212                                    numberHeuristicSolutions_++;
    1320613213                                    found = i + iChunk ;
     
    1322613233                    if (!heuristic_[i]->shouldHeurRun(whereFrom))
    1322713234                        continue;
    13228                     if (maximumSecondsReached())
     13235                    if (lastSolutionCount>0&&
     13236                        (heuristic_[i]->switches()&16)==0)
     13237                      continue; // no point
     13238                    if (maximumSecondsReached()) {
     13239                        thisSolutionCount=-1000000;
    1322913240                        break;
     13241                    }
    1323013242                    // see if heuristic will do anything
    1323113243                    double saveValue = heuristicValue ;
     
    1324913261                        setBestSolution(CBC_ROUNDING, heuristicValue, newSolution) ;
    1325013262                        if (bestObjective_ < currentObjective) {
     13263                            thisSolutionCount++;
    1325113264                            heuristic_[i]->incrementNumberSolutionsFound();
    1325213265                            found = i ;
    1325313266                            incrementUsed(newSolution);
    1325413267                            // increment number of solutions so other heuristics can test
    13255                             numberSolutions_++;
     13268                            //                            numberSolutions_++;
    1325613269                            numberHeuristicSolutions_++;
    1325713270#ifdef CLP_INVESTIGATE
     
    1326013273#endif
    1326113274                            whereFrom |= 8; // say solution found
    13262                             if (heuristic_[i]->exitNow(bestObjective_))
     13275                            if (heuristic_[i]->exitNow(bestObjective_)
     13276                                ||numberSolutions_>=getMaximumSolutions()) {
     13277                              thisSolutionCount=-1000000;
    1326313278                                break;
     13279                            }
    1326413280                            if (eventHandler) {
    1326513281                              if (!eventHandler->event(CbcEventHandler::heuristicSolution)) {
    1326613282                                eventHappened_ = true; // exit
     13283                                thisSolutionCount=-1000000;
    1326713284                                break;
    1326813285                              }
     
    1327513292                                stoppedOnGap_ = true ;
    1327613293                              //eventHappened_=true; // stop as fast as possible
     13294                              thisSolutionCount=-1000000;
    1327713295                              break;
    1327813296                            }
     
    1329313311                      if (!eventHandler->event(CbcEventHandler::afterHeuristic)) {
    1329413312                        eventHappened_ = true; // exit
     13313                        thisSolutionCount=-1000000;
    1329513314                        break;
    1329613315                      }
     
    1330013319            }
    1330113320#endif
     13321            if (thisSolutionCount<=0)
     13322              break;
     13323            lastSolutionCount=thisSolutionCount;
     13324          }
    1330213325        }
    1330313326        currentPassNumber_ = 0;
Note: See TracChangeset for help on using the changeset viewer.