GoldenCutLineSearcher.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. // GoldenCutLineSearcher.cpp: Implementation of the LineSearcher class.
  4. //
  5. // Written by Matthias Wacker
  6. //
  7. //////////////////////////////////////////////////////////////////////
  8. #include "optimization/GoldenCutLineSearcher.h"
  9. using namespace OPTIMIZATION;
  10. GoldenCutLineSearcher::GoldenCutLineSearcher() : m_fac_a(0.38196601125010515179541316563436),m_fac_b(0.61803398874989484820458683436564)
  11. {
  12. m_c = 0.0;
  13. m_d = 10.0;
  14. m_eps = 0.1;
  15. }
  16. GoldenCutLineSearcher::GoldenCutLineSearcher(CostFunction *costFunc,OptLogBase* loger) : SuperClass(costFunc,loger),m_fac_a(0.38196601125010515179541316563436),m_fac_b(0.61803398874989484820458683436564)
  17. {
  18. m_c = 0.0;
  19. m_d = 10.0;
  20. m_eps = 0.1;
  21. }
  22. GoldenCutLineSearcher::GoldenCutLineSearcher(const GoldenCutLineSearcher &lin) : SuperClass(lin),m_fac_a(0.38196601125010515179541316563436),m_fac_b(0.61803398874989484820458683436564)
  23. {
  24. m_c = lin.m_c;
  25. m_d = lin.m_d;
  26. m_eps = lin.m_eps;
  27. }
  28. GoldenCutLineSearcher & GoldenCutLineSearcher::operator =(const GoldenCutLineSearcher &lin)
  29. {
  30. /*
  31. avoid self-copy
  32. */
  33. if(this != &lin)
  34. {
  35. /*
  36. =operator of SuperClass
  37. */
  38. SuperClass::operator=(lin);
  39. m_c = lin.m_c;
  40. m_d = lin.m_d;
  41. m_eps = lin.m_eps;
  42. }
  43. return *this;
  44. }
  45. GoldenCutLineSearcher::~GoldenCutLineSearcher()
  46. {
  47. }
  48. bool GoldenCutLineSearcher::setBounds(double c, double d)
  49. {
  50. if (c >= d)
  51. {
  52. return false;
  53. }
  54. m_c = c;
  55. m_d = d;
  56. return true;
  57. }
  58. bool GoldenCutLineSearcher::setEps(double eps)
  59. {
  60. if(eps < 0)
  61. {
  62. return false;
  63. }
  64. m_eps = eps;
  65. return true;
  66. }
  67. double GoldenCutLineSearcher::optimize()
  68. {
  69. double dk = m_d;
  70. double ck = m_c;
  71. double vk=0.0;
  72. double wk=0.0;
  73. bool vk_known = false;
  74. bool wk_known = false;
  75. double phivk=0.0;
  76. double phiwk=0.0;
  77. bool abort = false;
  78. while(abort == false)
  79. {
  80. if((dk - ck) <= m_eps)
  81. {
  82. abort = true;
  83. continue;
  84. }
  85. if(vk_known == false)
  86. {
  87. vk = ck + m_fac_a * (dk - ck);
  88. phivk = evaluateSub(vk);
  89. }
  90. vk_known = false;
  91. if(wk_known == false)
  92. {
  93. wk = ck + m_fac_b * (dk - ck);
  94. phiwk = evaluateSub(wk);
  95. }
  96. wk_known = false;
  97. if(phivk < phiwk)
  98. {
  99. dk = wk;
  100. wk = vk;
  101. phiwk = phivk;
  102. wk_known = true;
  103. }
  104. else
  105. {
  106. ck = vk;
  107. vk = wk;
  108. phivk = phiwk;
  109. vk_known = true;
  110. }
  111. }
  112. return (ck + dk)/2;;
  113. }