Відмінності між версіями «Метод конфігурації Хука-Дживса.»

(Алгоритм методу)
 
(Не показано 29 проміжних версій цього користувача)
Рядок 70: Рядок 70:
 
'''''Крок 3'''''. Перевірити умови:
 
'''''Крок 3'''''. Перевірити умови:
  
  '''''а)''''' Якщо <math>i<n</math>, то продовжити <math>i=i+1</math> і перейти до кроку 2. (продовжити досліджуючий пошук по напрямкам, які залишилися)
+
'''''а)''''' Якщо <math>i<n</math>, то поставити <math>i=i+1</math> і перейти до кроку 2. (продовжити досліджуючий пошук по напрямкам, які залишилися)
  
  '''''а)''''' Якщо  
+
'''''б)''''' Якщо <math>i=n</math>, перевірити успішність досліджуючого пошуку:
 +
- якщо <math>f({{X}^{k+1}})<f({{X}^{k}})</math>, перейти до кроку 4;
 +
- якщо <math>f({{X}^{k+1}})\ge f({{X}^{k}})</math>, перейти до кроку 5.
  
  
 +
'''''Крок 4'''''. Провести пошук за зразком:
  
'''''Крок 4'''''.
+
<math>{{X}^{zr}}={{X}^{k+1}}+\lambda ({{X}^{k+1}}-{{X}^{k}})</math>
  
 +
В точці <math>{{X}^{zr}}</math> провести ''досліджуючий пошук'', в результаті якого отримується точка <math>{{X}^{dp}}</math>.
 +
Якщо <math>{{X}^{dp}}\ne {{X}^{zr}}</math>, то точка <math>{{X}^{k+1}}={{X}^{dp}}</math> стає точкою '''''нового базису''''', а <math>{{X}^{k}}</math> - точкою '''''старого базису'''''. Перейти до кроку 5.
 +
Якщо <math>{{X}^{dp}}={{X}^{zr}}</math>, то пошук за зрозком вважається неуспішним, точки  <math>{{X}^{dp}},{{X}^{zr}}</math> анулюються, точка <math>{{X}^{k+1}}</math> залишається точкою нового базису, а <math>{{X}^{k}}</math> - точкою старого базису. Перейти до кроку 2.
  
  
'''''Крок 5'''''.
+
'''''Крок 5'''''. Перевірити умову завершення обрахунку:
 +
'''''а)''''' Якщо всі <math>{{\Delta }_{i}}<\varepsilon </math> то пошук закінчити <math>{{X}^{*}}={{X}^{k}}</math>.
 +
 
 +
'''''б)''''' Для тих і, для яких <math>{{\Delta }_{i}}>\varepsilon </math>, зменшити величину кроку іперейти до кроку 2.
  
 
=Приклад=
 
=Приклад=
Мінімізувати <math>${({x_1} - 2)^4} + {({x_1} - 2{x_2})^2}.$</math><br>
+
Знайти мінімум функції <math>f(x)=4{{({{x}_{1}}-5)}^{2}}+{{({{x}_{1}}-6)}^{2}}</math>
Результати обчислень методом Девідона - Флетчера - Пауелла приведені в таблиці 1.<br>
+
 
<center>
+
 
<table width="382" border="1">
+
== Розвязок ==
 +
 
 +
 
 +
''Крок 1''. Задамо початкову точку <math>{{X}^{0}}=(x_{_{1}}^{0},x_{2}^{0})=(8,9)</math>; числа <math>\varepsilon =0.3;{{\Delta }_{1}}=1;{{\Delta }_{2}}=2;\lambda =1.</math>
 +
Поставимо <math>i=1,k=0.</math>
 
   
 
   
  <tr>
 
    <th scope="row">k</th>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em><math>${x_k}$</math><br><math>$f({x_k})$</math></em></strong></td>
 
    <td width="18" bgcolor="#BDE0BA"><strong><em>j</em></strong></td>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em><math>${y_j}$</math><br><math>$f({y_j})$</math></em></strong></td>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em><math>$\nabla f({y_j})$</math></em></strong></td>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em><math>$\left\| {\left. {\nabla f({y_j})} \right\|} \right.$</math></em></strong></td>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em>D</em></strong></td>
 
    <td width="75" bgcolor="#BDE0BA"><strong><em><math>${d_j}$</math></em></strong></td>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em><math>${\lambda _j}$</math></em></strong></td>
 
    <td width="65" bgcolor="#BDE0BA"><strong><em><math>${y_{j + 1}}$</math></em></strong></td>
 
   
 
  </tr>
 
  <tr>
 
    <th scope="row">1</th>
 
    <td bgcolor="">(0.00,3.00)<br>(52.00)</td>
 
  
    <td bgcolor="">1</td>
