////////////////////////////////////////////////////////////////////// // // GoldenCutLineSearcher.cpp: Implementation of the LineSearcher class. // // Written by Matthias Wacker // ////////////////////////////////////////////////////////////////////// #include "optimization/GoldenCutLineSearcher.h" using namespace OPTIMIZATION; GoldenCutLineSearcher::GoldenCutLineSearcher() : m_fac_a(0.38196601125010515179541316563436),m_fac_b(0.61803398874989484820458683436564) { m_c = 0.0; m_d = 10.0; m_eps = 0.1; } GoldenCutLineSearcher::GoldenCutLineSearcher(CostFunction *costFunc,OptLogBase* loger) : SuperClass(costFunc,loger),m_fac_a(0.38196601125010515179541316563436),m_fac_b(0.61803398874989484820458683436564) { m_c = 0.0; m_d = 10.0; m_eps = 0.1; } GoldenCutLineSearcher::GoldenCutLineSearcher(const GoldenCutLineSearcher &lin) : SuperClass(lin),m_fac_a(0.38196601125010515179541316563436),m_fac_b(0.61803398874989484820458683436564) { m_c = lin.m_c; m_d = lin.m_d; m_eps = lin.m_eps; } GoldenCutLineSearcher & GoldenCutLineSearcher::operator =(const GoldenCutLineSearcher &lin) { /* avoid self-copy */ if(this != &lin) { /* =operator of SuperClass */ SuperClass::operator=(lin); m_c = lin.m_c; m_d = lin.m_d; m_eps = lin.m_eps; } return *this; } GoldenCutLineSearcher::~GoldenCutLineSearcher() { } bool GoldenCutLineSearcher::setBounds(double c, double d) { if (c >= d) { return false; } m_c = c; m_d = d; return true; } bool GoldenCutLineSearcher::setEps(double eps) { if(eps < 0) { return false; } m_eps = eps; return true; } double GoldenCutLineSearcher::optimize() { double dk = m_d; double ck = m_c; double vk=0.0; double wk=0.0; bool vk_known = false; bool wk_known = false; double phivk=0.0; double phiwk=0.0; bool abort = false; while(abort == false) { if((dk - ck) <= m_eps) { abort = true; continue; } if(vk_known == false) { vk = ck + m_fac_a * (dk - ck); phivk = evaluateSub(vk); } vk_known = false; if(wk_known == false) { wk = ck + m_fac_b * (dk - ck); phiwk = evaluateSub(wk); } wk_known = false; if(phivk < phiwk) { dk = wk; wk = vk; phiwk = phivk; wk_known = true; } else { ck = vk; vk = wk; phivk = phiwk; vk_known = true; } } return (ck + dk)/2;; }