Ignore:
Timestamp:
Aug 31, 2010 7:14:51 AM (9 years ago)
Author:
forrest
Message:

a few more rens heuristics

File:
1 edited

Legend:

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

    r1432 r1499  
    2424#include "CbcStrategy.hpp"
    2525#include "CglPreProcess.hpp"
     26#include "CglGomory.hpp"
    2627#include "CglProbing.hpp"
    2728#include "OsiAuxInfo.hpp"
     
    830831    solver->setHintParam(OsiDoReducePrint, true, OsiHintTry);
    831832    solver->setHintParam(OsiDoPresolveInInitial, false, OsiHintTry);
    832     solver->setDblParam(OsiDualObjectiveLimit, cutoff*solver->getObjSense());
     833    double signedCutoff = cutoff*solver->getObjSense();
     834    solver->setDblParam(OsiDualObjectiveLimit, signedCutoff);
    833835    solver->initialSolve();
    834836    if (solver->isProvenOptimal()) {
     
    896898                    // No small fathoming
    897899                    model.setFastNodeDepth(-1);
    898                     model.setCutoff(cutoff);
     900                    model.setCutoff(signedCutoff);
     901                    // Don't do if original fraction > 1.0 and too large
     902                    if (fractionSmall_>1.0) {
     903                      /* 1.4 means -1 nodes if >.4
     904                         2.4 means -1 nodes if >.5 and 0 otherwise
     905                         3.4 means -1 nodes if >.6 and 0 or 5
     906                         4.4 means -1 nodes if >.7 and 0, 5 or 10
     907                      */
     908                      double fraction = fractionSmall_-floor(fractionSmall_);
     909                      if (ratio>fraction) {
     910                        int type = static_cast<int>(floor(fractionSmall_*0.1));
     911                        int over = static_cast<int>(ceil(ratio-fraction));
     912                        int maxNodes[]={-1,0,5,10};
     913                        if (type>over)
     914                          numberNodes=maxNodes[type-over];
     915                        else
     916                          numberNodes=-1;
     917                      }
     918                    }
    899919                    model.setMaximumNodes(numberNodes);
    900920                    model.solver()->setHintParam(OsiDoReducePrint, true, OsiHintTry);
     
    913933                    model.gutsOfCopy(*model_, 2);
    914934                    for (int i = 0; i < model.numberCutGenerators(); i++) {
    915                         model.cutGenerator(i)->setTiming(true);
     935                        CbcCutGenerator * generator = model.cutGenerator(i);
     936                        CglGomory * gomory = dynamic_cast<CglGomory *>
     937                          (generator->generator());
     938                        if (gomory&&gomory->originalSolver())
     939                          gomory->passInOriginalSolver(model.solver());
     940                        generator->setTiming(true);
    916941                        // Turn on if was turned on
    917942                        int iOften = model_->cutGenerator(i)->howOften();
    918943#ifdef CLP_INVESTIGATE
    919944                        printf("Gen %d often %d %d\n",
    920                                i, model.cutGenerator(i)->howOften(),
     945                               i, generator->howOften(),
    921946                               iOften);
    922947#endif
    923948                        if (iOften > 0)
    924                             model.cutGenerator(i)->setHowOften(iOften % 1000000);
     949                            generator->setHowOften(iOften % 1000000);
    925950                        if (model_->cutGenerator(i)->howOftenInSub() == -200)
    926                             model.cutGenerator(i)->setHowOften(-100);
     951                            generator->setHowOften(-100);
    927952                    }
    928                     model.setCutoff(cutoff);
     953                    model.setCutoff(signedCutoff);
    929954                    // make sure can't do nested search! but allow heuristics
    930955                    model.setSpecialOptions((model.specialOptions()&(~(512 + 2048))) | 1024);
     
    9781003                    if (!gotPump) {
    9791004                        CbcHeuristicFPump heuristic4;
    980                         heuristic4.setMaximumPasses(10);
     1005                        if (fractionSmall_<=1.0)
     1006                          heuristic4.setMaximumPasses(10);
    9811007                        int pumpTune = feasibilityPumpOptions_;
    9821008                        if (pumpTune > 0) {
     
    10961122                        double value = solver3->getObjSense() * solver3->getObjValue();
    10971123                        heuristic.setInputSolution(solver3->getColSolution(), value);
    1098                         model.setCutoff(value + 1.0e-7*(1.0 + fabs(value)));
     1124                        value = value + 1.0e-7*(1.0 + fabs(value));
     1125                        value *= solver3->getObjSense();
     1126                        model.setCutoff(value);
    10991127                        model.addHeuristic(&heuristic, "Previous solution", 0);
    11001128                        //printf("added seren\n");
    11011129                    } else {
    11021130                        double value = model_->getMinimizationObjValue();
    1103                         model.setCutoff(value + 1.0e-7*(1.0 + fabs(value)));
     1131                        value = value + 1.0e-7*(1.0 + fabs(value));
     1132                        value *= solver3->getObjSense();
     1133                        model.setCutoff(value);
    11041134#ifdef CLP_INVESTIGATE
    11051135                        printf("NOT added seren\n");
     
    11261156                    }
    11271157                    model.setWhenCuts(999998);
     1158#define ALWAYS_DUAL
     1159#ifdef ALWAYS_DUAL
     1160                    OsiSolverInterface * solver = model.solver();
     1161                    bool takeHint;
     1162                    OsiHintStrength strength;
     1163                    solver->getHintParam(OsiDoDualInResolve, takeHint, strength);
     1164                    solver->setHintParam(OsiDoDualInResolve, true, OsiHintDo);
     1165#endif
    11281166                    model.branchAndBound();
     1167#ifdef ALWAYS_DUAL
     1168                    solver->setHintParam(OsiDoDualInResolve, takeHint, strength);
     1169#endif
    11291170#ifdef COIN_DEVELOP
    11301171                    printf("sub branch %d nodes, %d iterations - max %d\n",
     
    11811222#endif
    11821223                    process.postProcess(*model.solver());
    1183                     if (solver->isProvenOptimal() && solver->getObjValue() < cutoff) {
     1224                    if (solver->isProvenOptimal() && solver->getObjValue()*solver->getObjSense() < cutoff) {
    11841225                        // Solution now back in solver
    11851226                        int numberColumns = solver->getNumCols();
Note: See TracChangeset for help on using the changeset viewer.