+
''Крок <math>{{2}^{0}}</math>''. 
    <td bgcolor="">(0.00,3.00)<br>(52.00)</td>
+
<math>f(x_{1}^{0},x_{2}^{0})=45.</math>
    <td bgcolor="">(-44.00,24.00)</td>
+
 
    <td bgcolor="">50.12</td>
+
<math>f(x_{1}^{0}+{{\Delta }_{1}},x_{2}^{0})=f(9,9)=73</math>.
    <td bgcolor=""><math>$\left[
+
Оскільки <math>f(x_{1}^{0}+{{\Delta }_{1}},x_{2}^{0})>f(x_{1}^{0},x_{2}^{0})</math>, то крок неуспішний.
1|0\\
+
 
0|1 \right]$</math></td>
+
<math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})=f(7,9)=25</math>.
    <td bgcolor="">(44.00,-24.00)</td>
+
Оскільки <math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})<f(x_{1}^{0},x_{2}^{0})</math>, то крок успішний.
<td bgcolor="">0.062</td>
+
 
<td bgcolor="">(2.70, 1.51)</td>
+
 
  </tr>
+
''Крок <math>{{3}^{0}}</math>''. Оскільки <math>i=1<2=n</math>, то поставимо <math>i=2</math> і перейдемо до кроку 2.
  <tr>
+
 
    <th scope="row"></th>
+
 
    <td bgcolor=""></td>
+
''Крок <math>{{2}^{1}}</math>''. 
    <td bgcolor="">2</td>
+
 
    <td bgcolor="">(2.70,1.51)<br>(0.34)</td>
+
<math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}+{{\Delta }_{2}})=f(7,11)=41</math>
    <td bgcolor="">(0.73,1.28)</td>
+
Оскільки <math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}+{{\Delta }_{2}})>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})=25</math>, то крок неуспішний.
    <td bgcolor="">1.47</td>
+
 
    <td bgcolor=""><math>$\left[
+
<math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})=f(7,7)=17</math>. Оскільки <math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})<f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})</math>, то крок успішний.
0.25|0.38\\
+
 
0.38|0.71 \right]$</math></td>
+
 
    <td bgcolor="">(-0.67,-1.31)</td>
+
''Крок <math>{{3}^{1}}</math>''. Оскільки <math>i=2=n</math> і  <math>f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})=f(7,7)=17<f(x_{1}^{0},x_{2}^{0})=45</math>, то перейдемо до кроку 4.
    <td bgcolor="">0.22</td>
+
 
    <td bgcolor="">(2.55,1.22)</td>
+
 
  </tr>
+
''Крок <math>{{4}^{0}}</math>''. Проведемо пошук за зразком з точки <math>{{X}^{dp}}(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})=(7,7)</math>. Поставимо
 +
<math>i=1,k=k+1=1</math>.
 +
 
 +
<math>{{X}^{zr}}={{X}^{dp}}+1({{X}^{dp}}-{{X}^{0}})={{(7,7)}^{T}}-\left[ {{(7,7)}^{T}}-{{(8,9)}^{T}} \right]={{(6,5)}^{T}}</math>.
 +
Перейдемо до кроку 2.
 +
 
 +
 
 +
''Крок <math>{{2}^{2}}</math>''. Виконаємо досліджуючий пошук з точки <math>{{X}^{zr}}</math>.
 +
<math>f({{X}^{zr}})=f(6.5)=5</math>.
 +
 
 +
Оскільки <math>f(x_{1}^{zr}+{{\Delta }_{1}},x_{2}^{zr0})=(7,5)=17>f(X_{{}}^{zr})</math>, то крок неуспішний.
 +
 
 +
Оскільки <math>f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=(5,5)=1<f(X_{{}}^{zr})</math>, то крок успішний.
 +
 
 +
 
 +
''Крок <math>{{3}^{2}}</math>''. Оскільки <math>i=1<2=n</math>, то поставимо <math>i=i+1=2</math> і перейдемо до кроку 2.
 +
 
 +
 
 +
''Крок <math>{{2}^{3}}</math>''. Оскільки <math>f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr}+{{\Delta }_{2}})=f(5,7)=1=f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=f(5,5)=1</math>, то крок неуспішний.
 +
 
 +
Оскільки <math>f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr}-{{\Delta }_{2}})=f(5,3)=9>f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=f(5,5)=1</math>, то крок неуспішний.
 +
 
 +
 
 +
''Крок <math>{{3}^{2}}</math>''. Оскільки <math>i=2=n</math> і <math>f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=f(5,5)=1<f({{X}^{dp}})=f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{1}})=f(7,7)=17</math>, то пошук за зразком на кроці 40 пройшов успішно.
 +
 
 +
