Ignore:
Timestamp:
May 31, 2011 4:10:30 AM (8 years ago)
Author:
forrest
Message:

allow end cuts and lagomory

File:
1 edited

Legend:

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

    r1641 r1656  
    852852        returnCode = smallBranchAndBound(newSolver, numberNodes_, betterSolution, solutionValue,
    853853                                         model_->getCutoff(), "CbcHeuristicRENS");
    854         if (returnCode < 0) {
    855             returnCode = 0; // returned on size
     854        if (returnCode < 0 || returnCode == 0) {
    856855#ifdef RENS_FIX_CONTINUOUS
    857856            if (numberContinuous > numberIntegers && numberFixed >= numberColumns / 5) {
     
    905904                returnCode = smallBranchAndBound(newSolver, numberNodes_, betterSolution, solutionValue,
    906905                                                 model_->getCutoff(), "CbcHeuristicRENS");
    907 #endif
    908             }
     906            }
     907#endif
     908            if (returnCode < 0 || returnCode == 0) {
     909                // Do passes fixing up those >0.9 and
     910                // down those < 0.05
     911#define RENS_PASS 3
     912              //#define KEEP_GOING
     913#ifdef KEEP_GOING
     914                double * saveLower = CoinCopyOfArray(colLower,numberColumns);
     915                double * saveUpper = CoinCopyOfArray(colUpper,numberColumns);
     916                bool badPass=false;
     917                int nSolved=0;
     918#endif
     919                for (int iPass=0;iPass<RENS_PASS;iPass++) {
     920                  int nFixed=0;
     921                  int nFixedAlready=0;
     922                  int nFixedContinuous=0;
     923                  for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
     924                    if (colUpper[iColumn]>colLower[iColumn]) {
     925                      if (newSolver->isInteger(iColumn)) {
     926                        double value = currentSolution[iColumn];
     927                        double fixTo = floor(value+0.1);
     928                        if (fixTo>value || value-fixTo < 0.05) {
     929                          // above 0.9 or below 0.05
     930                          nFixed++;
     931                          newSolver->setColLower(iColumn, fixTo);
     932                          newSolver->setColUpper(iColumn, fixTo);
     933                        }
     934                      }
     935                    } else if (newSolver->isInteger(iColumn)) {
     936                      nFixedAlready++;
     937                    } else {
     938                      nFixedContinuous++;
     939                    }
     940                  }
     941#ifdef CLP_INVESTIGATE2
     942                  printf("%d more integers fixed (total %d) plus %d continuous\n",
     943                         nFixed,nFixed+nFixedAlready,nFixedContinuous);
     944#endif
     945#ifdef KEEP_GOING
     946                  if (nFixed) {
     947                    newSolver->resolve();
     948                    if (!newSolver->isProvenOptimal()) {
     949                      badPass=true;
     950                      break;
     951                    } else {
     952                      nSolved++;
     953                      memcpy(saveLower,colLower,numberColumns*sizeof(double));
     954                      memcpy(saveUpper,colUpper,numberColumns*sizeof(double));
     955                    }
     956                  } else {
     957                    break;
     958                  }
     959#else
     960                  if (nFixed) {
     961                    newSolver->resolve();
     962                    if (!newSolver->isProvenOptimal()) {
     963                      returnCode=0;
     964                      break;
     965                    }
     966                    returnCode = smallBranchAndBound(newSolver, numberNodes_, betterSolution, solutionValue,
     967                                                     model_->getCutoff(), "CbcHeuristicRENS");
     968                  } else {
     969                    returnCode=0;
     970                  }
     971                  if (returnCode>=0)
     972                    break;
     973                }
     974                if (returnCode < 0)
     975                returnCode = 0; // returned on size
     976#endif
     977            }
     978#ifdef KEEP_GOING
     979            if (badPass) {
     980              newSolver->setColLower(saveLower);
     981              newSolver->setColUpper(saveUpper);
     982              newSolver->resolve();
     983            }
     984            delete [] saveLower;
     985            delete [] saveUpper;
     986            if (nSolved)
     987              returnCode =
     988                smallBranchAndBound(newSolver, numberNodes_, betterSolution, solutionValue,
     989                                    model_->getCutoff(), "CbcHeuristicRENS");
     990            else
     991              returnCode=0;
     992        }
     993#endif
    909994        }
    910995        //printf("return code %d",returnCode);
Note: See TracChangeset for help on using the changeset viewer.