Changeset 1955 for trunk/Cbc/src


Ignore:
Timestamp:
Aug 12, 2013 3:33:18 PM (6 years ago)
Author:
forrest
Message:

add more twiddles for advanced use of heuristics

Location:
trunk/Cbc/src
Files:
4 edited

Legend:

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

    r1953 r1955  
    595595        const CoinBigIndex * columnStart = solver->getMatrixByCol()->getVectorStarts();
    596596        const int * columnLength = solver->getMatrixByCol()->getVectorLengths();
    597         for (int i=0;i<numberBlocks_;i++)
    598           whichBlock[i]=i;
     597        int numberUsed=0;
    599598        for (int iBlock=0;iBlock<numberBlocks_;iBlock++) {
    600599          int start=startColumnBlock_[iBlock];
     
    607606                       columnsInBlock_+startColumnBlock_[iBlock]);
    608607          tempModel->setLogLevel(0);
     608          tempModel->setDualObjectiveLimit(COIN_DBL_MAX);
    609609          double * objectiveX = tempModel->objective();
    610610          double * columnLowerX = tempModel->columnLower();
     
    613613            int jColumn=i-start;
    614614            int iColumn=columnsInBlock_[i];
    615             columnLowerX[jColumn]=saveLower_[iColumn];
    616             columnUpperX[jColumn]=saveUpper_[iColumn];
     615            columnLowerX[jColumn]=CoinMax(saveLower_[iColumn],-1.0e12);
     616            columnUpperX[jColumn]=CoinMin(saveUpper_[iColumn],1.0e12);
    617617            if (solver->isInteger(iColumn))
    618618              tempModel->setInteger(jColumn);
     
    633633          modelX.branchAndBound();
    634634          const double * bestSolutionX = modelX.bestSolution();
    635           assert (bestSolutionX);
    636           for (int i=start;i<end;i++) {
    637             int jColumn = i-start;
    638             int iColumn=columnsInBlock_[i];
    639             bestSolution2[iColumn]=bestSolutionX[jColumn];
    640           }
    641         }
    642         addDW(bestSolution2,numberBlocks_,whichBlock);
     635          if (bestSolutionX) {
     636            whichBlock[numberUsed++]=iBlock;
     637            for (int i=start;i<end;i++) {
     638              int jColumn = i-start;
     639              int iColumn=columnsInBlock_[i];
     640              bestSolution2[iColumn]=bestSolutionX[jColumn];
     641            }
     642          }
     643        }
     644        addDW(bestSolution2,numberUsed,whichBlock);
    643645        // now try purer DW
    644646        bool takeHint;
     
    649651        dwSolver_->setHintParam(OsiDoDualInResolve, takeHint, OsiHintDo);
    650652        duals = dwSolver_->getRowPrice();
     653        numberUsed=0;
    651654        for (int iBlock=0;iBlock<numberBlocks_;iBlock++) {
    652655          int start=startColumnBlock_[iBlock];
     
    659662                       columnsInBlock_+startColumnBlock_[iBlock]);
    660663          tempModel->setLogLevel(0);
     664          tempModel->setDualObjectiveLimit(COIN_DBL_MAX);
    661665          double * objectiveX = tempModel->objective();
    662666          double * columnLowerX = tempModel->columnLower();
     
    666670            int jColumn=i-start;
    667671            int iColumn=columnsInBlock_[i];
    668             columnLowerX[jColumn]=saveLower_[iColumn];
     672            columnLowerX[jColumn]=CoinMax(saveLower_[iColumn],-1.0e12);
    669673            columnUpperX[jColumn]=CoinMin(saveUpper_[iColumn],1.0e-12);
    670674            if (solver->isInteger(iColumn))
     
    691695                 iBlock,cObj,modelX.getObjValue(),convexityDual);
    692696          const double * bestSolutionX = modelX.bestSolution();
    693           assert (bestSolutionX);
    694           for (int i=start;i<end;i++) {
    695             int iColumn=columnsInBlock_[i];
    696             bestSolution2[iColumn]=bestSolutionX[i-start];
    697           }
    698         }
    699         addDW(bestSolution2,numberBlocks_,whichBlock);
     697          if (bestSolutionX) {
     698            whichBlock[numberUsed++]=iBlock;
     699            for (int i=start;i<end;i++) {
     700              int iColumn=columnsInBlock_[i];
     701              bestSolution2[iColumn]=bestSolutionX[i-start];
     702            }
     703          }
     704        }
     705        addDW(bestSolution2,numberUsed,whichBlock);
    700706        delete [] bestSolution2;
    701707      }
     
    20352041  tempModel->addRows(numberBlocks_,rhs,rhs,NULL,NULL,NULL);
    20362042  delete [] rhs;
    2037   dwSolver_ = new OsiClpSolverInterface(tempModel,true);
     2043  OsiClpSolverInterface * clpSolver = new OsiClpSolverInterface(tempModel,true);
     2044  clpSolver->getModelPtr()->setDualObjectiveLimit(COIN_DBL_MAX);
     2045  dwSolver_ = clpSolver;
    20382046  printf("DW model has %d master rows, %d master columns and %d convexity rows\n",
    20392047         numberMasterRows,numberMasterColumns,numberBlocks_);
  • trunk/Cbc/src/CbcHeuristicDW.hpp

    r1951 r1955  
    146146    { return whichColumnBlock_;}
    147147    /// Initial Lower bounds
    148     inline const double * initialLower() const
     148    inline double * initialLower() const
    149149    { return saveLower_;}
    150150    /// Initial Upper bounds
    151     inline const double * initialUpper() const
     151    inline double * initialUpper() const
    152152    { return saveUpper_;}
    153153    /// Local integer arrays (each numberBlocks_ long)
  • trunk/Cbc/src/CbcHeuristicFPump.cpp

    r1954 r1955  
    311311    const double * upper = model_->solver()->getColUpper();
    312312    bool doGeneral = (accumulate_ & 4) != 0;
     313    int numberUnsatisfied=0;
     314    double sumUnsatisfied=0.0;
     315    const double * initialSolution = model_->solver()->getColSolution();
    313316    j = 0;
    314317/*
     
    329332        assert(integerObject || integerObject2);
    330333#endif
     334        double value = initialSolution[iColumn];
     335        double nearest = floor(value + 0.5);
     336        sumUnsatisfied += fabs(value - nearest);
     337        if (fabs(value - nearest) > 1.0e-6)
     338          numberUnsatisfied++;
    331339        if (upper[iColumn] - lower[iColumn] > 1.000001) {
    332340            general++;
     
    368376        printf("DOing general with %d out of %d\n", general, numberIntegers);
    369377#endif
     378    sprintf(pumpPrint, "Initial state - %d integers unsatisfied sum - %g",
     379            numberUnsatisfied, sumUnsatisfied);
     380    model_->messageHandler()->message(CBC_FPUMP1, model_->messages())
     381      << pumpPrint
     382      << CoinMessageEol;
    370383/*
    371384  This `closest solution' will satisfy integrality, but violate some other
     
    576589        // if cutoff exists then add constraint
    577590        bool useCutoff = (fabs(cutoff) < 1.0e20 && (fakeCutoff_ != COIN_DBL_MAX || numberTries > 1));
     591        bool tryOneClosePass=fakeCutoff_<solver->getObjValue();
    578592        // but there may be a close one
    579593        if (firstCutoff < 2.0*solutionValue && numberTries == 1 && CoinMin(cutoff, fakeCutoff_) < 1.0e20)
    580594            useCutoff = true;
    581         if (useCutoff) {
     595        if (useCutoff || tryOneClosePass) {
    582596            double rhs = CoinMin(cutoff, fakeCutoff_);
     597            if (tryOneClosePass) {
     598              // If way off then .05
     599              if (fakeCutoff_<=-1.0e100) {
     600                // use value as percentage - so 100==0.0, 101==1.0 etc
     601                // probably something like pow I could use but ...
     602                double fraction = 0.0;
     603                while (fakeCutoff_<-1.01e100) {
     604                  fakeCutoff_ *= 0.1;
     605                  fraction += 0.01;
     606                }
     607                rhs = solver->getObjValue()+fraction*fabs(solver->getObjValue());
     608              } else {
     609                rhs = 2.0*solver->getObjValue()-fakeCutoff_; // flip difference
     610              }
     611              fakeCutoff_=COIN_DBL_MAX;
     612            }
    583613            const double * objective = solver->getObjCoefficients();
    584614            int numberColumns = solver->getNumCols();
     
    10961126                int numberChanged = 0;
    10971127                const double * oldObjective = solver->getObjCoefficients();
     1128                bool fixOnesAtBound=false;
     1129                if (tryOneClosePass&&numberPasses==2) {
     1130                  // take off
     1131                  tryOneClosePass=false;
     1132                  int n=solver->getNumRows()-1;
     1133                  double rhs = solver->getRowUpper()[n];
     1134                  solver->setRowUpper(n,rhs+1.0e15);
     1135                  useRhs+=1.0e15;
     1136                  fixOnesAtBound=true;
     1137                }
    10981138                for (i = 0; i < numberColumns; i++) {
    10991139                    // below so we can keep original code and allow for objective
     
    11151155                    if (newSolution[iColumn] < lower[iColumn] + primalTolerance) {
    11161156                      newValue = costValue + scaleFactor * saveObjective[iColumn];
     1157                      if (fixOnesAtBound)
     1158                        newValue = 100.0*costValue;
    11171159                    } else {
    11181160                      if (newSolution[iColumn] > upper[iColumn] - primalTolerance) {
    11191161                        newValue = -costValue + scaleFactor * saveObjective[iColumn];
     1162                      if (fixOnesAtBound)
     1163                        newValue = -100.0*costValue;
    11201164                      }
    11211165                    }
  • trunk/Cbc/src/CbcSolverHeuristics.cpp

    r1945 r1955  
    12961296                if (fakeIncrement)
    12971297                    increment = fakeIncrement;
    1298                 heuristic4.setAbsoluteIncrement(increment);
     1298                if (increment>=0.0)
     1299                  heuristic4.setAbsoluteIncrement(increment);
     1300                else
     1301                  heuristic4.setRelativeIncrement(-increment);
    12991302                heuristic4.setMaximumRetries(r + 1);
    13001303                if (printStuff) {
    13011304                    if (increment) {
    1302                         sprintf(generalPrint, "Increment of %g", increment);
     1305                      if (increment>0.0)
     1306                        sprintf(generalPrint, "Absolute increment of %g", increment);
     1307                      else
     1308                        sprintf(generalPrint, "Relative increment of %g", -increment);
    13031309                        generalMessageHandler->message(CBC_GENERAL, generalMessages)
    13041310                        << generalPrint
Note: See TracChangeset for help on using the changeset viewer.