Advertisement
Guest User

Untitled

a guest
Dec 11th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. /*Класс, производящий многомерную оптимизацию*/
  2. class MultiDimensionalOptimization
  3. {
  4. public:
  5.  
  6.     /*ЦПС с ускоряющим шагом*/
  7.     static Point CPS(double(*f) (Point), Point x0, int & k, double eps = 0.00001, int maxK = 10000)
  8.     {
  9.         func = f;
  10.  
  11.         k = 0;//Счетчик итераций
  12.  
  13.         Point x = x0;//Текущая точка
  14.         Point prevX = x0;//Предыдущая точка
  15.  
  16.         Vector p(x.ComponentsNumber);//Направление поиска
  17.         Vector d(x.ComponentsNumber);//Направление ускоряющего шага
  18.  
  19.         double minAlpha = 0;
  20.  
  21.         do
  22.         {
  23.             prevX = x;
  24.  
  25.             for (int i = 0; i < x.ComponentsNumber; i++)
  26.             {
  27.                 p.Components[i] = 1;
  28.  
  29.                 beginPoint = x;
  30.                 searchDirection = p;
  31.                 minAlpha = OneDimensionalOptimization::Search(FuncByAlpha);
  32.                 x = x + minAlpha * p;
  33.  
  34.                 p.Components[i] = 0;
  35.             }
  36.  
  37.             for (int i = 0; i < x.ComponentsNumber; i++) d.Components[i] = x.Components[i] - prevX.Components[i];
  38.  
  39.             if (!d.IsZero())
  40.             {
  41.                 Vector normalizedVector = d;
  42.                 normalizedVector.Normalize();
  43.  
  44.                 beginPoint = x;
  45.                 searchDirection = normalizedVector;
  46.                 minAlpha = OneDimensionalOptimization::Search(FuncByAlpha);
  47.                 x = x + minAlpha * normalizedVector;
  48.             }
  49.  
  50.             k++;
  51.         } while (d.GetNorm() > eps && k < maxK);
  52.  
  53.         return x;
  54.     }
  55.  
  56. private:
  57.     /*Тестируемая функция, зависящая от одного аргумента (alpha).Возвращает
  58.     значения функции вдоль заданного направления*/
  59.     static double FuncByAlpha(double alpha)
  60.     {
  61.         Point newPoint = beginPoint + alpha * searchDirection;
  62.         return func(newPoint);
  63.     }
  64.  
  65.     static double(*func) (Point);//Тестируемая функция
  66.     static Point  beginPoint;//Текущая точка
  67.     static Vector searchDirection;//Текущее направление поиска
  68. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement