GoldenCutLineSearcher.cpp 2.3 KB

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