Точка <math>{{X}^{2}}=(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=(5,5)</math> стає '''''новим базисом''''', а точка <math>{{X}^{1}}=(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{1}})=(7,7)</math> стає '''''старим базисом'''''. Виконаємо пошук за зразком з нового базису. Перейдем до кроку 4.
 +
 
 +
 
 +
''Крок <math>{{4}^{1}}</math>''. Поставимо <math>i=1,k=k+1=2</math>,
 +
<math>{{X}^{zr}}={{X}^{2}}+({{X}^{2}}-{{X}^{1}})={{(5,5)}^{T}}-\left[ {{(5,5)}^{T}}-{{(7,7)}^{T}} \right]={{(3,3)}^{T}}</math> і перейдемо до кроку 2.
 +
 
 +
 
 +
''Крок <math>{{2}^{4}}</math>''.
 +
<math>f(3,3)=25</math>. Оскільки <math>f(3-{{\Delta }_{1}},3)=f(4,3)=13<f(3,3)=25</math>, то крок успішний.
 +
 
 +
 
 +
''Крок <math>{{3}^{4}}</math>''. Так як
 +
<math>i=1<n=2</math>, то поставимо <math>i=i+1=2.</math> і перейдемо до кроку 2.
 +
 
 +
 
 +
''Крок <math>{{2}^{5}}</math>''. Оскільки <math>f(4,3+{{\Delta }_{2}})=f(4,5)=5<f(4,3)=13</math>, то крок успішний.
 +
 
  
  <tr>
+
''Крок <math>{{3}^{5}}</math>'. Так як <math>i=2=n</math> і <math>f(4,5)=5>f(5,5)=1</math>, то пошук за зразком на кроці  <math>{{4}^{1}}</math> пройшов неуспішно. Переходимо до кроку 5.
    <th scope="row">2</th>
 
    <td bgcolor="">(2.55,1.22)<br>(0.1036)</td>
 
    <td bgcolor="">1</td>
 
    <td bgcolor="">(2.55,1.22)<br>(0.1036)</td>
 
    <td bgcolor="">(0.89,-0.44)</td>
 
    <td bgcolor="">0.99</td>
 
    <td bgcolor=""><math>$\left[
 
1|0\\
 
0|1 \right]$</math></td>
 
    <td bgcolor="">(-0.89,0.44)</td>
 
    <td bgcolor="">0.11</td>
 
    <td bgcolor="">(2.45,1.27)</td>
 
  </tr>
 
<tr>
 
    <th scope="row"></th>
 
    <td bgcolor=""></td>
 
    <td bgcolor="">2</td>
 
    <td bgcolor="">(2.45,1.27)<br>(0.0490)</td>
 
    <td bgcolor="">(0.18,0.36)</td>
 
    <td bgcolor="">0.40</td>
 
    <td bgcolor=""><math>$\left[
 
0.65|0.45\\
 
0.45|0.46 \right]$</math></td>
 
    <td bgcolor="">(-0.28,-0.25)</td>
 
    <td bgcolor="">0.64</td>
 
    <td bgcolor="">(2.27,1.11)</td>
 
  </tr>
 
  <tr>
 
    <th scope="row">3</th>
 
    <td bgcolor="">(2.27,1.11)<br>(0,008)</td>
 
    <td bgcolor="">1</td>
 
    <td bgcolor="">(2.27,1.11)<br>(0,008)</td>
 
    <td bgcolor="">(0.18,-0.20)</td>
 
    <td bgcolor="">0.27</td>
 
    <td bgcolor=""><math>$\left[
 
1|0\\
 
0|1 \right]$</math></td>
 
<td bgcolor="">(-0.18,0.20)</td>
 
<td bgcolor="">0.10</td>
 
<td bgcolor="">(2.25,1.13)</td>
 
  </tr>
 
<tr>
 
    <th scope="row"></th>
 
    <td bgcolor=""></td>
 
    <td bgcolor="">2</td>
 
    <td bgcolor="">(2.25,1.13)<br>(0.004)</td>
 
    <td bgcolor="">(0.04,0.04)</td>
 
    <td bgcolor="">0.06</td>
 
    <td bgcolor=""><math>$\left[
 
0.80|0.38\\
 
0.38|0.31 \right]$</math></td>
 
    <td bgcolor="">(-0.05,-0.03)</td>
 
    <td bgcolor="">2.64</td>
 
    <td bgcolor="">(2.12,1.05)</td>
 
  </tr>
 
