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

add variations to heuristic and when to call tuning

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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);
Note: See TracChangeset for help on using the changeset viewer.