Line data Source code
1 : #include "Opt/GeneticIntervalSolver.hpp" 2 : 3 : using namespace std; 4 : using namespace Opt; 5 : 6 : typedef UnivariateSolver::Var Var; 7 : 8 7 : GeneticIntervalSolver::GeneticIntervalSolver( 9 : size_t populationSize, 10 : size_t newPopulationSize, 11 : Var variabilityCoeff, 12 : size_t maxNumberGenerations, 13 : int parallelism, 14 : shared_ptr<mt19937> gen 15 7 : ): 16 : solver( 17 : populationSize, 18 : newPopulationSize, 19 : variabilityCoeff, 20 : maxNumberGenerations, 21 : parallelism, 22 : gen 23 : ), 24 14 : initialPopulationSize(populationSize + newPopulationSize) {} 25 : 26 7 : void GeneticIntervalSolver::setInterval(Var l, Var r) { 27 7 : left = l; 28 7 : right = r; 29 7 : } 30 : 31 7 : void GeneticIntervalSolver::setStopCriteria(Var e) { 32 7 : solver.setStopCriteria(e); 33 7 : } 34 : 35 7 : Var GeneticIntervalSolver::solve(Problem p) { 36 7 : solver.clearInitialSolutions(); 37 : 38 7707 : for(size_t i = 0; i < initialPopulationSize; ++i) { 39 7700 : double r = (double)i / ((double)initialPopulationSize - 1.0); 40 7700 : solver.addInitialSolution(left + (right - left) * r); 41 : } 42 : 43 60409 : Problem p_ = [&p, this](Var a) -> Var { 44 60409 : if(a < left || a > right) return numeric_limits<Var>::infinity(); 45 120786 : return p(a); 46 7 : }; 47 : 48 21 : return solver.solve(p_); 49 : }