<tr>
 
    <th scope="row">4</th>
 
    <td bgcolor="">(2.12,1.05)<br>(0,0005)</td>
 
    <td bgcolor="">1</td>
 
    <td bgcolor="">(2.12,1.05)<br>(0,0005)</td>
 
    <td bgcolor="">(0.05,-0.08)</td>
 
    <td bgcolor="">0.09</td>
 
    <td bgcolor=""><math>$\left[
 
1|0\\
 
0|1 \right]$</math></td>
 
<td bgcolor="">(-0.05,0.08)</td>
 
<td bgcolor="">0.10</td>
 
<td bgcolor="">(2.115,1.058)</td>
 
  </tr>
 
<tr>
 
    <th scope="row"></th>
 
    <td bgcolor=""></td>
 
    <td bgcolor="">2</td>
 
    <td bgcolor="">(2.115,1.058)<br>(0.0002)</td>
 
    <td bgcolor="">(0.004,0.004)</td>
 
    <td bgcolor="">0.006</td>
 
    <td bgcolor=""></td>
 
    <td bgcolor=""></td>
 
    <td bgcolor=""></td>
 
    <td bgcolor=""></td>
 
 
 
  </tr>
 
</table>
 
</center><br>
 
На кожній ітерації вектор<math>${d_j}$</math> для j=1,2 визначається у вигляді <math>$ - {D_j}\nabla f({y_j})$</math>, де <math>${D_1}$</math> одинична матриця, а <math>${D_2}$</math> обчислюється по формулах (1) - (3). При k = 1 маємо <math>${p_1} = {(2.7, - 1.49)^T},{q_1} = {(44.73, - 22.72)^T}$</math>. На другій ітерації <math>${p_1} = {(-0.1, 0.05)^T},{q_1} = {(-0.7, 0.8)^T}$</math> і, нарешті, на третій ітерації <math>${p_1} = {(-0.02, 0.02)^T},{q_1} = {(-0.14, 0.24)^T}$</math>. Точка <math>${y_{j + 1}}$</math> обчислюється оптимізацією уздовж напряму <math>${d_j}$</math> при початковій точці <math>${y_j}$</math> для j = 1, 2. Процедура зупинена в точці <math>${y_2} = {(2.115, 1.058)^T}$</math> на четвертій ітерації оскільки норма <math>$\left\| {\left. {f({y_2})} \right\| = 0.006} \right.$</math> досить мала. Траєкторія руху, отримана методом, показана на рисунку 1.<br>
 
Рисунок 1 - Метод Дэвидона - Флетчера - Пауэлла.<br>
 
<center>[[Файл:Рисунок_1.gif]]</center><br>
 
  
Лема показує, що кожна матриця <math>${d_j}$</math> позитивно визначена і <math>${d_j}$</math> є напрямом спуску. Для доказу леми нам знадобиться : <br>
 
