Changeset 1769 for trunk


Ignore:
Timestamp:
Feb 29, 2012 3:48:21 AM (7 years ago)
Author:
forrest
Message:

changes to allow multiple solutions in standalone executable

Location:
trunk/Cbc/src
Files:
3 edited

Legend:

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

    r1764 r1769  
    1505815058    }
    1505915059}
     15060// Delete a saved solution and move others up
     15061void
     15062CbcModel::deleteSavedSolution(int which)
     15063{
     15064  if (which >0 && which <= numberSavedSolutions_) {
     15065    delete [] savedSolutions_[which-1];
     15066    // move up
     15067    numberSavedSolutions_--;
     15068    for (int j =  which-1; j <numberSavedSolutions_; j++) {
     15069      savedSolutions_[j] = savedSolutions_[j+1];
     15070    }
     15071    savedSolutions_[numberSavedSolutions_]=NULL;
     15072  }
     15073}
    1506015074#ifdef COIN_HAS_CLP
    1506115075void
  • trunk/Cbc/src/CbcModel.hpp

    r1733 r1769  
    13061306    /// Return a saved solution objective (0==best) - COIN_DBL_MAX if off end
    13071307    double savedSolutionObjective(int which) const;
     1308    /// Delete a saved solution and move others up
     1309    void deleteSavedSolution(int which);
    13081310
    13091311    /** Current phase (so heuristics etc etc can find out).
  • trunk/Cbc/src/CbcSolver.cpp

    r1750 r1769  
    294294    return *this;
    295295}
     296#ifdef KEEP_POSTPROCESS
     297static void putBackOtherSolutions(CbcModel * presolvedModel, CbcModel * model,
     298                           CglPreProcess * preProcess)
     299{
     300  int numberSolutions=presolvedModel->numberSavedSolutions();
     301  int numberColumns=presolvedModel->getNumCols();
     302  if (numberSolutions>1) {
     303    double * bestSolution = CoinCopyOfArray(presolvedModel->bestSolution(),numberColumns);
     304    //double cutoff = presolvedModel->getCutoff();
     305    double objectiveValue=presolvedModel->getObjValue();
     306    //model->createSpaceForSavedSolutions(numberSolutions-1);
     307    for (int iSolution=numberSolutions-1;iSolution>=0;iSolution--) {
     308      presolvedModel->setCutoff(COIN_DBL_MAX);
     309      presolvedModel->solver()->setColSolution(presolvedModel->savedSolution(iSolution));
     310      //presolvedModel->savedSolutionObjective(iSolution));
     311      preProcess->postProcess(*presolvedModel->solver(),false);
     312      model->setBestSolution(preProcess->originalModel()->getColSolution(),model->solver()->getNumCols(),
     313                             presolvedModel->savedSolutionObjective(iSolution));
     314    }
     315    presolvedModel->setBestObjectiveValue(objectiveValue);
     316    presolvedModel->solver()->setColSolution(bestSolution);
     317    //presolvedModel->setBestSolution(bestSolution,numberColumns,objectiveValue);
     318  }
     319}
     320#endif
    296321
    297322/*
     
    588613    parameters_[whichParam(CBC_PARAM_DBL_TIMELIMIT_BAB, numberParameters_, parameters_)].setDoubleValue(1.0e8);
    589614    parameters_[whichParam(CLP_PARAM_ACTION_SOLUTION, numberParameters_, parameters_)].setStringValue(solutionFile);
     615    parameters_[whichParam(CLP_PARAM_ACTION_NEXTBESTSOLUTION, numberParameters_, parameters_)].setStringValue(solutionFile);
    590616    parameters_[whichParam(CLP_PARAM_ACTION_SAVESOL, numberParameters_, parameters_)].setStringValue(solutionSaveFile);
    591617    parameters_[whichParam(CLP_PARAM_INT_SPRINT, numberParameters_, parameters_)].setIntValue(doSprint);
     
    35283554                            OsiSolverInterface * saveSolver = NULL;
    35293555                            CglPreProcess process;
    3530                             cbcPreProcessPointer = & process;
    35313556                            // Say integers in sync
    35323557                            bool integersOK = true;
     
    37753800                                        if ((model_.moreSpecialOptions()&65536)!=0)
    37763801                                          process.setOptions(2+4+8); // no cuts
     3802                                        cbcPreProcessPointer = & process;
    37773803                                        solver2 = process.preProcessNonDefault(*saveSolver, translate[preProcess], numberPasses,
    37783804                                                                               tunePreProcess);
     
    37823808                                    }
    37833809#elif CBC_OTHER_SOLVER==1
     3810                                    cbcPreProcessPointer = & process;
    37843811                                    solver2 = process.preProcessNonDefault(*saveSolver, translate[preProcess], numberPasses,
    37853812                                                                           tunePreProcess);
     
    56235650                                    babModel_ = NULL;
    56245651                                    return returnCode;
     5652                                } else {
     5653                                  int numberSolutions = babModel_->numberSavedSolutions();
     5654                                  if (numberSolutions>1) {
     5655                                    for (int iSolution=numberSolutions-1;iSolution>=0;iSolution--) {
     5656                                      model_.setBestSolution(babModel_->savedSolution(iSolution),
     5657                                                             model_.solver()->getNumCols(),
     5658                                                             babModel_->savedSolutionObjective(iSolution));
     5659                                    }
     5660                                  }
    56255661                                }
    56265662#ifdef CLP_MALLOC_STATISTICS
     
    58655901                                    ClpSimplex * lpSolver = clpSolver->getModelPtr();
    58665902                                    lpSolver->setSpecialOptions(lpSolver->specialOptions() | IN_BRANCH_AND_BOUND); // say is Cbc (and in branch and bound)
     5903#endif
     5904#ifdef KEEP_POSTPROCESS
     5905                                    // put back any saved solutions
     5906                                    putBackOtherSolutions(babModel_,&model_,&process);
    58675907#endif
    58685908                                    process.postProcess(*babModel_->solver());
     
    60156055                                    memcpy(bestSolution, babModel_->solver()->getColSolution(), n*sizeof(double));
    60166056                                }
    6017                                 if (returnMode == 1) {
     6057                                if (returnMode == 1&&model_.numberSavedSolutions()<2) {
    60186058                                    model_.deleteSolutions();
    60196059                                    model_.setBestSolution(bestSolution, n, babModel_->getMinimizationObjValue());
     
    77137753                    break;
    77147754                    case CLP_PARAM_ACTION_SOLUTION:
     7755                    case CLP_PARAM_ACTION_NEXTBESTSOLUTION:
    77157756                    case CLP_PARAM_ACTION_GMPL_SOLUTION:
    77167757                        if (goodModel) {
     7758                          ClpSimplex * saveLpSolver = NULL;
    77177759                            // get next field
    77187760                            field = CoinReadGetString(argc, argv);
     
    78817923                                break;
    78827924                              }
    7883                                 if (printMode < 5) {
     7925                              if (printMode < 5) {
     7926                                if (type == CLP_PARAM_ACTION_NEXTBESTSOLUTION) {
     7927                                  // save
     7928                                  const double * nextBestSolution = model_.savedSolution(1);
     7929                                  if (!nextBestSolution) {
     7930                                    sprintf(generalPrint, "All alternative solutions printed");
     7931                                    generalMessageHandler->message(CLP_GENERAL, generalMessages)
     7932                                      << generalPrint
     7933                                      << CoinMessageEol;
     7934                                    break;
     7935                                  } else {
     7936                                    sprintf(generalPrint, "Alternative solution - %d remaining",model_.numberSavedSolutions()-2);
     7937                                    generalMessageHandler->message(CLP_GENERAL, generalMessages)
     7938                                      << generalPrint
     7939                                      << CoinMessageEol;
     7940                                  }
     7941                                  saveLpSolver = lpSolver;
     7942                                  assert (clpSolver->getModelPtr()==saveLpSolver);
     7943                                  lpSolver = new ClpSimplex(*saveLpSolver);
     7944                                  ClpSimplex * oldSimplex = clpSolver->swapModelPtr(lpSolver);
     7945                                  assert (oldSimplex==saveLpSolver);
     7946                                  double * solution = lpSolver->primalColumnSolution();
     7947                                  double * lower = lpSolver->columnLower();
     7948                                  double * upper = lpSolver->columnUpper();
     7949                                  int numberColumns=lpSolver->numberColumns();
     7950                                  memcpy(solution,nextBestSolution,numberColumns*sizeof(double));
     7951                                  model_.deleteSavedSolution(1);
     7952                                  for (int i = 0; i < numberColumns; i++) {
     7953                                    if (clpSolver->isInteger(i)) {
     7954                                      double value=floor(solution[i]+0.5);
     7955                                      lower[i]=value;
     7956                                      upper[i]=value;
     7957                                    }
     7958                                  }
     7959                                  lpSolver->allSlackBasis();
     7960                                  lpSolver->initialSolve();
     7961                                }
    78847962                                    // Write solution header (suggested by Luigi Poderico)
    78857963                                    lpSolver->computeObjectiveValue(false);
     
    82778355                                        }
    82788356                                    }
     8357                                    if (type == CLP_PARAM_ACTION_NEXTBESTSOLUTION) {
     8358                                      if(saveLpSolver) {
     8359                                        clpSolver->swapModelPtr(saveLpSolver);
     8360                                        delete lpSolver;
     8361                                        lpSolver=saveLpSolver;
     8362                                        saveLpSolver=NULL;
     8363                                      }
     8364                                    }
    82798365                                } else {
    82808366                                    // special format suitable for OsiRowCutDebugger
     
    86128698    parameters[whichParam(CBC_PARAM_DBL_TIMELIMIT_BAB, numberParameters, parameters)].setDoubleValue(1.0e8);
    86138699    parameters[whichParam(CLP_PARAM_ACTION_SOLUTION, numberParameters, parameters)].setStringValue(solutionFile);
     8700    parameters[whichParam(CLP_PARAM_ACTION_NEXTBESTSOLUTION, numberParameters, parameters)].setStringValue(solutionFile);
    86148701    parameters[whichParam(CLP_PARAM_ACTION_SAVESOL, numberParameters, parameters)].setStringValue(solutionSaveFile);
    86158702    parameters[whichParam(CLP_PARAM_INT_SPRINT, numberParameters, parameters)].setIntValue(doSprint);
     
    92259312  Source code changes so up to 2.0
    92269313*/
     9314                           
Note: See TracChangeset for help on using the changeset viewer.