Advertisement
Guest User

Golden section search

a guest
Jan 23rd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.12 KB | None | 0 0
  1. void ScanViewer::Min_Search_Golden_Section
  2. (
  3.         qreal* a, qreal *fa , /// X->Y on the left side
  4.         qreal* b, qreal* fb , /// X->Y on the right side
  5.         qreal tolerance, QVector < int > x , QVector < int > y   /// tolerance limit , vector x ( encoder in mm ) , vector y ( beams in mm )
  6.         /// in case of light grid vector < int > y => QVector <QPair < int , int > limit;
  7. )
  8. {
  9.  
  10.    auto metrics = [this,x,y](qreal A)->qreal   /// finds S value based on max and min values of coordinates in rotated CS
  11.     {
  12.         qreal xmax  , xmin;
  13.         qreal ymax  , ymin;
  14.         QPoint AS = rotate(QPoint(x[0],y[0]),A);
  15.         xmax = xmin = AS.x();
  16.         ymax = ymin = AS.y();
  17.  
  18.             for ( int m = 0 ; m < x.size() ; m++ )
  19.             {
  20.                 QPoint AS = rotate(QPoint(x[m],y[m]),A);
  21.                 if (AS.x()>xmax) xmax = AS.x();
  22.                 if (AS.x()<xmin) xmin = AS.x();
  23.                 if (AS.y()>ymax) ymax = AS.y();
  24.                 if (AS.y()<ymin) ymin = AS.y();
  25.                 // #form first optimization factor
  26.             }
  27.  
  28.     return fabs(xmax-xmin)*(ymax-ymin);
  29.     };
  30.  
  31.    static const double lambda = 0.5 * (sqrt5 - 1.0);     /// Constant of golden section ( lambda )
  32.    static const double mu = 0.5 * (3.0 - sqrt5);         /// Constant equal 1 - lambda
  33.  
  34.    double x1;  /// left bound
  35.    double x2;  /// right bound
  36.    double fx1; /// left bound functional
  37.    double fx2; /// right bound functional
  38.  
  39.    // Find first two internal points and evaluate
  40.    // the function at the two internal points.
  41.  
  42.    /// Первичное объявление функций . ( A , B ) = ( 0, Pi/2 ) ; ( x1,x2 ) = (internal points dividing [a;b] & [ b;a ] in gold section)
  43.  
  44.    x1 = *b - lambda * (*b - *a);
  45.    x2 = *a + lambda * (*b - *a);
  46.  
  47.    /// S where alfa = x1 and x2
  48.  
  49.    fx1 = metrics(x1);
  50.    fx2 = metrics(x2);
  51.  
  52.  
  53.   // Verify that the tolerance is an acceptable number
  54.   // if (tolerance <= 0.0) tolerance = sqrt(DBL_EPSILON) * (*b - *a);
  55.  
  56.    // Loop by exluding segments from current endpoints a, b
  57.    // to current internal points x1, x2 and then calculating
  58.    // a new internal point until the length of the interval
  59.    // is less than or equal to the tolerance.
  60.  
  61.  
  62.    while (  ! Stopping_Rule( *a, *b, tolerance) ) {   /// Пока не достигнута заданная точность
  63.  
  64.  
  65.       if (fx1 > fx2) { /// если площадь прямоугольника со сторонами \\ осям в точке 1 > 2
  66.          *a = x1;      /// сужаем поисковый интервал слева до точки X1 + захват результата на выход
  67.          *fa = fx1;    /// пересчет левого значения площади не нужен - он известен и так
  68.          if ( Stopping_Rule( *a, *b, tolerance) ) break;   /// Если поисковый интервал стал подходить по точности выходим
  69.          x1 = x2;       /// левая внутренняя точка стала правой
  70.          fx1 = fx2;     /// соответствующая запись значения площади
  71.          x2 = *b - mu * (*b - *a);   ///
  72.          fx2 = metrics(x2);
  73.       }
  74.  
  75.  
  76.       else {          /// если площадь прямоугольника со сторонами \\ осям в точке 1 < 2
  77.          *b = x2;       /// сужаем поисковый интервал справа до точки X2 + захват результата на выход
  78.          *fb = fx2;     /// пересчет правого значения площади не нужен - он известен и так
  79.          if ( Stopping_Rule( *a, *b, tolerance) ) break;   /// Если поисковый интервал стал подходить по точности выходим
  80.          x2 = x1;       /// правая внутренняя точка стала левой
  81.          fx2 = fx1;     /// соответствующая запись значения площади
  82.          x1 = *a + mu * (*b - *a);
  83.          fx1 = metrics(x1);
  84.       }
  85.    }
  86.  
  87.  
  88.  
  89.    return;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement