- Timestamp:
- Feb 29, 2012 3:48:21 AM (9 years ago)
- Location:
- trunk/Cbc/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cbc/src/CbcModel.cpp
r1764 r1769 15058 15058 } 15059 15059 } 15060 // Delete a saved solution and move others up 15061 void 15062 CbcModel::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 } 15060 15074 #ifdef COIN_HAS_CLP 15061 15075 void -
trunk/Cbc/src/CbcModel.hpp
r1733 r1769 1306 1306 /// Return a saved solution objective (0==best) - COIN_DBL_MAX if off end 1307 1307 double savedSolutionObjective(int which) const; 1308 /// Delete a saved solution and move others up 1309 void deleteSavedSolution(int which); 1308 1310 1309 1311 /** Current phase (so heuristics etc etc can find out). -
trunk/Cbc/src/CbcSolver.cpp
r1750 r1769 294 294 return *this; 295 295 } 296 #ifdef KEEP_POSTPROCESS 297 static 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 296 321 297 322 /* … … 588 613 parameters_[whichParam(CBC_PARAM_DBL_TIMELIMIT_BAB, numberParameters_, parameters_)].setDoubleValue(1.0e8); 589 614 parameters_[whichParam(CLP_PARAM_ACTION_SOLUTION, numberParameters_, parameters_)].setStringValue(solutionFile); 615 parameters_[whichParam(CLP_PARAM_ACTION_NEXTBESTSOLUTION, numberParameters_, parameters_)].setStringValue(solutionFile); 590 616 parameters_[whichParam(CLP_PARAM_ACTION_SAVESOL, numberParameters_, parameters_)].setStringValue(solutionSaveFile); 591 617 parameters_[whichParam(CLP_PARAM_INT_SPRINT, numberParameters_, parameters_)].setIntValue(doSprint); … … 3528 3554 OsiSolverInterface * saveSolver = NULL; 3529 3555 CglPreProcess process; 3530 cbcPreProcessPointer = & process;3531 3556 // Say integers in sync 3532 3557 bool integersOK = true; … … 3775 3800 if ((model_.moreSpecialOptions()&65536)!=0) 3776 3801 process.setOptions(2+4+8); // no cuts 3802 cbcPreProcessPointer = & process; 3777 3803 solver2 = process.preProcessNonDefault(*saveSolver, translate[preProcess], numberPasses, 3778 3804 tunePreProcess); … … 3782 3808 } 3783 3809 #elif CBC_OTHER_SOLVER==1 3810 cbcPreProcessPointer = & process; 3784 3811 solver2 = process.preProcessNonDefault(*saveSolver, translate[preProcess], numberPasses, 3785 3812 tunePreProcess); … … 5623 5650 babModel_ = NULL; 5624 5651 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 } 5625 5661 } 5626 5662 #ifdef CLP_MALLOC_STATISTICS … … 5865 5901 ClpSimplex * lpSolver = clpSolver->getModelPtr(); 5866 5902 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); 5867 5907 #endif 5868 5908 process.postProcess(*babModel_->solver()); … … 6015 6055 memcpy(bestSolution, babModel_->solver()->getColSolution(), n*sizeof(double)); 6016 6056 } 6017 if (returnMode == 1 ) {6057 if (returnMode == 1&&model_.numberSavedSolutions()<2) { 6018 6058 model_.deleteSolutions(); 6019 6059 model_.setBestSolution(bestSolution, n, babModel_->getMinimizationObjValue()); … … 7713 7753 break; 7714 7754 case CLP_PARAM_ACTION_SOLUTION: 7755 case CLP_PARAM_ACTION_NEXTBESTSOLUTION: 7715 7756 case CLP_PARAM_ACTION_GMPL_SOLUTION: 7716 7757 if (goodModel) { 7758 ClpSimplex * saveLpSolver = NULL; 7717 7759 // get next field 7718 7760 field = CoinReadGetString(argc, argv); … … 7881 7923 break; 7882 7924 } 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 } 7884 7962 // Write solution header (suggested by Luigi Poderico) 7885 7963 lpSolver->computeObjectiveValue(false); … … 8277 8355 } 8278 8356 } 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 } 8279 8365 } else { 8280 8366 // special format suitable for OsiRowCutDebugger … … 8612 8698 parameters[whichParam(CBC_PARAM_DBL_TIMELIMIT_BAB, numberParameters, parameters)].setDoubleValue(1.0e8); 8613 8699 parameters[whichParam(CLP_PARAM_ACTION_SOLUTION, numberParameters, parameters)].setStringValue(solutionFile); 8700 parameters[whichParam(CLP_PARAM_ACTION_NEXTBESTSOLUTION, numberParameters, parameters)].setStringValue(solutionFile); 8614 8701 parameters[whichParam(CLP_PARAM_ACTION_SAVESOL, numberParameters, parameters)].setStringValue(solutionSaveFile); 8615 8702 parameters[whichParam(CLP_PARAM_INT_SPRINT, numberParameters, parameters)].setIntValue(doSprint); … … 9225 9312 Source code changes so up to 2.0 9226 9313 */ 9314
Note: See TracChangeset
for help on using the changeset viewer.