Changeset 1945 for trunk/Cbc/src


Ignore:
Timestamp:
Jul 29, 2013 4:56:04 AM (6 years ago)
Author:
forrest
Message:

adding a dubious heuristic

Location:
trunk/Cbc/src
Files:
2 added
6 edited

Legend:

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

    r1944 r1945  
    833833                        } else if (numberColumns>numberIntegersOrig) {
    834834                          // relax continuous
     835                          bool takeHint;
     836                          OsiHintStrength strength;
     837                          solver->getHintParam(OsiDoDualInResolve, takeHint, strength);
     838                          //solver->setHintParam(OsiDoReducePrint, false, OsiHintTry);
     839                          solver->setHintParam(OsiDoDualInResolve, false, OsiHintDo);
     840                          //solver->setHintParam(OsiDoScale, false, OsiHintDo);
    835841                          solver->resolve();
     842                          solver->setHintParam(OsiDoDualInResolve, takeHint, strength);
    836843                          if (solver->isProvenOptimal()) {
    837844                            memcpy(newSolution,solver->getColSolution(),
    838845                                   numberColumns*sizeof(double));
    839846                            newSolutionValue = -saveOffset;
    840                             for (  i = 0 ; i < numberColumns ; i++ )
     847                            for (  i = 0 ; i < numberColumns ; i++ ) {
    841848                              newSolutionValue += saveObjective[i] * newSolution[i];
     849                            }
    842850                            newSolutionValue *= direction;
    843851                            sprintf(pumpPrint, "Relaxing continuous gives %g", newSolutionValue);
     852                            //#define DEBUG_BEST
     853#ifdef DEBUG_BEST
     854                            {
     855                              int numberColumns=solver->getNumCols();
     856                              FILE * fp = fopen("solution.data2","wb");
     857                              printf("Solution data on file solution.data2\n");
     858                              size_t numberWritten;
     859                              numberWritten=fwrite(&numberColumns,sizeof(int),1,fp);
     860                              assert (numberWritten==1);
     861                              numberWritten=fwrite(&newSolutionValue,sizeof(double),1,fp);
     862                              assert (numberWritten==1);
     863                              numberWritten=fwrite(newSolution,sizeof(double),numberColumns,fp);
     864                              assert (numberWritten==numberColumns);
     865                              fclose(fp);
     866                              const double * rowLower = solver->getRowLower();
     867                              const double * rowUpper = solver->getRowUpper();
     868                              const double * columnLower = solver->getColLower();
     869                              const double * columnUpper = solver->getColUpper();
     870                              int numberRows = solver->getNumRows() ;
     871                              double *rowActivity = new double[numberRows] ;
     872                              memset(rowActivity, 0, numberRows*sizeof(double)) ;
     873                              const double * element = solver->getMatrixByCol()->getElements();
     874                              const int * row = solver->getMatrixByCol()->getIndices();
     875                              const CoinBigIndex * columnStart = solver->getMatrixByCol()->getVectorStarts();
     876                              const int * columnLength = solver->getMatrixByCol()->getVectorLengths();
     877                              double largestAway=0.0;
     878                              int away=-1;
     879                              double saveOffset;
     880                              solver->getDblParam(OsiObjOffset, saveOffset);
     881                              double newSolutionValue = -saveOffset;
     882                              const double * objective = solver->getObjCoefficients();
     883                              for ( int iColumn=0 ; iColumn<numberColumns ; ++iColumn ) {
     884                                double value=newSolution[iColumn];
     885                                CoinBigIndex start = columnStart[iColumn];
     886                                CoinBigIndex end = start + columnLength[iColumn];
     887                                for (CoinBigIndex j = start; j < end; j++) {
     888                                  int iRow = row[j];
     889                                  if (iRow==1996)
     890                                    printf("fp col %d val %g el %g old y %g\n",
     891                                  iColumn,value,element[j],rowActivity[iRow]);
     892                                  rowActivity[iRow] += value * element[j];
     893                                }
     894                                newSolutionValue += objective[iColumn] * newSolution[iColumn];
     895                                if (solver->isInteger(iColumn)) {
     896                                  double intValue = floor(value+0.5);
     897                                  if (fabs(value-intValue)>largestAway) {
     898                                    largestAway=fabs(value-intValue);
     899                                    away=iColumn;
     900                                  }
     901                                }
     902                              }
     903                              printf("Largest away from int at column %d was %g - obj %g\n",away,
     904                                     largestAway,newSolutionValue);
     905                              double largestInfeasibility=0.0;
     906                              for (int i = 0 ; i < numberRows ; i++) {
     907#if 0 //def CLP_INVESTIGATE
     908                                double inf;
     909                                inf = rowLower[i] - rowActivity[i];
     910                                if (inf > primalTolerance)
     911                                  printf("Row %d inf %g sum %g %g <= %g <= %g\n",
     912                                         i, inf, rowSum[i], rowLower[i], rowActivity[i], rowUpper[i]);
     913                                inf = rowActivity[i] - rowUpper[i];
     914                                if (inf > primalTolerance)
     915                                  printf("Row %d inf %g %g <= %g <= %g\n",
     916                                         i, inf, rowLower[i], rowActivity[i], rowUpper[i]);
     917#endif
     918                                double infeasibility = CoinMax(rowActivity[i]-rowUpper[i],
     919                                                               rowLower[i]-rowActivity[i]);
     920                                if (infeasibility>largestInfeasibility) {
     921                                  largestInfeasibility = infeasibility;
     922                                  printf("Binf of %g on row %d\n",
     923                                         infeasibility,i);
     924                                }
     925                              }
     926                              delete [] rowActivity ;
     927                              printf("Blargest infeasibility is %g - obj %g\n", largestInfeasibility,newSolutionValue);
     928                            }
     929#endif
    844930                          } else {
    845931                            sprintf(pumpPrint,"Infeasible when relaxing continuous!\n");
  • trunk/Cbc/src/CbcModel.cpp

    r1943 r1945  
    1492414924                        line << CoinMessageEol ;
    1492514925                    }
     14926                    //#define DEBUG_BEST
     14927#ifdef DEBUG_BEST
     14928  FILE * fp = fopen("solution.data","rb");
     14929  if (!fp&&ifSol>0) {
     14930    int numberColumns=getNumCols();
     14931    fp = fopen("solution.data","wb");
     14932    printf("Solution data on file solution.data\n");
     14933    size_t numberWritten;
     14934    numberWritten=fwrite(&numberColumns,sizeof(int),1,fp);
     14935    assert (numberWritten==1);
     14936    numberWritten=fwrite(&heuristicValue,sizeof(double),1,fp);
     14937    assert (numberWritten==1);
     14938    numberWritten=fwrite(newSolution,sizeof(double),numberColumns,fp);
     14939    assert (numberWritten==numberColumns);
     14940    fclose(fp);
     14941  } else if (fp) {
     14942    int numberColumns=getNumCols();
     14943    int numberColumnsX;
     14944    size_t numberRead;
     14945    numberRead=fread(&numberColumnsX,sizeof(int),1,fp);
     14946    assert (numberRead==1);
     14947    if (numberColumns==numberColumnsX) {
     14948      numberRead=fread(&heuristicValue,sizeof(double),1,fp);
     14949      assert (numberRead==1);
     14950      numberRead=fread(newSolution,sizeof(double),numberColumns,fp);
     14951      assert (numberRead==numberColumns);
     14952      ifSol=1;
     14953    }
     14954    fclose(fp);
     14955  }
     14956#endif
    1492614957                    if (ifSol > 0) {
    1492714958                        // better solution found
  • trunk/Cbc/src/CbcSolver.cpp

    r1943 r1945  
    30173017                    case CBC_PARAM_ACTION_DOHEURISTIC:
    30183018                        if (goodModel) {
     3019#ifndef CBC_USE_INITIAL_TIME
     3020                          if (model_.useElapsedTime())
     3021                            model_.setDblParam(CbcModel::CbcStartSeconds, CoinGetTimeOfDay());
     3022                          else
     3023                            model_.setDblParam(CbcModel::CbcStartSeconds, CoinCpuTime());
     3024#endif
    30193025                            int vubAction = parameters_[whichParam(CBC_PARAM_INT_VUBTRY, numberParameters_, parameters_)].intValue();
    30203026                            if (vubAction != -1) {
     
    30473053                            }
    30483054                            // Actually do heuristics
     3055                            // may need to flip objective
     3056                            bool needFlip = model_.solver()->getObjSense()<0.0;
     3057                            if (needFlip)
     3058                              model_.flipModel();
     3059                            //if we do then - fix priorities in clonebutmodel_.convertToDynamic();
    30493060                            doHeuristics(&model_, 2, parameters_,
    30503061                                         numberParameters_, noPrinting_, initialPumpTune);
     3062                            if (needFlip)
     3063                              model_.flipModel();
    30513064                            if (model_.bestSolution()) {
    30523065                                model_.setProblemStatus(1);
  • trunk/Cbc/src/CbcSolverHeuristics.cpp

    r1899 r1945  
    3030#include "CbcHeuristicFPump.hpp"
    3131#include "CbcHeuristicRINS.hpp"
     32#include "CbcHeuristicDW.hpp"
    3233
    3334#include "CbcHeuristicDiveCoefficient.hpp"
     
    11681169    int useDIVING2 = parameters_[whichParam(CBC_PARAM_STR_DIVINGS, numberParameters_, parameters_)].currentOptionAsInteger();
    11691170    int useNaive = parameters_[whichParam(CBC_PARAM_STR_NAIVE, numberParameters_, parameters_)].currentOptionAsInteger();
     1171    int useDW = parameters_[whichParam(CBC_PARAM_STR_DW, numberParameters_, parameters_)].currentOptionAsInteger();
    11701172    int kType = (type < 10) ? type : 1;
    11711173    assert (kType == 1 || kType == 2);
     
    15891591        anyToDo = true;
    15901592    }
     1593    if (useDW >= kType && useDW <= kType + 1) {
     1594        CbcHeuristicDW heuristic13(*model);
     1595        heuristic13.setHeuristicName("Dantzig-Wolfe");
     1596        heuristic13.setNumberPasses(100);
     1597        int numberIntegers=0;
     1598        const OsiSolverInterface * solver = model->solver();
     1599        int numberColumns = solver->getNumCols();
     1600        for (int i=0;i<numberColumns;i++) {
     1601          if(solver->isInteger(i))
     1602            numberIntegers++;
     1603        }
     1604        heuristic13.setNumberNeeded(CoinMin(200,numberIntegers/10));
     1605        model->addHeuristic(&heuristic13);
     1606        anyToDo = true;
     1607    }
    15911608    if (useCombine >= kType && useCombine <= kType + 1) {
    15921609        CbcHeuristicLocal heuristic2(*model);
  • trunk/Cbc/src/Makefile.am

    r1935 r1945  
    7373        CbcHeuristicRINS.cpp CbcHeuristicRINS.hpp \
    7474        CbcHeuristicVND.cpp CbcHeuristicVND.hpp \
     75        CbcHeuristicDW.cpp CbcHeuristicDW.hpp \
    7576        CbcMessage.cpp CbcMessage.hpp \
    7677        CbcModel.cpp CbcModel.hpp \
     
    238239        CbcHeuristicRINS.hpp \
    239240        CbcHeuristicVND.hpp \
     241        CbcHeuristicDW.hpp \
    240242        CbcMessage.hpp \
    241243        CbcModel.hpp \
  • trunk/Cbc/src/Makefile.in

    r1935 r1945  
    109109        CbcHeuristicPivotAndFix.lo CbcHeuristicRandRound.lo \
    110110        CbcHeuristicRENS.lo CbcHeuristicRINS.lo CbcHeuristicVND.lo \
    111         CbcMessage.lo CbcModel.lo CbcNode.lo CbcNodeInfo.lo CbcNWay.lo \
    112         CbcObject.lo CbcObjectUpdateData.lo CbcPartialNodeInfo.lo \
    113         CbcSimpleInteger.lo CbcSimpleIntegerDynamicPseudoCost.lo \
     111        CbcHeuristicDW.lo CbcMessage.lo CbcModel.lo CbcNode.lo \
     112        CbcNodeInfo.lo CbcNWay.lo CbcObject.lo CbcObjectUpdateData.lo \
     113        CbcPartialNodeInfo.lo CbcSimpleInteger.lo \
     114        CbcSimpleIntegerDynamicPseudoCost.lo \
    114115        CbcSimpleIntegerPseudoCost.lo CbcSOS.lo CbcStatistics.lo \
    115116        CbcStrategy.lo CbcSubProblem.lo CbcThread.lo CbcTree.lo \
     
    569570        CbcHeuristicRINS.cpp CbcHeuristicRINS.hpp \
    570571        CbcHeuristicVND.cpp CbcHeuristicVND.hpp \
     572        CbcHeuristicDW.cpp CbcHeuristicDW.hpp \
    571573        CbcMessage.cpp CbcMessage.hpp \
    572574        CbcModel.cpp CbcModel.hpp \
     
    698700        CbcHeuristicRINS.hpp \
    699701        CbcHeuristicVND.hpp \
     702        CbcHeuristicDW.hpp \
    700703        CbcMessage.hpp \
    701704        CbcModel.hpp \
     
    895898@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CbcHeuristic.Plo@am__quote@
    896899@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CbcHeuristicDINS.Plo@am__quote@
     900@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CbcHeuristicDW.Plo@am__quote@
    897901@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CbcHeuristicDive.Plo@am__quote@
    898902@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CbcHeuristicDiveCoefficient.Plo@am__quote@
Note: See TracChangeset for help on using the changeset viewer.