diff --git a/mo/src/algo/moSA.h b/mo/src/algo/moSA.h index 31c98cc7d..49d8e4c0d 100644 --- a/mo/src/algo/moSA.h +++ b/mo/src/algo/moSA.h @@ -38,7 +38,6 @@ Contact: paradiseo-help@lists.gforge.inria.fr #include #include #include -#include /** * Simulated Annealing @@ -68,10 +67,10 @@ public: moLocalSearch(explorer, trueCont, _fullEval) { }*/ moSA(Neighborhood& _neighborhood, eoEvalFunc& _fullEval, moEval& _eval, double _initT=10, double _alpha=0.9, unsigned _span=100, double _finalT=0.01) - : moLocalSearch(*(explorer = new moSAexplorer(_neighborhood, _eval, *defaultSolNeighborComp, *defaultCool)), *(trueCont = new moTrueContinuator()), _fullEval), - defaultCool(new moSimpleCoolingSchedule(_initT, _alpha, _span, _finalT)), - default_eval(NULL), // removed in C++11 with unique_ptr - defaultSolNeighborComp(new moSolNeighborComparator()) + : moLocalSearch(explorer = *(defaultExplorer = new moSAexplorer(_neighborhood, _eval, *defaultSolNeighborComp, *defaultCool)), *(trueCont = new moTrueContinuator()), _fullEval), + defaultCool(new moSimpleCoolingSchedule(_initT, _alpha, _span, _finalT)) + //default_eval(NULL), // removed in C++11 with unique_ptr + //defaultSolNeighborComp(new moSolNeighborComparator()) //explorer(_neighborhood, _eval, *defaultSolNeighborComp, *defaultCool) { } @@ -147,30 +146,32 @@ public: _cool ) { }*/ : moLocalSearch ( - *(explorer = new moSAexplorer ( + explorer = *(defaultExplorer = new moSAexplorer ( _neighborhood, - _eval.hasValue()? _eval.get(): *(default_eval = new moFullEvalByCopy(_fullEval)), + _eval, //_eval.hasValue()? _eval.get(): *(default_eval = new moFullEvalByCopy(_fullEval)), // C++11: _eval.hasValue()? _eval.get(): default_eval = new moFullEvalByCopy(), - _comp.hasValue()? _comp.get(): *(defaultSolNeighborComp = new moSolNeighborComparator()), + _comp, //_comp.hasValue()? _comp.get(): *(defaultSolNeighborComp = new moSolNeighborComparator()), _cool )), - _cont.hasValue()? _cont.get(): *(trueCont = new moTrueContinuator()), _fullEval ), + _cont.hasValue()? _cont.get(): *(trueCont = new moTrueContinuator()), + _fullEval ), defaultCool(NULL), // removed in C++11 with unique_ptr - default_eval(NULL), // removed in C++11 with unique_ptr - trueCont(NULL), // removed in C++11 with unique_ptr - defaultSolNeighborComp(NULL) // removed in C++11 with unique_ptr + //default_eval(NULL), // removed in C++11 with unique_ptr + trueCont(NULL) // removed in C++11 with unique_ptr + //defaultSolNeighborComp(NULL) // removed in C++11 with unique_ptr { } moSA ( moSAexplorer& _explorer, - eoOptional< moContinuator > _cont = NULL, + eoOptional< moContinuator > _cont = NULL ) : moLocalSearch ( *(explorer = &_explorer), _cont.hasValue()? _cont.get(): *(trueCont = new moTrueContinuator()), _fullEval ), + defaultExplorer(NULL), // removed in C++11 with unique_ptr defaultCool(NULL), // removed in C++11 with unique_ptr - default_eval(NULL), // removed in C++11 with unique_ptr - trueCont(NULL), // removed in C++11 with unique_ptr - defaultSolNeighborComp(NULL) // removed in C++11 with unique_ptr + //default_eval(NULL), // removed in C++11 with unique_ptr + trueCont(NULL) // removed in C++11 with unique_ptr + //defaultSolNeighborComp(NULL) // removed in C++11 with unique_ptr { } virtual ~moSA () @@ -178,21 +179,17 @@ public: // Note: using unique_ptr would allow us to remove this explicit destructor, but they were only introduced in C++11 if (trueCont != NULL) delete trueCont; - if (defaultSolNeighborComp != NULL) - delete defaultSolNeighborComp; - if (default_eval != NULL) - delete default_eval; - if (defaultCool != NULL) - delete defaultCool; - delete explorer; + if (explorer != NULL) + delete explorer; } private: - moSAexplorer* explorer; // Not NULL + moSAexplorer* defaultExplorer; + moSAexplorer& explorer; // Not NULL (ref) moSimpleCoolingSchedule* defaultCool; // C++11: const std::unique_ptr> - moFullEvalByCopy* default_eval; + //moFullEvalByCopy* default_eval; moTrueContinuator* trueCont; - moSolNeighborComparator* defaultSolNeighborComp; + //moSolNeighborComparator* defaultSolNeighborComp; }; #endif diff --git a/mo/src/explorer/moSAexplorer.h b/mo/src/explorer/moSAexplorer.h index a3e729330..09eda6dab 100644 --- a/mo/src/explorer/moSAexplorer.h +++ b/mo/src/explorer/moSAexplorer.h @@ -41,6 +41,8 @@ #include #include #include +#include +#include #include @@ -68,6 +70,7 @@ public: * @param _solNeighborComparator a solution vs neighbor comparator * @param _coolingSchedule the cooling schedule */ + /* moSAexplorer ( Neighborhood& _neighborhood, moEval& _eval, @@ -80,6 +83,24 @@ public: { isAccept = false; + if (!neighborhood.isRandom()) { + std::cout << "moSAexplorer::Warning -> the neighborhood used is not random" << std::endl; + } + }*/ + moSAexplorer ( + Neighborhood& _neighborhood, + moCoolingSchedule& _cool, + eoOptional< moEval > _eval = NULL, + eoOptional< moSolNeighborComparator > _comp = NULL + ) + : moNeighborhoodExplorer(_neighborhood, _eval.hasValue()? _eval.get(): *(default_eval = new moFullEvalByCopy(_fullEval))), + default_eval(NULL), // removed in C++11 with unique_ptr + defaultSolNeighborComp(NULL), // removed in C++11 with unique_ptr + solNeighborComparator(_comp.hasValue()? _comp.get(): *(defaultSolNeighborComp = new moSolNeighborComparator())), + coolingSchedule(_coolingSchedule) + { + isAccept = false; + if (!neighborhood.isRandom()) { std::cout << "moSAexplorer::Warning -> the neighborhood used is not random" << std::endl; } @@ -89,6 +110,10 @@ public: * Destructor */ ~moSAexplorer() { + if (defaultSolNeighborComp != NULL) + delete defaultSolNeighborComp; + if (default_eval != NULL) + delete default_eval; } /** @@ -175,6 +200,10 @@ public: } private: + + moFullEvalByCopy* default_eval; + moSolNeighborComparator* defaultSolNeighborComp; + // comparator betwenn solution and neighbor moSolNeighborComparator& solNeighborComparator;