'''Теорема 1.''' Нехай S - непорожня безліч в Еn, точка <math>$x \in cl$</math> S. Конусом можливих напрямів в точці x називається безліч <math>$D = \left\{ {d:d \ne 0,x + \lambda d \right \in S$</math>при всіх <math>$\lambda  \in (0,\delta )$</math> для деякого <math>$\delta  > 0}$</math>.<br>
 
'''Визначення.'''Нехай x і y - вектори з Еn і <math>$\left| {{x^T}y} \right|$</math> - абсолютне значення скалярного відтворення <math>$\left {{x^T}y} \right$</math>. Тоді виконується наступна нерівність, звана нерівністю Шварца:<br>
 
<center> <math>$\left| {{x^T}y} \right| \le \left\| x \right\|\left\| y \right\|$</math></center>.<br>
 
  
=Лема 1=
+
''Крок <math>{{5}^{0}}</math>'. Оскільки <math>{{\Delta }_{1}}=1>\varepsilon =0.3,{{\Delta }_{2}}=1>\varepsilon =0.3</math>, то необхідно зменшити крок. Поставимо
Нехай <math>${y_1} \in {E_n}$</math>, а <math>${D_1}$</math> – початкова позитивно певна симетрична матриця. Для j = 1 ..., n покладемо <math>${y_{j + 1}} = {y_j} + {\lambda _j}{d_j}$</math>, де <math>${d_j} = - D\nabla f({y_j})$</math>, а <math>${\lambda _j}$</math> є оптимальним рішенням задачі мінімізації <math>$f({y_j} + \lambda {d_j})$</math> при <math>$\lambda  \ge 0$</math>. Нехай, крім того, для j = 1 ..., n – 1 матриця Dj+1 визначається по формулах (1) - (3). Якщо  <math>$\nabla f({y_j}) \ne 0$</math> для j = 1 ..., n, то матриці D1 ...,Dn симетричні і позитивно визначені, так що d1 ..., dn – напрями спуску.<br>
+
<math>{{\Delta }_{1}}=0.5,{{\Delta }_{2}}=1,k=k+1=3</math>, за базис візьмем точку <math>(5,5)</math> і повторимо цикл розрахунків з новим базисом і новими значеннями кроків.
  
'''Доведення'''<br>
+
Мінімум досягається в точці <math>{{X}^{*}}=(5,6)</math>.
Проведено доведення по індукції. При j = 1 матриця D1 симетрична і позитивно визначена по умові леми. Крім того,  <math>
 
\nabla f{({y_1})^T}{d_1} =  - \nabla f{({y_1})^T}{D_1}\nabla f({y_1}) < 0</math>, оскільки D1 позитивно визначена. Тоді по теоремі 1 вектор d1 визначає напрям спуску. Передбачимо, що затвердження леми справедливе для деякого <math> j \le n - 1</math>, і покажемо, що воно справедливе для j+1. Нехай x – ненульовий вектор з En, тоді з (1) маємо<br>
 
<center><math>{x^T}{D_{j + 1}}x = {x^T}{D_j}x + {\textstyle{{{{({x^T}{p_j})}^2}} \over {p_j^T{D_j}{q_j}}}}</math>(4)</center><br>
 
Оскільки Dj – симетрична позитивно певна матриця, то існує позитивно визначена матриця <math>D_j^{1/2}</math>, така, що <math>{D_j} = D_j^{1/2}D_j^{1/2}</math>. Нехай <math>a = D_j^{1/2}x</math> і <math>b = D_j^{1/2}{q_j}</math>. Тоді <math>{x^T}{D_j}x = {a^T}a,q_j^T{D_j}{q_j} = {b^T}b,{x^T}{D_j}{q_j} = {a^T}b</math>. Підставляючи ці вирази в (4), отримуємо:  <br>
 
<center><math>{x^T}{D_{j + 1}}x = {\textstyle{{({a^T}a)({b^T}b) - {{({a^T}b)}^2}} \over {{b^T}b}}} + {\textstyle{{{{({x^T}{p_j})}^2}} \over {p_j^T{q_j}}}}</math>(5)</center><br>
 
По нерівності Шварця маємо <math>({a^T}a)({b^T}b) \ge {({a^T}b)^2 </math>. Так, щоб довести, що<math>{x^T}{D_{j + 1}}x \ge 0</math>, досить показати, що <math>p_j^T{q_j} \ge 0,{b^T}b > 0</math>. З (2) і (3) витікає, що <br>
 
<center><math>p_j^T{q_j} = {\lambda _j}d_j^T\left[ {\nabla f({y_{j + 1}}) - \nabla f({y_j})} \right]</math>(6)</center>.<br>
 
По припущенню <math>\nabla f({y_j}) \ne 0</math>, і Dj позитивно визначена, так що<math>\nabla f{({y_j})^T}{D_j}\nabla f({y_j}) > 0</math>
 
Крім того, dj - напрямок спуску, і <math>{\lambda _j} > 0</math>. Тоді із (6) слідує, що <math>p_j^T{q_j} > 0</math>. Крім того <math>{q_j} \ne 0</math> і <math>{b^T}b = q_j^T{D_j}{q_j} > 0</math><br>
 
Видно тепер, що <math>{x^T}{D_{j + 1}}x > 0</math>. Взяти <math>{x^T}{D_{j + 1}}x = 0</math>. Це можливо тільки в тому випадку якщо <math>({a^T}a)({b^T}b) = {({a^T}b)^2},p_j^Tx = 0</math>. Видно, що <math>({a^T}a)({b^T}b) = {({a^T}b)^2}</math> тільки при <math>a = \lambda b,D_j^{1/2}x = \lambda D_j^{1/2}{q_j}</math>. Таким чином <math>x = \lambda {q_i}</math>. Так як <math>x \ne 0</math>то<math>\lambda  \ne 0</math>. Дальше, <math>0 = p_j^Tx = \lambda p_j^T{q_j}</math>заперечує тому, що <math>p_j^T{q_j} > 0,\lambda  \ne 0</math>. <br>
 
Отже, <math>{x^T}{D_{j + 1}}x > 0</math>, матриця <math>{D_{j + 1}}</math> позитивно визначена.<br>
 
Оскільки <math>\nabla f({y_{j + 1}}) \ne 0</math> і Dj+1 позитивно визначена, маємо <math>\nabla f{({y_{j + 1}})^T}{d_{j + 1}} =  - \nabla f{({y_{j + 1}})^T}{D_{j + 1}}\nabla f({y_{j + 1}}) < 0</math>. Звідси по теоремі 1 слідує, що dj+1 - напрямок спуску.<br>
 
'''Лема доведена!!!''' <br>
 
  
 
= Список використаної літератури =
 
= Список використаної літератури =
  
1. Базара М., Шетти К. Нелинейное программирование. Теория и алгоритмы. М., 1982 <br>
+
1. Банди Б.,Методы оптимизации. Вводный курс. М., 1988 <br>
2. Химмельблау Д. Прикладное нелинейное программирование. М., 1975<br>   
+
2. [http://www.optimizaciya-sapr.narod.ru/ Методы оптимизации систем автоматизированого проектирования] <br>   
 
[[Категорія:Планування експерименту]]
 
[[Категорія:Планування експерименту]]

Поточна версія на 18:39, 6 березня 2012

Blue check.png Дана стаття являється неперевіреним навчальним завданням.
Студент: Цубера М. М.
Викладач: Назаревич О. Б.
Термін до: 20 березня 2012

До вказаного терміну стаття не повинна редагуватися іншими учасниками проекту. Після завершення терміну виконання будь-який учасник може вільно редагувати дану статтю і витерти дане попередження, що вводиться за допомогою шаблону.


Прізвище Цубера
Ім'я Марія
По батькові Миколаївна
Факультет ФІС
Група СНм-51
Залікова книжка СНм-11-255

Метод конфігурацій Хука-Дживса

Метод конфігурації Хука-Дживса був розроблений в 1961 році Цей метод полегшує пошук і не вимагає обчислення похідних. Пошук ведеться вздовж ліній розриву похідних у припущенні, що зміщення в просторі проектування, які опинилися вдалими на ранній стадії пошуку, можуть призвести до успіху і на його більш пізніх стадіях. Метод Хука – Дживса перевизначений для пошуку мінімуму унімодальної функції багатьох змінних [math]M=F(x_1, x_2,...,x_N)[/math] при відсутності обмежень.

Стратегія пошуку

Метод являє собою комбінацію досліджуючого пошуку з циклічною зміною змінних і пришвидшую чого пошуку за зразком. Мета досліджуючого пошуку - виявлення локальної поведінки цільової функції і визначення напрямку її спадання. Ця інформація використовується при пошуку за зразком вздовж напрямку спадання цільової функції.

Досліджуючий пошук починається з деякої початкової точки [math]x_0[/math], яку називаютьї старим базисом. В якості множини напрямків пошуку вибирається множина координатних напрямків. Задається величина кроку, яка може бути різною для різних координатних напрямків. Фіксується перший координатний напрямок і робиться крок у сторону збільшення відповідної змінної. Якщо значення вихідної функції [math]f (x)[/math] в пробній точці менше за значення функції у вихідній точці, то крок вважається вдалим. Інакше, з вихідної точки робиться крок в протилежному напрямку з подальшою перевіркою поведінки функції. Якщо і в цьому випадку не відбувається зменшення функції, то відбувається зменшення кроку і процедура повторюється. Досліджуючий пошук по даному напрямку закінчується, коли поточна величина кроку стає менше деякої величини. Після перебору всіх координат досліджуючий пошук завершується, отримана точка називається новим базисом.

Пошук за зразком полягає в русі по напрямку від старого базису до нового. Величина прискорюючого кроку задається прискорюючим множником [math]\lambda[/math]. Успіх пошуку за зразком визначається за допомогою досліджуючого пошуку з отриманої точки. Якщо значення функції в найкращій точці менше, ніж у точці попереднього базису, то пошук за зразком вдалий, в іншому випадку відбувається повернення в новий базис, де триває досліджуючий пошук зі зменшеним кроком. Позначимо через [math]e_1, e_2,..., e_n[/math] - координатні напрямки:


[math]{{e}_{1}}=\left[ \begin{matrix} 1 \\ 0 \\ {} \\ ... \\ 0 \\ \end{matrix} \right][/math], [math]{{e}_{2}}=\left[ \begin{matrix} 0 \\ 1 \\ {} \\ ... \\ 0 \\ \end{matrix} \right][/math], ..., [math]{{e}_{n}}=\left[ \begin{matrix} 0 \\ 0 \\ {} \\ ... \\ 1 \\ \end{matrix} \right][/math]


Зазначимо, що при пошуку за напрямом [math]e_i[/math] змінюється тільки змінна [math]x_i[/math], а інші змінні залишаються зафіксованими.

Алгоритм методу

Крок 1. Задати початкову точку [math]{{x}^{0}}[/math], число [math]\varepsilon[/math] - для зупинки алгоритму, початкові значення приростів по координатним приростам [math]\Delta _{1}^{0},\Delta _{2}^{0},...,\Delta _{n}^{0}\ge \varepsilon[/math], прискорюючий множник [math]\lambda \succ 0,i=1,k=0[/math].


Крок 2. Провести досліджуючий пошукпо вибраному координатному напрямку:

[math]x_{i}^{k+1}=\left\{ \begin{align} & x_{i}^{k}+\Delta _{i}^{k},\text{ }f\left( x_{1}^{k},...,x_{i}^{k}+\Delta _{i}^{k},...,x_{n}^{k} \right)\lt f(x_{1}^{k},...,x_{i}^{k},...,x_{n}^{k}) \\ & x_{i}^{k}-\Delta _{i}^{k},\text{ }f\left( x_{1}^{k},...,x_{i}^{k}-\Delta _{i}^{k},...,x_{n}^{k} \right)\lt \min f\left( x_{1}^{k},...,x_{i}^{k},...,x_{n}^{k} \right),\left( x_{1}^{k},...,x_{i}^{k}-\Delta _{i}^{k},...,x_{n}^{k} \right) \\ & x_{i}^{k},\text{ } \\ \end{align} \right.[/math]

Крок 3. Перевірити умови:

а) Якщо [math]i\lt n[/math], то поставити [math]i=i+1[/math] і перейти до кроку 2. (продовжити досліджуючий пошук по напрямкам, які залишилися)

б) Якщо [math]i=n[/math], перевірити успішність досліджуючого пошуку: - якщо [math]f({{X}^{k+1}})\lt f({{X}^{k}})[/math], перейти до кроку 4; - якщо [math]f({{X}^{k+1}})\ge f({{X}^{k}})[/math], перейти до кроку 5.


Крок 4. Провести пошук за зразком:

[math]{{X}^{zr}}={{X}^{k+1}}+\lambda ({{X}^{k+1}}-{{X}^{k}})[/math]

В точці [math]{{X}^{zr}}[/math] провести досліджуючий пошук, в результаті якого отримується точка [math]{{X}^{dp}}[/math]. Якщо [math]{{X}^{dp}}\ne {{X}^{zr}}[/math], то точка [math]{{X}^{k+1}}={{X}^{dp}}[/math] стає точкою нового базису, а [math]{{X}^{k}}[/math] - точкою старого базису. Перейти до кроку 5. Якщо [math]{{X}^{dp}}={{X}^{zr}}[/math], то пошук за зрозком вважається неуспішним, точки [math]{{X}^{dp}},{{X}^{zr}}[/math] анулюються, точка [math]{{X}^{k+1}}[/math] залишається точкою нового базису, а [math]{{X}^{k}}[/math] - точкою старого базису. Перейти до кроку 2.


Крок 5. Перевірити умову завершення обрахунку: а) Якщо всі [math]{{\Delta }_{i}}\lt \varepsilon[/math] то пошук закінчити [math]{{X}^{*}}={{X}^{k}}[/math].

б) Для тих і, для яких [math]{{\Delta }_{i}}\gt \varepsilon[/math], зменшити величину кроку іперейти до кроку 2.

