Ignore:
Timestamp:
Jul 21, 2013 5:05:45 AM (6 years ago)
Author:
forrest
Message:

more options, copy statistics structure analysis
start coding of "switch" variables i.e. badly scaled ints or hi/lo
changes to allow more influence on small branch and bound
changes to get correct printout with threads

File:
1 edited

Legend:

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

    r1880 r1943  
    2626#include "CoinTime.hpp"
    2727#include "CbcEventHandler.hpp"
    28 
     28#ifdef SWITCH_VARIABLES
     29#include "CbcSimpleIntegerDynamicPseudoCost.hpp"
     30#endif
    2931
    3032// Default Constructor
     
    829831                            if (returnCode && newSolutionValue < saveValue)
    830832                                numberBandBsolutions++;
     833                        } else if (numberColumns>numberIntegersOrig) {
     834                          // relax continuous
     835                          solver->resolve();
     836                          if (solver->isProvenOptimal()) {
     837                            memcpy(newSolution,solver->getColSolution(),
     838                                   numberColumns);
     839                            newSolutionValue = -saveOffset;
     840                            for (  i = 0 ; i < numberColumns ; i++ )
     841                              newSolutionValue += saveObjective[i] * newSolution[i];
     842                            newSolutionValue *= direction;
     843                            sprintf(pumpPrint, "Relaxing continuous gives %g", newSolutionValue);
     844                          } else {
     845                            sprintf(pumpPrint,"Infeasible when relaxing continuous!\n");
     846                          }
     847                          model_->messageHandler()->message(CBC_FPUMP1, model_->messages())
     848                            << pumpPrint
     849                            << CoinMessageEol;
    831850                        }
    832851                    }
     
    10091028                    double newValue = 0.0;
    10101029                    if (newSolution[iColumn] < lower[iColumn] + primalTolerance) {
    1011                         newValue = costValue + scaleFactor * saveObjective[iColumn];
     1030                      newValue = costValue + scaleFactor * saveObjective[iColumn];
    10121031                    } else {
    1013                         if (newSolution[iColumn] > upper[iColumn] - primalTolerance) {
    1014                             newValue = -costValue + scaleFactor * saveObjective[iColumn];
    1015                         }
     1032                      if (newSolution[iColumn] > upper[iColumn] - primalTolerance) {
     1033                        newValue = -costValue + scaleFactor * saveObjective[iColumn];
     1034                      }
    10161035                    }
    10171036#ifdef RAND_RAND
     
    12361255                    {
    12371256                        const double * newSolution = solver->getColSolution();
    1238                         for (  i = 0 ; i < numberColumns ; i++ ) {
    1239                             if (solver->isInteger(i)) {
    1240                                 double value = newSolution[i];
     1257                        for (int iColumn = 0 ; iColumn < numberColumns ; iColumn++ ) {
     1258                            if (solver->isInteger(iColumn)) {
     1259                                double value = newSolution[iColumn];
    12411260                                double nearest = floor(value + 0.5);
    12421261                                newSumInfeas += fabs(value - nearest);
    1243                                 if (fabs(value - nearest) > 1.0e-6)
     1262                                if (fabs(value - nearest) > 1.0e-6) {
    12441263                                    newNumberInfeas++;
    1245                             }
    1246                             newTrueSolutionValue += saveObjective[i] * newSolution[i];
     1264                                }
     1265                            }
     1266                            newTrueSolutionValue += saveObjective[iColumn] * newSolution[iColumn];
    12471267                        }
    12481268                        newTrueSolutionValue *= direction;
     
    23642384    const double * columnUpper = solver->getColUpper();
    23652385    // Check if valid with current solution (allow for 0.99999999s)
     2386    double newSumInfeas = 0.0;
     2387    int newNumberInfeas = 0;
    23662388    for (i = 0; i < numberIntegers; i++) {
    23672389        int iColumn = integerVariable[i];
    23682390        double value = solution[iColumn];
    23692391        double round = floor(value + 0.5);
    2370         if (fabs(value - round) > primalTolerance)
    2371             break;
     2392        if (fabs(value - round) > primalTolerance) {
     2393          newSumInfeas += fabs(value-round);
     2394          newNumberInfeas++;
     2395        }
    23722396    }
    2373     if (i == numberIntegers) {
     2397    if (!newNumberInfeas) {
    23742398        // may be able to use solution even if 0.99999's
    23752399        double * saveLower = CoinCopyOfArray(columnLower, numberColumns);
Note: See TracChangeset for help on using the changeset viewer.