Line data Source code
1 : #include "Opt/GoldenSectionSolver.hpp" 2 : 3 : using namespace std; 4 : using namespace Opt; 5 : 6 : typedef GoldenSectionSolver::Var Var; 7 : 8 10 : void GoldenSectionSolver::setInterval(Var left_, Var right_) { 9 10 : left = left_; 10 10 : right = right_; 11 10 : } 12 : 13 10 : void GoldenSectionSolver::setStopCriteria(Var e) { 14 10 : epsilon = e; 15 10 : } 16 : 17 12 : pair<Var, Var> GoldenSectionSolver::solveInterval(Problem f) { 18 12 : Var l = left, r = right; 19 : 20 12 : Var a = r - (r - l) * GOLDEN_SECTION; 21 12 : Var b = l + (r - l) * GOLDEN_SECTION; 22 12 : Var ya = f(a); 23 24 : Var yb = f(b); 24 436 : while(b - l > epsilon) { 25 424 : Var lprev = l, rprev = r; 26 424 : if(ya <= yb) { 27 242 : r = b; 28 242 : b = a; 29 242 : yb = ya; 30 242 : a = r - (r - l) * GOLDEN_SECTION; 31 484 : ya = f(a); 32 : } else { 33 182 : l = a; 34 182 : a = b; 35 182 : ya = yb; 36 182 : b = l + (r - l) * GOLDEN_SECTION; 37 364 : yb = f(b); 38 : } 39 424 : #pragma GCC diagnostic push 40 424 : #pragma GCC diagnostic ignored "-Wfloat-equal" 41 424 : if(l == lprev && r == rprev) 42 : break; 43 : #pragma GCC diagnostic pop 44 : } 45 : 46 12 : if(ya <= yb) { 47 : r = b; 48 : } else { 49 5 : l = a; 50 : } 51 : 52 12 : return make_pair(l, r); 53 : }