Приклад

Знайти мінімум функції [math]f(x)=4{{({{x}_{1}}-5)}^{2}}+{{({{x}_{1}}-6)}^{2}}[/math]


Розвязок

Крок 1. Задамо початкову точку [math]{{X}^{0}}=(x_{_{1}}^{0},x_{2}^{0})=(8,9)[/math]; числа [math]\varepsilon =0.3;{{\Delta }_{1}}=1;{{\Delta }_{2}}=2;\lambda =1.[/math] Поставимо [math]i=1,k=0.[/math]


Крок [math]{{2}^{0}}[/math]. [math]f(x_{1}^{0},x_{2}^{0})=45.[/math]

[math]f(x_{1}^{0}+{{\Delta }_{1}},x_{2}^{0})=f(9,9)=73[/math]. Оскільки [math]f(x_{1}^{0}+{{\Delta }_{1}},x_{2}^{0})\gt f(x_{1}^{0},x_{2}^{0})[/math], то крок неуспішний.

[math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})=f(7,9)=25[/math]. Оскільки [math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})\lt f(x_{1}^{0},x_{2}^{0})[/math], то крок успішний.


Крок [math]{{3}^{0}}[/math]. Оскільки [math]i=1\lt 2=n[/math], то поставимо [math]i=2[/math] і перейдемо до кроку 2.


