Advertisement
adwas33

Untitled

Nov 18th, 2022
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. solution HJ(matrix(*ff)(matrix, matrix, matrix), matrix x0, double s, double alpha, double epsilon, int Nmax, matrix ud1, matrix ud2)
  2. {
  3. try
  4. {
  5. solution XB, XB_old, X;
  6. XB.x = x0;
  7. XB.fit_fun(ff, ud1, ud2);
  8. while (true)
  9. {
  10.  
  11. X = HJ_trial(ff, XB, s, ud1, ud2);
  12. cout << X.x(0) << " " << X.x(1) << endl;
  13. if (X.y < XB.y)
  14. {
  15. while (true)
  16. {
  17. XB_old = XB;
  18. XB = X;
  19. X.x = XB.x + XB.x - XB_old.x;
  20.  
  21. X.fit_fun(ff, ud1, ud2);
  22. X = HJ_trial(ff, X, s, ud1, ud2);
  23. if (X.y >= XB.y)
  24. break;
  25. if (XB.f_calls > Nmax)
  26. return XB;
  27. }
  28. }
  29. else
  30. s *= alpha;
  31. if (XB.f_calls > Nmax || s < epsilon)
  32. return XB;
  33. }
  34. }
  35. catch (string ex_info)
  36. {
  37. throw ("solution HJ(...):\n" + ex_info);
  38. }
  39. }
  40.  
  41. solution HJ_trial(matrix(*ff)(matrix, matrix, matrix), solution XB, double s, matrix ud1, matrix ud2)
  42. {
  43. try
  44. {
  45. int* n = get_size(XB.x); //rozmiar problemu
  46. matrix D(n[0], n[0]); //macierz kierunku
  47. for (int i = 0; i < n[0]; i++) {
  48. D(i, i) = 1;
  49. }
  50. solution X;
  51. for (int i = 0; i < n[0]; ++i)
  52. {
  53. X.x = XB.x + s * D[i];
  54. X.fit_fun(ff, ud1, ud2);
  55. if (X.y < XB.y)
  56. XB = X;
  57. else
  58. {
  59. X.x = XB.x - s * D[i];
  60. X.fit_fun(ff, ud1, ud2);
  61. if (X.y < XB.y)
  62. XB = X;
  63. }
  64. }
  65. return XB;
  66. }
  67. catch (string ex_info)
  68. {
  69. throw ("solution HJ_trial(...):\n" + ex_info);
  70. }
  71. }
  72.  
  73. solution Rosen(matrix(*ff)(matrix, matrix, matrix), matrix x0, matrix s0, double alpha, double beta, double epsilon, int Nmax, matrix ud1 , matrix ud2)// throw (string);
  74. {
  75. //alfa >0
  76. //beta<0
  77. int* n = get_size(x0);
  78. matrix l(n[0], 1), p(n[0], 1), s(s0);
  79. matrix D(n[0], n[0]); //macierz kierunku
  80. for (int i = 0; i < n[0]; i++) {
  81. D(i, i) = 1;
  82. }
  83. solution X, Xt;
  84. X.x = x0;
  85. X.fit_fun(ff, ud1, ud2);
  86. while (true)
  87. {
  88. cout << X.x(0) << "\n" << X.x(1) << endl;
  89. for (int i = 0; i < n[0]; ++i)
  90. {
  91. Xt.x = X.x + s(i) * D[i];
  92. Xt.fit_fun(ff, ud1, ud2);
  93. if (Xt.y < X.y)
  94. {
  95. X = Xt;
  96. l(i) += s(i);
  97. s(i) *= alpha;
  98. }
  99. else
  100. {
  101. p(i) += 1;
  102. s(i) *= (-beta);
  103. }
  104. }
  105. bool change = true;
  106. for (int i = 0; i < n[0]; ++i)
  107. if (l(i) != 0 || p(i) != 0) // l || p
  108. {
  109. change = false;
  110. break;
  111. }
  112. if (change)
  113. {
  114. matrix Q(n[0], n[0]), v(n[0], 1);
  115. for (int i = 0; i < n[0]; ++i)
  116. for (int j = 0; j <= i; ++j)
  117. Q(i, j) = l(i);
  118. Q = D * Q;
  119. v = Q[0] / norm(Q[0]);
  120. D.set_col(v, 0);
  121. for (int i = 1; i < n[0]; ++i)
  122. {
  123. matrix temp(n[0], 1);
  124. for (int j = 0; j < i; ++j)
  125. temp = trans(Q[j]) * D[j] * D[j];
  126. v = Q[i] - temp / norm(Q[i] - temp);
  127. D.set_col(v, i);
  128. }
  129. s = s0;
  130. l = 0;
  131. p = 0;
  132. }
  133. double max_s = abs(s(0));
  134. for (int i = 1; i < n[0]; ++i)
  135. if (max_s < abs(s(i)))
  136. max_s = abs(s(i));
  137. cout<<X<<endl;
  138. if (solution::f_calls > Nmax || max_s <= epsilon)
  139. return X;
  140. }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement