Changeset 2105


Ignore:
Timestamp:
Jan 5, 2015 8:11:11 AM (4 years ago)
Author:
forrest
Message:

mostly reporting options plus a few tweaks

Location:
trunk/Cbc/src
Files:
8 edited

Legend:

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

    r2094 r2105  
    619619                OsiRowCut * thisCut = cs.rowCutPtr(k) ;
    620620#ifdef CGL_DEBUG
    621                 if (debugger && debugger->onOptimalPath(*solver))
     621                if (debugger && debugger->onOptimalPath(*solver)) {
    622622                    assert(!debugger->invalidCut(*thisCut));
     623                    if(debugger->invalidCut(*thisCut))
     624                      abort();
     625                }
    623626#endif
    624627                thisCut->mutableRow().setTestForDuplicateIndex(false);
  • trunk/Cbc/src/CbcHeuristicLocal.cpp

    r2094 r2105  
    553553    // Switch off if may take too long
    554554    if (model_->getNumCols() > 10000 && model_->getNumCols() >
    555             10*model_->getNumRows())
     555            10*model_->getNumRows()&&swap<10)
    556556        tryHeuristic = false;
    557557/*
     
    566566        // maybe just do 1000
    567567        int maxIntegers = numberIntegers;
    568         if (((swap/10) &1) != 0) {
    569           maxIntegers = CoinMin(1000,numberIntegers);
     568        // stop if too many goes
     569        int maxTries=COIN_INT_MAX;
     570        // integerVariable may be randomized copy!
     571        int * integerVariable =
     572          CoinCopyOfArray(model_->integerVariable(),numberIntegers);
     573        if (swap>9 && numberIntegers>500) {
     574          int type=swap/10;
     575          if (type==1) {
     576            // reduce
     577            maxIntegers = CoinMin(1000,numberIntegers);
     578          } else if (type==2) {
     579            // reduce even more
     580            maxTries=100000;
     581            maxIntegers = CoinMin(500,numberIntegers);
     582          } else if (type>2) {
     583            assert (type<10);
     584            int totals[7]={1000,500,100,50,50,50,50};
     585            maxIntegers=CoinMin(totals[type-3],numberIntegers);
     586            double * weight = new double[numberIntegers];
     587            for (int i=0;i<numberIntegers;i++) {
     588              weight[i]=model_->randomNumberGenerator()->randomDouble();
     589            }
     590            CoinSort_2(weight,weight+numberIntegers,integerVariable);
     591          }
    570592        }
    571593/*
     
    622644              // try down
    623645                for (k = i + 1; k < endInner; k++) {
     646                    if (!maxTries)
     647                      break;
     648                    maxTries--;
    624649                    if ((way[k]&1) != 0) {
    625650                        // try down
     
    712737                // try up
    713738                for (k = i + 1; k < endInner; k++) {
     739                    if (!maxTries)
     740                      break;
    714741                    if ((way[k]&1) != 0) {
    715742                        // try down
     
    897924            }
    898925        }
     926        // This is just a copy!
     927        delete [] integerVariable;
    899928    }
    900929/*
  • trunk/Cbc/src/CbcHeuristicRENS.cpp

    r2094 r2105  
    3333    whereFrom_ = 256 + 1;
    3434}
    35 
    3635// Constructor with model - assumed before cuts
    3736
     
    8786    int returnCode = 0;
    8887    const double * bestSolution = model_->bestSolution();
     88    bool returnNow=false;
    8989    if ((numberTries_&&(rensType_&16)==0) || numberTries_>1 || (when() < 2 && bestSolution))
     90      returnNow=true;;
     91    // If 32 bit set then do once with bestSolution
     92    if ((rensType_&32)!=0&&bestSolution)
     93      returnNow=false;
     94    if (returnNow)
    9095        return 0;
     96    // switch off next time if bestSolution
     97    if (bestSolution) {
     98      if ((rensType_&32)!=0)
     99        rensType_ &= ~32; // switch off but leave bestSolution
     100      else
     101        bestSolution=NULL; // null bestSolution so won't use
     102    }
    91103    numberTries_++;
    92104#ifdef HEURISTIC_INFORM
     
    740752    int numberAtBound = 0;
    741753    int numberContinuous = numberColumns - numberIntegers;
    742 
     754    /*
     755      0 - allow fixing
     756      1 - don't allow fixing
     757     */
     758    char * marked = new char [numberColumns];
     759    memset(marked,0,numberColumns);
     760    if (bestSolution) {
     761      for (i = 0; i < numberIntegers; i++) {
     762        int iColumn = integerVariable[i];
     763        double value = currentSolution[iColumn];
     764        double lower = colLower[iColumn];
     765        double upper = colUpper[iColumn];
     766        value = CoinMax(value, lower);
     767        value = CoinMin(value, upper);
     768        if (fabs(bestSolution[iColumn]-value)>0.999)
     769          marked[iColumn]=1;
     770      }
     771    }
     772    if ((rensType_&(64|128))!=0&&model_->objects()) {
     773      int lowPriority=-COIN_INT_MAX;
     774      int highPriority=COIN_INT_MAX;
     775      for (i = 0; i < numberIntegers; i++) {
     776        int priority=model_->priority(i);
     777        lowPriority=CoinMax(lowPriority,priority);
     778        highPriority=CoinMin(highPriority,priority);
     779      }
     780      if (highPriority<lowPriority) {
     781        int keepPriority=((rensType_&64)!=0) ? highPriority : lowPriority;
     782        for (i = 0; i < numberIntegers; i++) {
     783          int iColumn = integerVariable[i];
     784          int priority=model_->priority(i);
     785          if (priority==keepPriority)
     786            marked[iColumn]=1;
     787        }
     788      }
     789    }
    743790    for (i = 0; i < numberIntegers; i++) {
    744791        int iColumn = integerVariable[i];
     
    749796        value = CoinMin(value, upper);
    750797        double djValue=dj[iColumn]*direction;
     798        bool dontFix=marked[iColumn]!=0;
    751799#define RENS_FIX_ONLY_LOWER
    752800#ifndef RENS_FIX_ONLY_LOWER
    753801        if (fabs(value - floor(value + 0.5)) < 1.0e-8) {
    754802            value = floor(value + 0.5);
     803            if (dontFix) {
     804              continue;
     805            }
    755806            if (value == lower || value == upper)
    756807                numberAtBound++;
     
    767818                floor(value + 0.5) == lower &&
    768819            djValue > djTolerance ) {
     820            if (dontFix) {
     821              continue;
     822            }
    769823          value = floor(value + 0.5);
    770824          numberAtBound++;
     
    776830                   -djValue > djTolerance && (djTolerance > 0.0||type==2)) {
    777831          value = floor(value + 0.5);
     832            if (dontFix) {
     833              continue;
     834            }
    778835          numberAtBound++;
    779836          newSolver->setColLower(iColumn, value);
     
    798855#endif
    799856    }
     857    delete [] marked;
    800858    delete [] dj;
    801859    if (numberFixed > numberIntegers / 5) {
  • trunk/Cbc/src/CbcHeuristicRENS.hpp

    r1899 r2105  
    6767        3 - fix on 0.01*average dj
    6868        add 16 to allow two tries
     69        32 - if solution exists use to keep more variables
     70        64 - if priorities keep high priority
     71        128 - if priorities keep low priority
    6972    */
    7073    int rensType_;
  • trunk/Cbc/src/CbcModel.cpp

    r2104 r2105  
    91809180        for (i = 0; i < numberNewCuts_; i++) {
    91819181            int iGenerator = whichGenerator_[i];
    9182             assert (iGenerator>=0);
     9182            //assert (iGenerator>=0);
    91839183            if (iGenerator>=0)
    91849184              iGenerator=iGenerator%10000;
  • trunk/Cbc/src/CbcSolver.cpp

    r2094 r2105  
    1008910089    parameters[whichParam(CBC_PARAM_STR_FPUMP, numberParameters, parameters)].setCurrentOption("on");
    1009010090    parameters[whichParam(CBC_PARAM_STR_GREEDY, numberParameters, parameters)].setCurrentOption("on");
    10091     parameters[whichParam(CBC_PARAM_STR_COMBINE, numberParameters, parameters)].setCurrentOption("on");
     10091    parameters[whichParam(CBC_PARAM_STR_COMBINE, numberParameters, parameters)].setCurrentOption("off");
    1009210092    parameters[whichParam(CBC_PARAM_STR_CROSSOVER2, numberParameters, parameters)].setCurrentOption("off");
    1009310093    parameters[whichParam(CBC_PARAM_STR_PIVOTANDCOMPLEMENT, numberParameters, parameters)].setCurrentOption("off");
  • trunk/Cbc/src/CbcSolverHeuristics.cpp

    r2093 r2105  
    13911391        model->addHeuristic(&heuristic6a) ;
    13921392    }
    1393     if (useRENS >= kType && useRENS <= kType + 1) {
     1393    if ((useRENS >= kType && useRENS <= kType + 1)||
     1394        useRENS>2) {
    13941395        CbcHeuristicRENS heuristic6(*model);
    13951396        heuristic6.setHeuristicName("RENS");
    13961397        heuristic6.setFractionSmall(0.4);
    13971398        heuristic6.setFeasibilityPumpOptions(1008003);
    1398         int nodes [] = { -2, 50, 50, 50, 200, 1000, 10000};
     1399        int nodes [] = { -2, 50, 50, 50, 200, 1000, 10000, -1, -1, 200};
    13991400        heuristic6.setNumberNodes(nodes[useRENS]);
     1401        heuristic6.setRensType(useRENS!=9 ? 0 : 32);
    14001402        model->addHeuristic(&heuristic6) ;
    14011403        anyToDo = true;
     
    16291631        anyToDo = true;
    16301632    }
    1631     if (useCombine >= kType && useCombine <= kType + 1) {
     1633    if (useCombine >= kType && (useCombine-1)%3 <= kType ) {
    16321634        CbcHeuristicLocal heuristic2(*model);
    16331635        heuristic2.setHeuristicName("combine solutions");
    16341636        heuristic2.setFractionSmall(0.5);
    1635         heuristic2.setSearchType(1);
     1637        int searchType=1;
     1638        if (useCombine>3)
     1639          searchType += 10; // experiment
     1640        heuristic2.setSearchType(searchType);
    16361641        model->addHeuristic(&heuristic2);
    16371642        anyToDo = true;
  • trunk/Cbc/src/unitTestClp.cpp

    r2097 r2105  
    583583#     endif
    584584      if (stuff && stuff[8] >= 1) {
    585         printf("CCColumns %d rows %d - depth %d\n",
     585        printf("Fast node size Columns %d rows %d - depth %d\n",
    586586               modelC->numberColumns(),modelC->numberRows(),
    587587               model->fastNodeDepth());
Note: See TracChangeset for help on using the changeset viewer.