Changeset 2549


Ignore:
Timestamp:
Apr 16, 2019 10:58:45 AM (2 months ago)
Author:
forrest
Message:

add silly options to mipStart

Location:
trunk/Cbc/src
Files:
3 edited

Legend:

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

    r2491 r2549  
    104104  const vector< string > colNames,
    105105  const std::vector< std::pair< std::string, double > > &colValues,
    106   double *sol, double &obj)
     106                            double *sol, double &obj, int extraActions)
    107107{
    108108  if (!model->getNumCols())
     
    136136  }
    137137#endif
     138  if (extraActions) {
     139    const double * objective = lp->getObjCoefficients();
     140    const double * lower = lp->getColLower();
     141    const double * upper = lp->getColUpper();
     142    for (int i = 0; (i < lp->getNumCols()); ++i) {
     143      if (lp->isInteger(i)) {
     144        double objValue = objective[i];
     145        double lowerValue = lower[i];
     146        double upperValue = upper[i];
     147        switch (extraActions) {
     148        case 1:
     149          lp->setColBounds(i, lowerValue, lowerValue);
     150          break;
     151        case 2:
     152          lp->setColBounds(i, upperValue, upperValue);
     153          break;
     154        case 3:
     155          lp->setColBounds(i, lowerValue, lowerValue);
     156          if (objValue<0.0)
     157            lp->setColBounds(i, upperValue, upperValue);
     158          break;
     159        case 4:
     160          lp->setColBounds(i, upperValue, upperValue);
     161          if (objValue>0.0)
     162            lp->setColBounds(i, lowerValue, lowerValue);
     163          break;
     164        case 5:
     165          lp->setColBounds(i, lowerValue, lowerValue);
     166          if (objValue>0.0)
     167            lp->setColBounds(i, upperValue, upperValue);
     168          break;
     169        case 6:
     170          lp->setColBounds(i, upperValue, upperValue);
     171          if (objValue<0.0)
     172            lp->setColBounds(i, lowerValue, lowerValue);
     173          break;
     174        }
     175      }
     176    }
     177  }
    138178  for (int i = 0; (i < static_cast< int >(colValues.size())); ++i) {
    139179    map< string, int >::const_iterator mIt = colIdx.find(colValues[i].first);
     
    161201  }
    162202
     203  if (extraActions)
     204    fixed = lp->getNumIntegers();
    163205  if (!fixed) {
    164206    model->messageHandler()->message(CBC_GENERAL, model->messages())
  • trunk/Cbc/src/CbcMipStartIO.hpp

    r2467 r2549  
    1818
    1919/* from a partial list of variables tries to fill the
    20    remaining variable values */
     20   remaining variable values.
     21   extraActions 0 -default, otherwise set integers not mentioned
     22   1 - to lower bound, 2 - to upper bound
     23   3,5 ones without costs as 1,2 - ones with costs to cheapest
     24   4,6 ones without costs as 1,2 - ones with costs to expensive
     25*/
    2126int computeCompleteSolution(CbcModel *model,
    2227  const std::vector< std::string > colNames,
    2328  const std::vector< std::pair< std::string, double > > &colValues,
    24   double *sol, double &obj);
     29  double *sol, double &obj, int extraActions);
    2530
    2631#endif // MIPSTARTIO_HPP_INCLUDED
  • trunk/Cbc/src/CbcSolver.cpp

    r2546 r2549  
    14701470    std::vector< std::pair< std::string, double > > mipStart;
    14711471    std::vector< std::pair< std::string, double > > mipStartBefore;
     1472    std::string mipStartFile = "";
    14721473    int numberSOS = 0;
    14731474    int *sosStart = NULL;
     
    40684069                std::vector< double > x(model_.getNumCols(), 0.0);
    40694070                double obj;
    4070                 int status = computeCompleteSolution(&tempModel, colNames, mipStartBefore, &x[0], obj);
     4071                int status = computeCompleteSolution(&tempModel, colNames, mipStartBefore, &x[0], obj, 0);
    40714072                // set cutoff ( a trifle high)
    40724073                if (!status) {
     
    57585759                if (model.getMIPStart().size())
    57595760                  mipStart = model.getMIPStart();
    5760                 if (mipStart.size() && !mipStartBefore.size() && babModel_->getNumCols()) {
     5761                std::string testEmpty=mipStartFile.substr(0,6);
     5762                if ((mipStart.size() || testEmpty=="empty.") && !mipStartBefore.size()
     5763                     && babModel_->getNumCols()) {
    57615764                  std::vector< std::string > colNames;
    57625765                  if (preProcess) {
     
    57695772                    for (int i = 0; (i < babModel_->solver()->getNumCols()); ++i) {
    57705773                      int iColumn = babModel_->originalColumns()[i];
    5771                       if (iColumn >= 0) {
     5774                      if (iColumn >= 0 && iColumn < model.getNumCols()) {
    57725775                        std::string cname = model_.solver()->getColName(iColumn);
    57735776                        colNames.push_back(cname);
     
    57935796                  double obj;
    57945797                  babModel_->findIntegers(true);
    5795                   int status = computeCompleteSolution(babModel_, colNames, mipStart, &x[0], obj);
     5798                  int extraActions = 0;
     5799                  int lengthFileName = mipStartFile.size();
     5800                  const char * checkEnd[6]={
     5801                    ".low",".high",".lowcheap",".highcheap",".lowexpensive",".highexpensive"};
     5802                  for (extraActions=0;extraActions<6;extraActions++) {
     5803                    if (mipStartFile.substr(lengthFileName-strlen(checkEnd[extraActions]),20)==checkEnd[extraActions])
     5804                      break;
     5805                  }
     5806                  if (extraActions==6)
     5807                    extraActions=0;
     5808                  else
     5809                    extraActions++;
     5810                  int status = computeCompleteSolution(babModel_, colNames, mipStart, &x[0], obj, extraActions);
    57965811                  if (!status) {
    57975812                    // need to check more babModel_->setBestSolution( &x[0], static_cast<int>(x.size()), obj, false );
     
    82438258                  lengthName = 0;
    82448259                }
     8260                // really just for testing
     8261                double objScale = parameters_[whichParam(CLP_PARAM_DBL_OBJSCALE2, parameters_)].doubleValue();
     8262                if (objScale != 1.0) {
     8263                  int iColumn;
     8264                  int numberColumns = lpSolver->numberColumns();
     8265                  double *dualColumnSolution = lpSolver->dualColumnSolution();
     8266                  ClpObjective *obj = lpSolver->objectiveAsObject();
     8267                  assert(dynamic_cast< ClpLinearObjective * >(obj));
     8268                  double offset;
     8269                  double *objective = obj->gradient(NULL, NULL, offset, true);
     8270                  for (iColumn = 0; iColumn < numberColumns; iColumn++) {
     8271                    dualColumnSolution[iColumn] *= objScale;
     8272                    objective[iColumn] *= objScale;
     8273                  }
     8274                  int iRow;
     8275                  int numberRows = lpSolver->numberRows();
     8276                  double *dualRowSolution = lpSolver->dualRowSolution();
     8277                  for (iRow = 0; iRow < numberRows; iRow++)
     8278                    dualRowSolution[iRow] *= objScale;
     8279                  lpSolver->setObjectiveOffset(objScale * lpSolver->objectiveOffset());
     8280                }
    82458281                goodModel = true;
    82468282                // sets to all slack (not necessary?)
     
    90539089              // get next field
    90549090              field = CoinReadGetString(argc, argv);
     9091              mipStartFile = field;
    90559092              if (field == "$") {
    90569093                field = parameters_[iParam].stringValue();
Note: See TracChangeset for help on using the changeset viewer.