Крок [math]{{2}^{1}}[/math].

[math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}+{{\Delta }_{2}})=f(7,11)=41[/math] Оскільки [math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}+{{\Delta }_{2}})\gt f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})=25[/math], то крок неуспішний.

[math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})=f(7,7)=17[/math]. Оскільки [math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})\lt f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0})[/math], то крок успішний.


Крок [math]{{3}^{1}}[/math]. Оскільки [math]i=2=n[/math] і [math]f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})=f(7,7)=17\lt f(x_{1}^{0},x_{2}^{0})=45[/math], то перейдемо до кроку 4.


Крок [math]{{4}^{0}}[/math]. Проведемо пошук за зразком з точки [math]{{X}^{dp}}(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{2}})=(7,7)[/math]. Поставимо [math]i=1,k=k+1=1[/math].

[math]{{X}^{zr}}={{X}^{dp}}+1({{X}^{dp}}-{{X}^{0}})={{(7,7)}^{T}}-\left[ {{(7,7)}^{T}}-{{(8,9)}^{T}} \right]={{(6,5)}^{T}}[/math]. Перейдемо до кроку 2.


Крок [math]{{2}^{2}}[/math]. Виконаємо досліджуючий пошук з точки [math]{{X}^{zr}}[/math]. [math]f({{X}^{zr}})=f(6.5)=5[/math].

