Changeset 1650


Ignore:
Timestamp:
May 10, 2011 8:33:58 AM (8 years ago)
Author:
forrest
Message:

messages for fathoming plus soem attempts at robustness

Location:
trunk/Cbc/src
Files:
7 edited

Legend:

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

    r1573 r1650  
    6666    {CBC_CUTOFF_WARNING1, 47, 1, "Cutoff set to %g - equivalent to best solution of %g"},
    6767    {CBC_END_SOLUTION, 48, 2, "Final check on integer solution of %g found after %d iterations and %d nodes (%.2f seconds)"},
     68#ifndef NO_FATHOM_PRINT
     69    {CBC_FATHOM_CHANGE, 49, 1, "Complete fathoming at depth >= %d"},
     70#endif
    6871    {CBC_NOINT, 3007, 1, "No integer variables - nothing to do"},
    6972    {CBC_WARNING_STRONG, 3008, 1, "Strong branching is fixing too many variables, too expensively!"},
  • trunk/Cbc/src/CbcMessage.hpp

    r1573 r1650  
    7272    CBC_GENERAL,
    7373    CBC_ROOT_DETAIL,
     74#ifndef NO_FATHOM_PRINT
     75    CBC_FATHOM_CHANGE,
     76#endif
    7477    CBC_DUMMY_END
    7578};
  • trunk/Cbc/src/CbcModel.cpp

    r1641 r1650  
    33573357    int lastPrintEvery = 0;
    33583358    int numberConsecutiveInfeasible = 0;
     3359#define PERTURB_IN_FATHOM
     3360#ifdef PERTURB_IN_FATHOM
     3361    // allow in fathom
     3362    if ((moreSpecialOptions_& 262144) != 0)
     3363      specialOptions_ |= 131072;
     3364#endif
    33593365    while (true) {
    33603366        lockThread();
     
    33973403                    // switch off perturbation
    33983404                    simplex->setPerturbation(100);
    3399 #ifdef PERTURB_IN_FATHOM
    3400                     // but allow in fathom
    3401                     specialOptions_ |= 131072;
    3402 #endif
    34033405#ifdef CLP_INVESTIGATE
    34043406                    printf("Perturbation switched off\n");
     
    37653767            node = tree_->bestNode(cutoff) ;
    37663768            // Possible one on tree worse than cutoff
    3767             // Wierd comparison function can leave ineligible nodes on tree
     3769            // Weird comparison function can leave ineligible nodes on tree
    37683770            if (!node || node->objectiveValue() > cutoff)
    37693771                continue;
     
    1294512947                              break;
    1294612948                            }
     12949                            reducedCostFix();
    1294712950                        } else {
    1294812951                            // NOT better solution
     
    1352313526                            simplex->setLogLevel(0);
    1352413527                        clpSolver->setBasis();
    13525 #ifdef PERTURB_IN_FATHOM
    1352613528                        int perturbation = simplex->perturbation();
    1352713529                        if ((specialOptions_&131072) != 0) {
    13528                             assert (perturbation == 100);
     13530                            //assert (perturbation == 100);
    1352913531                            simplex->setPerturbation(50);
    1353013532                        }
     13533                        int saveMoreOptions = simplex->moreSpecialOptions();
     13534                        int flags = (moreSpecialOptions_>>18)&3;
     13535                        simplex->setMoreSpecialOptions(saveMoreOptions|flags<<11);
     13536#ifndef NO_FATHOM_PRINT
     13537                        info->startingDepth_ = node->depth();
     13538                        info->nodeCalled_ = numberNodes_;
     13539                        info->handler_ = handler_;
    1353113540#endif
    1353213541                        feasible = simplex->fathom(info) != 0;
    13533 #ifdef PERTURB_IN_FATHOM
     13542                        simplex->setMoreSpecialOptions(saveMoreOptions);
    1353413543                        simplex->setPerturbation(perturbation);
    13535 #endif
    1353613544                        numberExtraNodes_ += info->numberNodesExplored_;
    1353713545                        numberExtraIterations_ += info->numberIterations_;
    13538                         if (info->numberNodesExplored_ > 10000) {
     13546                        if (info->numberNodesExplored_ > 10000 /* && !feasible */
     13547                            && (moreSpecialOptions_&524288) == 0  && info->nNodes_>=0) {
    1353913548                            fastNodeDepth_ --;
     13549#ifndef NO_FATHOM_PRINT
     13550                            if ((moreSpecialOptions_&262144) != 0)
     13551                              handler_->message(CBC_FATHOM_CHANGE, messages_) <<
     13552                                FATHOM_BIAS - fastNodeDepth_ << CoinMessageEol ;
     13553#endif
    1354013554#ifdef CLP_INVESTIGATE
    1354113555                            printf(">10000 - depth now %d so at depth >= %d\n",
     
    1354613560                            // we gave up
    1354713561                            //abort();
    13548                             fastNodeDepth_ -= 2;
     13562                            fastNodeDepth_ -= 3;
     13563#ifndef NO_FATHOM_PRINT
     13564                          if ((moreSpecialOptions_&262144) != 0)
     13565                            handler_->message(CBC_FATHOM_CHANGE, messages_) <<
     13566                              FATHOM_BIAS - fastNodeDepth_ << CoinMessageEol ;
     13567#endif
    1354913568#ifdef CLP_INVESTIGATE
    1355013569                            printf("fastNodeDepth now %d - so at depth >= %d\n",
  • trunk/Cbc/src/CbcModel.hpp

    r1640 r1650  
    24552455        65536 no cuts in preprocessing
    24562456        131072 Time limits elapsed
     2457        18 bit (262144) - Perturb fathom nodes
     2458        19 bit (524288) - No limit on fathom nodes
    24572459    */
    24582460    int moreSpecialOptions_;
  • trunk/Cbc/src/CbcNode.cpp

    r1641 r1650  
    28002800                        doneHotStart = true;
    28012801                        solver->markHotStart();
     2802                        if (!solver->isProvenOptimal()) {
     2803                          skipAll=-2;
     2804                          canSkip = true;
     2805                        }
    28022806                        xMark++;
    28032807                    }
     2808                }
     2809                if (!canSkip) {
    28042810                    numberTest--;
    28052811                    // just do a few
  • trunk/Cbc/src/CbcSimpleIntegerDynamicPseudoCost.cpp

    r1573 r1650  
    615615#endif
    616616    double sum;
     617#ifndef INFEAS_MULTIPLIER
     618#define INFEAS_MULTIPLIER 1.0
     619#endif
    617620    double number;
    618621    double downCost = CoinMax(value - below, 0.0);
     
    621624    number = numberTimesDown_;
    622625#if INFEAS==1
    623     sum += numberTimesDownInfeasible_ * CoinMax(distanceToCutoff / (downCost + 1.0e-12), sumDownCost_);
     626    sum += INFEAS_MULTIPLIER*numberTimesDownInfeasible_ * CoinMax(distanceToCutoff / (downCost + 1.0e-12), sumDownCost_);
    624627#endif
    625628#elif TYPE2==1
     
    627630    number = sumDownChange_;
    628631#if INFEAS==1
    629     sum += numberTimesDownInfeasible_ * CoinMax(distanceToCutoff / (downCost + 1.0e-12), sumDownCost_);
     632    sum += INFEAS_MULTIPLIER*numberTimesDownInfeasible_ * CoinMax(distanceToCutoff / (downCost + 1.0e-12), sumDownCost_);
    630633#endif
    631634#elif TYPE2==2
    632635    abort();
    633636#if INFEAS==1
    634     sum += numberTimesDownInfeasible_ * (distanceToCutoff / (downCost + 1.0e-12));
     637    sum += INFEAS_MULTIPLIER*numberTimesDownInfeasible_ * (distanceToCutoff / (downCost + 1.0e-12));
    635638#endif
    636639#endif
     
    661664    number = numberTimesUp_;
    662665#if INFEAS==1
    663     sum += numberTimesUpInfeasible_ * CoinMax(distanceToCutoff / (upCost + 1.0e-12), sumUpCost_);
     666    sum += INFEAS_MULTIPLIER*numberTimesUpInfeasible_ * CoinMax(distanceToCutoff / (upCost + 1.0e-12), sumUpCost_);
    664667#endif
    665668#elif TYPE2==1
     
    667670    number = sumUpChange_;
    668671#if INFEAS==1
    669     sum += numberTimesUpInfeasible_ * CoinMax(distanceToCutoff / (upCost + 1.0e-12), sumUpCost_);
     672    sum += INFEAS_MULTIPLIER*numberTimesUpInfeasible_ * CoinMax(distanceToCutoff / (upCost + 1.0e-12), sumUpCost_);
    670673#endif
    671674#elif TYPE2==1
    672675    abort();
    673676#if INFEAS==1
    674     sum += numberTimesUpInfeasible_ * (distanceToCutoff / (upCost + 1.0e-12));
     677    sum += INFEAS_MULTIPLIER*numberTimesUpInfeasible_ * (distanceToCutoff / (upCost + 1.0e-12));
    675678#endif
    676679#endif
     
    10971100        if (distanceToCutoff > 1.0e20)
    10981101            distanceToCutoff = 10.0 + fabs(originalValue);
    1099         sum += numberTimesDownInfeasible_ * CoinMax(distanceToCutoff, 1.0e-12 * (1.0 + fabs(originalValue)));
     1102        sum += INFEAS_MULTIPLIER*numberTimesDownInfeasible_ * CoinMax(distanceToCutoff, 1.0e-12 * (1.0 + fabs(originalValue)));
    11001103        setDownDynamicPseudoCost(sum / static_cast<double> (number));
    11011104#endif
     
    11601163        if (distanceToCutoff > 1.0e20)
    11611164            distanceToCutoff = 10.0 + fabs(originalValue);
    1162         sum += numberTimesUpInfeasible_ * CoinMax(distanceToCutoff, 1.0e-12 * (1.0 + fabs(originalValue)));
     1165        sum += INFEAS_MULTIPLIER*numberTimesUpInfeasible_ * CoinMax(distanceToCutoff, 1.0e-12 * (1.0 + fabs(originalValue)));
    11631166        setUpDynamicPseudoCost(sum / static_cast<double> (number));
    11641167#endif
     
    12761279        sum = sumDownCost();
    12771280        number = numberTimesDown();
    1278         sum += numberTimesDownInfeasible() * (distanceToCutoff / (downCost + 1.0e-12));
     1281        sum += INFEAS_MULTIPLIER*numberTimesDownInfeasible() * (distanceToCutoff / (downCost + 1.0e-12));
    12791282        if (number > 0)
    12801283            downCost *= sum / static_cast<double> (number);
     
    12851288        sum = sumUpCost();
    12861289        number = numberTimesUp();
    1287         sum += numberTimesUpInfeasible() * (distanceToCutoff / (upCost + 1.0e-12));
     1290        sum += INFEAS_MULTIPLIER*numberTimesUpInfeasible() * (distanceToCutoff / (upCost + 1.0e-12));
    12881291        if (number > 0)
    12891292            upCost *= sum / static_cast<double> (number);
  • trunk/Cbc/src/CbcSolver.cpp

    r1644 r1650  
    20452045                            else if (parameters_[iParam].type() == CBC_PARAM_INT_EXPERIMENT) {
    20462046                                if (value >= 1) {
     2047                                    int values[]={24003,280003,792003,24003,24003};
     2048                                    if (value>=2&&value<=3) {
     2049                                      // swap default diving
     2050                                      int iParam = whichParam(CBC_PARAM_STR_DIVINGC, numberParameters_, parameters_);
     2051                                      parameters_[iParam].setCurrentOption("off");
     2052                                      iParam = whichParam(CBC_PARAM_STR_DIVINGP, numberParameters_, parameters_);
     2053                                      parameters_[iParam].setCurrentOption("on");
     2054                                    }
     2055                                    int extra4 = values[value-1];
     2056                                    parameters[whichParam(CBC_PARAM_INT_EXTRA4, numberParameters, parameters)].setIntValue(extra4);
    20472057                                    if (!noPrinting_) {
    20482058                                        generalMessageHandler->message(CLP_GENERAL, generalMessages)
     
    20532063                                        << CoinMessageEol;
    20542064                                        generalMessageHandler->message(CLP_GENERAL, generalMessages)
    2055                                         << "extra options - -rens on -extra4 24003 -passc 1000!"
     2065                                        << "extra options - -rens on -extra4 "
     2066                                        <<extra4<<" -passc 1000!"
    20562067                                        << CoinMessageEol;
    20572068                                    }
     
    20672078                                    parameters[whichParam(CBC_PARAM_INT_CUTPASS, numberParameters, parameters)].setIntValue(1000);
    20682079                                    cutPass = 1000;
    2069                                     parameters[whichParam(CBC_PARAM_INT_EXTRA4, numberParameters, parameters)].setIntValue(24003);
    20702080                                    parameters[whichParam(CBC_PARAM_STR_RENS, numberParameters, parameters)].setCurrentOption("on");
    20712081                                }
     
    29432953                                int exp1 = parameters_[whichParam(CBC_PARAM_INT_EXPERIMENT, numberParameters_,
    29442954                                                                  parameters_)].intValue();
    2945                                 if (exp1 == 2 && extra[1] == -1)
     2955                                if (exp1 == 4 && extra[1] == -1)
    29462956                                    extra[1] = 999998;
    29472957                                dextra[1] = parameters_[whichParam(CBC_PARAM_DBL_FAKEINCREMENT, numberParameters_, parameters_)].doubleValue();
     
    43284338                                    babModel_->setSpecialOptions(babModel_->specialOptions() | 512);
    43294339                                }
    4330                                 if (experimentFlag >= 3 || strategyFlag == 2) {
     4340                                if (experimentFlag >= 5 || strategyFlag == 2) {
    43314341                                    // try reduced model at root
    43324342                                    babModel_->setSpecialOptions(babModel_->specialOptions() | 32768);
     
    54695479                                        babModel_->setFastNodeDepth(-2); // Use Cplex at root
    54705480                                }
    5471                                 if (experimentFlag >= 2) {
     5481                                if (experimentFlag >= 5) {
    54725482                                    CbcModel donor(*babModel_);
    54735483                                    int options = babModel_->specialOptions();
Note: See TracChangeset for help on using the changeset viewer.