Advertisement
adwas33

Untitled

Nov 18th, 2022
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. #if LAB_NO==2 && LAB_PART==2
  2. (*ud).add_row((B.x - A.x)());
  3. #endif
  4. if (B.x - A.x < epsilon || abs(D.x()-D_old.x()<gamma))
  5. return C;
  6. D_old = D;
  7. }
  8. }
  9. #endif
  10. #if LAB_NO>2
  11. //sprawdzam w jednej płaszczyźnie poźniej w drugiej i przesuwam się tam gdzie jest lepiej
  12. solution HJ(matrix x0, double s, double alpha, double epsilon, int Nmax, matrix *ud, matrix *ad)
  13. {
  14. solution XB(x0), XB_old, X;
  15. XB.fit_fun(ud, ad);
  16. while (true)
  17. {
  18. X = HJ_trial(XB, s, ud, ad);
  19. if (X.y <XB.y)
  20. {
  21. while (true)
  22. {
  23. XB_old = XB;
  24. XB = X;
  25. #if LAB_NO==3 && LAB_PART==2
  26. ? ? ?
  27. #endif
  28. X.x = 2 * XB.x - XB_old.x;
  29. X.fit_fun(ud, ad);
  30. X = HJ_trial(X, s, ud, ad);
  31. if (X.y >= XB.y)
  32. break;
  33. if (solution::f_calls>Nmax)
  34. return XB;
  35. }
  36. }
  37. else
  38. s=s*alpha;
  39. if (s < epsilon || solution::f_calls > Nmax)
  40. return XB;
  41. }
  42. }
  43.  
  44. solution HJ_trial(solution XB, double s, matrix *ud, matrix *ad)
  45. {
  46. int n=get_dim(XB);
  47. matrix D = ident_mat(n);
  48. solution X;
  49. for (int i = 0; i < n; ++i)
  50. {
  51. X.x = XB.x + s * D[i];
  52. X.fit_fun(ud, ad);
  53. if (X.y < XB.y)
  54. XB = X;
  55. else
  56. {
  57. X.x = XB.x - s * D[i];
  58. X.fit_fun(ud, ad);
  59. if (X.y < XB.y)
  60. XB = X;
  61. }
  62. }
  63. return XB;
  64. }
  65.  
  66. // różne długości dla różnych kierunków;
  67. //alpha >1
  68. //jeśli nie poszło lepiej zmniejszam krok i zmieniam na przeciwny (s=-1*s*beta)[beta<1]
  69. //zliczam również sumaryczne przesunięcia w danym kierunku
  70. solution Rosen(matrix x0, matrix s0, double alpha, double beta, double epsilon, int Nmax, matrix *ud, matrix *ad)
  71. {
  72. solution X(x0), Xt;
  73. int n = get_dim(X);//liczba wymiarów
  74. matrix l(n, 1),//odległoś od orginalnego punktu
  75. p(n, 1),//porażki w kierunu
  76. s(s0),//długości kroku
  77. D = ident_mat(n);
  78. X.fit_fun(ud, ad);
  79. while (true)
  80. {
  81. for (int i = 0; i < n; ++i)
  82. {
  83. Xt.x = X.x + s(i) * D[i];
  84. Xt.fit_fun(ud, ad);
  85. if (Xt.y < X.y)
  86. {
  87. X = Xt;
  88. l(i) += s(i);
  89. s(i) *= alpha;
  90. }
  91. else
  92. {
  93. ++p(i);
  94. s(i) *= -beta;
  95. }
  96. }
  97. #if LAB_NO==3 && LAB_PART==2
  98. ???
  99. #endif
  100. bool change = true;
  101. for (int i = 0; i < n; ++i)
  102. if (p(i)==0 || l(i)==0)
  103. {
  104. change = false;
  105. break;
  106. }
  107. if (change)
  108. {
  109. matrix Q(n,n), v(n,1);
  110. for (int i = 0; i<n; ++i)
  111. for (int j = 0; j<=i; ++j)
  112. Q(i, j) = l(i);
  113. Q = D * Q;
  114. v = Q[0] / norm(Q[0]);
  115. D.set_col(v,0);
  116. for (int i = 1; i<n; ++i)
  117. {
  118. matrix temp(n,1);
  119. for (int j = 0; j < i; ++j)
  120. temp = temp + trans(Q[i]) * D[j] * D[j];
  121. v = (Q[i] - temp) / norm(Q[i] - temp);
  122. D.set_col(v,i);
  123. }
  124. s = s0;
  125. l = matrix(n, 1);
  126. p = matrix(n, 1);
  127. }
  128. double max_s = abs(s(0));
  129. for (int i = 1; i < n; ++i)
  130. if (max_s < abs(s(i)))
  131. max_s = abs(s(i));
  132. if (max_s<epsilon || solution::f_calls>Nmax)
  133. return X;
  134. }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement