unvisibleman

Метод имитации отжига

Feb 23rd, 2016
604
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.43 KB | None | 0 0
  1. //  Выбираем случайную точку
  2. for (int i = 0; i < xSize.Value; i++)
  3. {
  4.     x = "x" + (i + 1).ToString();
  5.     double space = Convert.ToDouble(xDiap.Rows[i].Cells[2].Value) - Convert.ToDouble(xDiap.Rows[i].Cells[0].Value);
  6.     x_min_rand[i] = rand.NextDouble() * space + Convert.ToDouble(xDiap.Rows[i].Cells[0].Value);
  7.     func.Parameters[x] = x_min_rand[i];
  8. }
  9. // вычисляем функцию
  10. f = Convert.ToDouble(func.Evaluate());
  11. for (int p = 0; p < xSize.Value; p++)
  12. {
  13.     x_min[p] = x_min_rand[p];
  14.     x_min_lin[p] = x_min_rand[p];
  15. }
  16.  
  17. f_min = f;          
  18. while (T > 1E-15)
  19. {
  20.     for (int i = 0; i < L; i++)
  21.     {
  22.         // Шаг 2.1. Выбираем новую точку х' из eps-окрестности точки х
  23.         for (int j = 0; j < xSize.Value; j++)
  24.         {
  25.             x = "x" + (j + 1).ToString();
  26.             x_min_2[j] = rand.NextDouble() * 2*eps+(x_min[j] - eps);
  27.  
  28.             double xUp = Convert.ToDouble(xDiap.Rows[j].Cells[2].Value)
  29.             if (x_min_2[j] > xUp)
  30.             {
  31.                 x_min_2[j] = xUp;
  32.             }
  33.             double xDown = Convert.ToDouble(xDiap.Rows[j].Cells[0].Value)
  34.             if (x_min_2[j] < xDown)
  35.             {
  36.                 x_min_2[j] = xDown;
  37.             }
  38.             func.Parameters[x] = x_min_2[j];
  39.         }
  40.  
  41.         f2 = Convert.ToDouble(func.Evaluate()); // f(x')
  42.  
  43.         // Шаг 2.2. Рассчитываем изменение целевой функции
  44.         delta = f2 - f_min;
  45.         // если разница <= 0, то
  46.         if (delta <= 0)
  47.         {
  48.             // x = x'
  49.             for (int p = 0; p < xSize.Value; p++)
  50.             {
  51.                 x_min[p] = x_min_2[p];
  52.             }
  53.             f_min = f2;
  54.         }
  55.         else
  56.         {
  57.             // иначе если ...
  58.             if (Math.Exp(-delta / T) > rand.NextDouble())
  59.             {
  60.                 // x = x'
  61.                 for (int p = 0; p < xSize.Value; p++)
  62.                 {
  63.                     x_min[p] = x_min_2[p];
  64.                 }
  65.                 f_min = f2;
  66.             }
  67.         }
  68.  
  69.         list.Add(counter, f_min);
  70.         if (f_min < f_min_lin)
  71.         {
  72.             f_min_lin = f_min;
  73.             for (int p = 0; p < xSize.Value; p++)
  74.             {
  75.                 x_min_lin[p] = x_min[p];
  76.             }
  77.         }
  78.        
  79.         counter++;
  80.     }
  81.  
  82.     // Шаг 3. Уменьшаем температуру
  83.     T *= r;
  84.     progressBar1.PerformStep();
  85. }
Advertisement
Add Comment
Please, Sign In to add comment