123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- //////////////////////////////////////////////////////////////////////
- //
- // 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;;
- }
|