Оскільки [math]f(x_{1}^{zr}+{{\Delta }_{1}},x_{2}^{zr0})=(7,5)=17\gt f(X_{{}}^{zr})[/math], то крок неуспішний.

Оскільки [math]f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=(5,5)=1\lt f(X_{{}}^{zr})[/math], то крок успішний.


Крок [math]{{3}^{2}}[/math]. Оскільки [math]i=1\lt 2=n[/math], то поставимо [math]i=i+1=2[/math] і перейдемо до кроку 2.


Крок [math]{{2}^{3}}[/math]. Оскільки [math]f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr}+{{\Delta }_{2}})=f(5,7)=1=f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=f(5,5)=1[/math], то крок неуспішний.

Оскільки [math]f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr}-{{\Delta }_{2}})=f(5,3)=9\gt f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=f(5,5)=1[/math], то крок неуспішний.


Крок [math]{{3}^{2}}[/math]. Оскільки [math]i=2=n[/math] і [math]f(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=f(5,5)=1\lt f({{X}^{dp}})=f(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{1}})=f(7,7)=17[/math], то пошук за зразком на кроці 40 пройшов успішно.

Точка [math]{{X}^{2}}=(x_{1}^{zr}-{{\Delta }_{1}},x_{2}^{zr})=(5,5)[/math] стає новим базисом, а точка [math]{{X}^{1}}=(x_{1}^{0}-{{\Delta }_{1}},x_{2}^{0}-{{\Delta }_{1}})=(7,7)[/math] стає старим базисом. Виконаємо пошук за зразком з нового базису. Перейдем до кроку 4.


Крок [math]{{4}^{1}}[/math]. Поставимо [math]i=1,k=k+1=2[/math], [math]{{X}^{zr}}={{X}^{2}}+({{X}^{2}}-{{X}^{1}})={{(5,5)}^{T}}-\left[ {{(5,5)}^{T}}-{{(7,7)}^{T}} \right]={{(3,3)}^{T}}[/math] і перейдемо до кроку 2.


Крок [math]{{2}^{4}}[/math]. [math]f(3,3)=25[/math]. Оскільки [math]f(3-{{\Delta }_{1}},3)=f(4,3)=13\lt f(3,3)=25[/math], то крок успішний.


Крок [math]{{3}^{4}}[/math]. Так як [math]i=1\lt n=2[/math], то поставимо [math]i=i+1=2.[/math] і перейдемо до кроку 2.


Крок [math]{{2}^{5}}[/math]. Оскільки [math]f(4,3+{{\Delta }_{2}})=f(4,5)=5\lt f(4,3)=13[/math], то крок успішний.


Крок [math]{{3}^{5}}[/math]'. Так як [math]i=2=n[/math] і [math]f(4,5)=5\gt f(5,5)=1[/math], то пошук за зразком на кроці [math]{{4}^{1}}[/math] пройшов неуспішно. Переходимо до кроку 5.


Крок [math]{{5}^{0}}[/math]'. Оскільки [math]{{\Delta }_{1}}=1\gt \varepsilon =0.3,{{\Delta }_{2}}=1\gt \varepsilon =0.3[/math], то необхідно зменшити крок. Поставимо [math]{{\Delta }_{1}}=0.5,{{\Delta }_{2}}=1,k=k+1=3[/math], за базис візьмем точку [math](5,5)[/math] і повторимо цикл розрахунків з новим базисом і новими значеннями кроків.

Мінімум досягається в точці [math]{{X}^{*}}=(5,6)[/math].

Список використаної літератури

1. Банди Б.,Методы оптимизации. Вводный курс. М., 1988
2. Методы оптимизации систем автоматизированого проектирования