1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
4 
5 #ifndef OPENCV_ML_INL_HPP
6 #define OPENCV_ML_INL_HPP
7 
8 namespace cv { namespace ml {
9 
10 // declared in ml.hpp
11 template<class SimulatedAnnealingSolverSystem>
simulatedAnnealingSolver(SimulatedAnnealingSolverSystem & solverSystem,double initialTemperature,double finalTemperature,double coolingRatio,size_t iterationsPerStep,CV_OUT double * lastTemperature,cv::RNG & rngEnergy)12 int simulatedAnnealingSolver(SimulatedAnnealingSolverSystem& solverSystem,
13      double initialTemperature, double finalTemperature, double coolingRatio,
14      size_t iterationsPerStep,
15      CV_OUT double* lastTemperature,
16      cv::RNG& rngEnergy
17 )
18 {
19     CV_Assert(finalTemperature > 0);
20     CV_Assert(initialTemperature > finalTemperature);
21     CV_Assert(iterationsPerStep > 0);
22     CV_Assert(coolingRatio < 1.0f);
23     double Ti = initialTemperature;
24     double previousEnergy = solverSystem.energy();
25     int exchange = 0;
26     while (Ti > finalTemperature)
27     {
28         for (size_t i = 0; i < iterationsPerStep; i++)
29         {
30             solverSystem.changeState();
31             double newEnergy = solverSystem.energy();
32             if (newEnergy < previousEnergy)
33             {
34                 previousEnergy = newEnergy;
35                 exchange++;
36             }
37             else
38             {
39                 double r = rngEnergy.uniform(0.0, 1.0);
40                 if (r < std::exp(-(newEnergy - previousEnergy) / Ti))
41                 {
42                     previousEnergy = newEnergy;
43                     exchange++;
44                 }
45                 else
46                 {
47                     solverSystem.reverseState();
48                 }
49             }
50         }
51         Ti *= coolingRatio;
52     }
53     if (lastTemperature)
54         *lastTemperature = Ti;
55     return exchange;
56 }
57 
58 }} //namespace
59 
60 #endif // OPENCV_ML_INL_HPP
61