source: stable/2.7/Cbc/src/CbcHeuristicDiveCoefficient.cpp @ 1995

Last change on this file since 1995 was 1675, checked in by stefan, 8 years ago

sync with trunk rev1674

File size: 4.0 KB
RevLine 
[1271]1/* $Id: CbcHeuristicDiveCoefficient.cpp 1173 2009-06-04 09:44:10Z forrest $ */
[868]2// Copyright (C) 2008, International Business Machines
3// Corporation and others.  All Rights Reserved.
[1573]4// This code is licensed under the terms of the Eclipse Public License (EPL).
5
[868]6#if defined(_MSC_VER)
7// Turn off compiler warning about long names
8#  pragma warning(disable:4786)
9#endif
10
[912]11//#define PRINT_DEBUG
12
[868]13#include "CbcHeuristicDiveCoefficient.hpp"
14#include "CbcStrategy.hpp"
15
16// Default Constructor
[1286]17CbcHeuristicDiveCoefficient::CbcHeuristicDiveCoefficient()
18        : CbcHeuristicDive()
[868]19{
20}
21
22// Constructor from model
23CbcHeuristicDiveCoefficient::CbcHeuristicDiveCoefficient(CbcModel & model)
[1286]24        : CbcHeuristicDive(model)
[868]25{
26}
27
[1286]28// Destructor
[868]29CbcHeuristicDiveCoefficient::~CbcHeuristicDiveCoefficient ()
30{
31}
32
33// Clone
34CbcHeuristicDiveCoefficient *
35CbcHeuristicDiveCoefficient::clone() const
36{
[1286]37    return new CbcHeuristicDiveCoefficient(*this);
[868]38}
39
40// Create C++ lines to get to current state
[1286]41void
42CbcHeuristicDiveCoefficient::generateCpp( FILE * fp)
[868]43{
[1286]44    CbcHeuristicDiveCoefficient other;
45    fprintf(fp, "0#include \"CbcHeuristicDiveCoefficient.hpp\"\n");
46    fprintf(fp, "3  CbcHeuristicDiveCoefficient heuristicDiveCoefficient(*cbcModel);\n");
47    CbcHeuristic::generateCpp(fp, "heuristicDiveCoefficient");
48    fprintf(fp, "3  cbcModel->addHeuristic(&heuristicDiveCoefficient);\n");
[868]49}
50
[1286]51// Copy constructor
[868]52CbcHeuristicDiveCoefficient::CbcHeuristicDiveCoefficient(const CbcHeuristicDiveCoefficient & rhs)
[1286]53        :
54        CbcHeuristicDive(rhs)
[868]55{
56}
57
[1286]58// Assignment operator
59CbcHeuristicDiveCoefficient &
60CbcHeuristicDiveCoefficient::operator=( const CbcHeuristicDiveCoefficient & rhs)
[868]61{
[1286]62    if (this != &rhs) {
63        CbcHeuristicDive::operator=(rhs);
64    }
65    return *this;
[868]66}
67
[944]68bool
[912]69CbcHeuristicDiveCoefficient::selectVariableToBranch(OsiSolverInterface* solver,
[1286]70        const double* newSolution,
71        int& bestColumn,
72        int& bestRound)
[868]73{
[1286]74    int numberIntegers = model_->numberIntegers();
75    const int * integerVariable = model_->integerVariable();
76    double integerTolerance = model_->getDblParam(CbcModel::CbcIntegerTolerance);
[868]77
[1286]78    bestColumn = -1;
79    bestRound = -1; // -1 rounds down, +1 rounds up
[1675]80    double bestFraction = COIN_DBL_MAX;
[1286]81    int bestLocks = COIN_INT_MAX;
82    bool allTriviallyRoundableSoFar = true;
83    for (int i = 0; i < numberIntegers; i++) {
84        int iColumn = integerVariable[i];
85        double value = newSolution[iColumn];
86        double fraction = value - floor(value);
87        int round = 0;
88        if (fabs(floor(value + 0.5) - value) > integerTolerance) {
89            int nDownLocks = downLocks_[i];
90            int nUpLocks = upLocks_[i];
91            if (allTriviallyRoundableSoFar || (nDownLocks > 0 && nUpLocks > 0)) {
[944]92
[1286]93                if (allTriviallyRoundableSoFar && nDownLocks > 0 && nUpLocks > 0) {
94                    allTriviallyRoundableSoFar = false;
[1675]95                    bestFraction = COIN_DBL_MAX;
[1286]96                    bestLocks = COIN_INT_MAX;
97                }
[944]98
[1286]99                // the variable cannot be rounded
100                int nLocks = nDownLocks;
101                if (nDownLocks < nUpLocks)
102                    round = -1;
103                else if (nDownLocks > nUpLocks) {
104                    round = 1;
105                    fraction = 1.0 - fraction;
106                    nLocks = nUpLocks;
107                } else if (fraction < 0.5)
108                    round = -1;
109                else {
110                    round = 1;
111                    fraction = 1.0 - fraction;
112                    nLocks = nUpLocks;
113                }
114
115                // if variable is not binary, penalize it
116                if (!solver->isBinary(iColumn))
117                    fraction *= 1000.0;
118
119                if (nLocks < bestLocks || (nLocks == bestLocks &&
120                                           fraction < bestFraction)) {
121                    bestColumn = iColumn;
122                    bestLocks = nLocks;
123                    bestFraction = fraction;
124                    bestRound = round;
125                }
126            }
127        }
[868]128    }
[1286]129    return allTriviallyRoundableSoFar;
[868]130}
[1432]131
Note: See TracBrowser for help on using the repository browser.