Changeset 1613 for trunk


Ignore:
Timestamp:
Mar 15, 2011 12:58:21 PM (8 years ago)
Author:
forrest
Message:

add variations to heuristic and when to call tuning

Location:
trunk/Cbc/src
Files:
3 edited

Legend:

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

    r1573 r1613  
    197197                           double * betterSolution)
    198198{
     199    int nodeCount = model_->getNodeCount();
     200    if (feasibilityPumpOptions_>0 && (nodeCount % feasibilityPumpOptions_) != 0)
     201        return 0;
    199202#ifdef DIVE_DEBUG
    200203    std::cout << "solutionValue = " << solutionValue << std::endl;
     
    218221    int reasonToStop = 0;
    219222#endif
    220 
    221223    double time1 = CoinCpuTime();
    222224    int numberSimplexIterations = 0;
  • trunk/Cbc/src/CbcHeuristicLocal.cpp

    r1573 r1613  
    2828    swap_ = 0;
    2929    used_ = NULL;
     30    lastRunDeep_ = -1000000;
    3031}
    3132
     
    3738    numberSolutions_ = 0;
    3839    swap_ = 0;
     40    lastRunDeep_ = -1000000;
    3941    // Get a copy of original matrix
    4042    assert(model.solver());
     
    354356
    355357    numCouldRun_++;
    356     if (numberSolutions_ == model_->getSolutionCount())
     358    // See if frequency kills off idea
     359    int swap = swap_%100;
     360    int skip = swap_/100;
     361    int nodeCount = model_->getNodeCount();
     362    if (nodeCount<lastRunDeep_+skip && nodeCount != lastRunDeep_+1)
     363      return 0;
     364    if (numberSolutions_ == model_->getSolutionCount() &&
     365        (numberSolutions_ == howOftenShallow_ ||
     366         nodeCount < lastRunDeep_+2*skip))
    357367        return 0;
     368    howOftenShallow_ = numberSolutions_;
    358369    numberSolutions_ = model_->getSolutionCount();
     370    if (nodeCount<lastRunDeep_+skip )
     371      return 0;
     372    lastRunDeep_ = nodeCount;
     373    howOftenShallow_ = numberSolutions_;
     374
     375    if ((swap%10) == 2) {
     376        // try merge
     377        return solutionFix( solutionValue, betterSolution, NULL);
     378    }
    359379/*
    360380  Exclude long (column), thin (row) systems.
     
    533553    if (tryHeuristic) {
    534554
    535         // best change in objective
     555        // total change in objective
     556        double totalChange = 0.0;
     557        // local best change in objective
    536558        double bestChange = 0.0;
     559        // maybe just do 1000
     560        int maxIntegers = numberIntegers;
     561        if (((swap/10) &1) != 0) {
     562          maxIntegers = CoinMin(1000,numberIntegers);
     563        }
    537564/*
    538565  Outer loop to walk integer variables. Call the current variable x<i>. At the
     
    548575        for (i = 0; i < numberIntegers; i++) {
    549576            int iColumn = integerVariable[i];
     577            bestChange = 0.0;
     578            int endInner = CoinMin(numberIntegers,i+maxIntegers);
    550579
    551580            double objectiveCoefficient = cost[i];
     
    585614*/
    586615              // try down
    587                 for (k = i + 1; k < numberIntegers; k++) {
     616                for (k = i + 1; k < endInner; k++) {
    588617                    if ((way[k]&1) != 0) {
    589618                        // try down
     
    675704                }
    676705                // try up
    677                 for (k = i + 1; k < numberIntegers; k++) {
     706                for (k = i + 1; k < endInner; k++) {
    678707                    if ((way[k]&1) != 0) {
    679708                        // try down
     
    783812                    iway |= 2;
    784813                way[goodK] = static_cast<char>(iway);
     814                totalChange += bestChange;
    785815            }
    786816        }
     
    793823  have a valid solution.
    794824*/
    795         if (bestChange + newSolutionValue < solutionValue) {
     825        if (totalChange + newSolutionValue < solutionValue) {
    796826            // paranoid check
    797827            memset(rowActivity, 0, numberRows*sizeof(double));
     
    876906  Again, redundant test. We shouldn't be here if numberSolutions_ = 1.
    877907*/
    878     if (numberSolutions_ > 1 && swap_ == 1) {
     908    if (numberSolutions_ > 1 && (swap%10) == 1) {
    879909        // try merge
    880910        int returnCode2 = solutionFix( solutionValue, betterSolution, NULL);
  • trunk/Cbc/src/CbcHeuristicRINS.cpp

    r1573 r1613  
    2929    numberTries_ = 0;
    3030    stateOfFixing_ = 0;
     31    shallowDepth_ = 0;
    3132    lastNode_ = -999999;
    3233    howOften_ = 100;
     
    4647    numberTries_ = 0;
    4748    stateOfFixing_ = 0;
     49    shallowDepth_ = 0;
    4850    lastNode_ = -999999;
    4951    howOften_ = 100;
     
    205207
    206208        const double * currentSolution = solver->getColSolution();
     209        const int * used = model_->usedInSolution();
    207210        OsiSolverInterface * newSolver = cloneBut(3); // was model_->continuousSolver()->clone();
    208211        int numberColumns = newSolver->getNumCols();
     
    229232            if (fabs(currentSolution[iColumn] - valueInt) < 10.0*primalTolerance) {
    230233                double nearest = floor(valueInt + 0.5);
    231                 newSolver->setColLower(iColumn, nearest);
    232                 newSolver->setColUpper(iColumn, nearest);
    233                 nFix++;
     234                /*
     235                  shallowDepth_
     236                  0 - normal
     237                  1 - only fix if at lb
     238                  2 - only fix if not at lb
     239                  3 - only fix if at lb and !used
     240                */
     241                bool fix=false;
     242                switch (shallowDepth_) {
     243                case 0:
     244                  fix = true;
     245                  break;
     246                case 1:
     247                if (nearest==originalLower)
     248                  fix = true;
     249                  break;
     250                case 2:
     251                if (nearest!=originalLower)
     252                  fix = true;
     253                  break;
     254                case 3:
     255                if (nearest==originalLower && !used[iColumn])
     256                  fix = true;
     257                  break;
     258                }
     259                if (fix) {
     260                  newSolver->setColLower(iColumn, nearest);
     261                  newSolver->setColUpper(iColumn, nearest);
     262                  nFix++;
     263                }
    234264            }
    235265        }
Note: See TracChangeset for help on using the changeset viewer.