**برنامه‌نویسی پویای دیفرانسیلی** (DDP)، یک الگوریتم کنترلی بهینه از رده بهینه سازی مسیر است. این الگوریتم در سال (۱۹۹۶) توسط ماینی Mayne معرفی شد و بعدها در کتاب جاکوبسون (Jacobson )و ماینی مورد تحلیل قرارگرفت. این الگوریتم از مدل‌های با مرتبه دوی توابع هزینه و حرکت بهره می برد و همگرایی از نوع درجه دومquadratic convergence را به نمایش می گذارد. این رویکرد خیلی نزدیک به روش نیوتون(Newton) قدم به قدم که متعلق به پانتوجا(Pantoja) هست می‌باشد .

مسائل زمان گسسته با کران محدود
------------------------------

مکانیک حرکت:


|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle \mathbf {x} \_{i+1}=\mathbf {f} (\mathbf {x} \_{i},\mathbf {u} \_{i})} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(1)** |

این فرمول تغییرات {\displaystyle \textstyle \mathbf {x} }را به صورت تابعی از متغیرکنترلی {\displaystyle \mathbf {u} }از زمان iتا {\displaystyle i+1} نشان می‌دهد. *هزینه کل* {\displaystyle J\_{0}} یعنی مجموع هزینه‌های اجرا {\displaystyle \textstyle \ell }و هزینه نهایی {\displaystyle \ell \_{f}}است که وقتی محقق می‌شود که با شروع از وضعیت {\mathbf {x}}و اعمال دنباله کنترلی {\displaystyle \mathbf {U} \equiv \{\mathbf {u} \_{0},\mathbf {u} \_{1}\dots ,\mathbf {u} \_{N-1}\}} به کران مورد نظر برسیم:

{\displaystyle J\_{0}(\mathbf {x} ,\mathbf {U} )=\sum \_{i=0}^{N-1}\ell (\mathbf {x} \_{i},\mathbf {u} \_{i})+\ell \_{f}(\mathbf {x} \_{N}),}
در اینجا {\displaystyle \mathbf {x} \_{0}\equiv \mathbf {x} }است و{\displaystyle \mathbf {x} \_{i}} برای {\displaystyle i>0} از معادله **Eq. 1** بدست می آید. راه حل مسئله کنترل بهینه، مینیمم کردن دنباله کنترلی {\displaystyle \mathbf {U} ^{\*}(\mathbf {x} )\equiv \operatorname {argmin} \_{\mathbf {U} }J\_{0}(\mathbf {x} ,\mathbf {U} ).} است. *بهینه سازی مسیر* یعنی پیدا کردن{\displaystyle \mathbf {U} ^{\*}(\mathbf {x} )}برای یک {\mathbf {x}}خاص به جای تمامی وضعیت‌های اولیهٔ ممکن.

برنامه نویسی پویا
-----------------

فرض کنید که{\displaystyle \mathbf {U} \_{i}}یک دنباله کنترل جزئی{\displaystyle \mathbf {U} \_{i}\equiv \{\mathbf {u} \_{i},\mathbf {u} \_{i+1}\dots ,\mathbf {u} \_{N-1}\}} باشد : و *هزینه رفتن* به {\displaystyle J\_{i}}به صورت مجموع جزئی هزینه هاازi به Nتعریف شود:

{\displaystyle J\_{i}(\mathbf {x} ,\mathbf {U} \_{i})=\sum \_{j=i}^{N-1}\ell (\mathbf {x} \_{j},\mathbf {u} \_{j})+\ell \_{f}(\mathbf {x} \_{N}).}
هزینه بهینهٔ رفتن یا *تابع ارزش* در زمان i، هزینه رفتنی است که دنباله کنترلی مینیمم را می‌دهد:

{\displaystyle V(\mathbf {x} ,i)\equiv \min \_{\mathbf {U} \_{i}}J\_{i}(\mathbf {x} ,\mathbf {U} \_{i}).} با قراردادن {\displaystyle V(\mathbf {x} ,N)\equiv \ell \_{f}(\mathbf {x} \_{N})}، اصل برنامه نویسی پویاdynamic programming principle، مینیمم سازی را به جای انجام آن در کل دنباله کنترل¬ها به دنباله¬ای از مینیمم سازی ها روی تنها یک کنترل محدود می کند، که روند پیشرفت آن نسبت به زمان، روبه عقب است:

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle V(\mathbf {x} ,i)=\min \_{\mathbf {u} }[\ell (\mathbf {x} ,\mathbf {u} )+V(\mathbf {f} (\mathbf {x} ,\mathbf {u} ),i+1)].} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(2)** |

این معادله بلمن(Bellman) معادله بلمناست.

برنامه نویسی پویای دیفرانسیلی
-----------------------------

DDP، از طریق انجام تکراری یک پاس روبه عقب روی مسیری جزئی انجام می‌شود تا دنباله کنترلی جدید تولید کند و سپس یک پاس رو به جلو برای محاسبه و ارزیابی یک مسیر جزئی جدید انجام می‌شود. ما با پاس رو به عقب شروع می کنیم. اگر

{\displaystyle \ell (\mathbf {x} ,\mathbf {u} )+V(\mathbf {f} (\mathbf {x} ,\mathbf {u} ),i+1)}
آرگومانی از عملگر {\displaystyle \min[]} در معادله **Eq. 2**باشد، Qرا تغییرات این کمیت درمحدوده iامین جفت {\displaystyle (\mathbf {x} ,\mathbf {u} )} در نظر می گیریم:

{\displaystyle {\begin{aligned}Q(\delta \mathbf {x} ,\delta \mathbf {u} )\equiv &\ell (\mathbf {x} +\delta \mathbf {x} ,\mathbf {u} +\delta \mathbf {u} )&&{}+V(\mathbf {f} (\mathbf {x} +\delta \mathbf {x} ,\mathbf {u} +\delta \mathbf {u} ),i+1)\\-&\ell (\mathbf {x} ,\mathbf {u} )&&{}-V(\mathbf {f} (\mathbf {x} ,\mathbf {u} ),i+1)\end{aligned}}}
و آن را به مرتبه 2 بسط می دهیم.


|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle \approx {\frac {1}{2}}{\begin{bmatrix}1\\\delta \mathbf {x} \\\delta \mathbf {u} \end{bmatrix}}^{\mathsf {T}}{\begin{bmatrix}0&Q\_{\mathbf {x} }^{\mathsf {T}}&Q\_{\mathbf {u} }^{\mathsf {T}}\\Q\_{\mathbf {x} }&Q\_{\mathbf {x} \mathbf {x} }&Q\_{\mathbf {x} \mathbf {u} }\\Q\_{\mathbf {u} }&Q\_{\mathbf {u} \mathbf {x} }&Q\_{\mathbf {u} \mathbf {u} }\end{bmatrix}}{\begin{bmatrix}1\\\delta \mathbf {x} \\\delta \mathbf {u} \end{bmatrix}}} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(3)** |

زیرنویس Q در اینجا نوع دیگر از زیرنویسی موریموتو(Morimoto) است که زیرنویس‌ها تفاوت در چیدمان مشتق را نشان می دهند.
 با رها کردن اندیس i جهت خوانایی، علامت پرایم گام زمانی بعدی را نشان می‌دهد {\displaystyle V'\equiv V(i+1)} ، ضرایب بسط داده شده به صورت زیر هستند:

{\displaystyle {\begin{alignedat}{2}Q\_{\mathbf {x} }&=\ell \_{\mathbf {x} }+\mathbf {f} \_{\mathbf {x} }^{\mathsf {T}}V'\_{\mathbf {x} }\\Q\_{\mathbf {u} }&=\ell \_{\mathbf {u} }+\mathbf {f} \_{\mathbf {u} }^{\mathsf {T}}V'\_{\mathbf {x} }\\Q\_{\mathbf {x} \mathbf {x} }&=\ell \_{\mathbf {x} \mathbf {x} }+\mathbf {f} \_{\mathbf {x} }^{\mathsf {T}}V'\_{\mathbf {x} \mathbf {x} }\mathbf {f} \_{\mathbf {x} }+V\_{\mathbf {x} }'\cdot \mathbf {f} \_{\mathbf {x} \mathbf {x} }\\Q\_{\mathbf {u} \mathbf {u} }&=\ell \_{\mathbf {u} \mathbf {u} }+\mathbf {f} \_{\mathbf {u} }^{\mathsf {T}}V'\_{\mathbf {x} \mathbf {x} }\mathbf {f} \_{\mathbf {u} }+{V'\_{\mathbf {x} }}\cdot \mathbf {f} \_{\mathbf {u} \mathbf {u} }\\Q\_{\mathbf {u} \mathbf {x} }&=\ell \_{\mathbf {u} \mathbf {x} }+\mathbf {f} \_{\mathbf {u} }^{\mathsf {T}}V'\_{\mathbf {x} \mathbf {x} }\mathbf {f} \_{\mathbf {x} }+{V'\_{\mathbf {x} }}\cdot \mathbf {f} \_{\mathbf {u} \mathbf {x} }.\end{alignedat}}}
جملات آخر در سه معادله آخر ادغانم یک بردار را با یک تانسور نشان می دهند. با کمینه کردن تخمین درجه دوم **(3)** برحسب {\displaystyle \delta \mathbf {u} }داریم:


|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle {\delta \mathbf {u} }^{\*}=\operatorname {argmin} \limits \_{\delta \mathbf {u} }Q(\delta \mathbf {x} ,\delta \mathbf {u} )=-Q\_{\mathbf {u} \mathbf {u} }^{-1}(Q\_{\mathbf {u} }+Q\_{\mathbf {u} \mathbf {x} }\delta \mathbf {x} ),} | 

|  |  |  |
| --- | --- | --- |
|   |   |   |
|   |

 | **(4)** |

با دادن جمله حلقه باز {\displaystyle \mathbf {k} =-Q\_{\mathbf {u} \mathbf {u} }^{-1}Q\_{\mathbf {u} }} و جمله بازخورد {\displaystyle \mathbf {K} =-Q\_{\mathbf {u} \mathbf {u} }^{-1}Q\_{\mathbf {u} \mathbf {x} }} و قرار دادن نتیجه در **(3)** اکنون ما مدل درجه دوم ارزش در زمان i را داریم:

{\displaystyle {\begin{alignedat}{2}\Delta V(i)&=&{}-{\tfrac {1}{2}}Q\_{\mathbf {u} }Q\_{\mathbf {u} \mathbf {u} }^{-1}Q\_{\mathbf {u} }\\V\_{\mathbf {x} }(i)&=Q\_{\mathbf {x} }&{}-Q\_{\mathbf {u} }Q\_{\mathbf {u} \mathbf {u} }^{-1}Q\_{\mathbf {u} \mathbf {x} }\\V\_{\mathbf {x} \mathbf {x} }(i)&=Q\_{\mathbf {x} \mathbf {x} }&{}-Q\_{\mathbf {x} \mathbf {u} }Q\_{\mathbf {u} \mathbf {u} }^{-1}Q\_{\mathbf {u} \mathbf {x} }.\end{alignedat}}}
با محاسبه بازگشتی مدل‌های درجه دوم محلی از {\displaystyle V(i)}و اصلاحات کنترلی {\displaystyle \{\mathbf {k} (i),\mathbf {K} (i)\}} ، از {\displaystyle i=N-1}تا {\displaystyle i=1} گذر رو به عقب را تشکیل می‌شود. همانند بالا، ارزش با {\displaystyle V(\mathbf {x} ,N)\equiv \ell \_{f}(\mathbf {x} \_{N})} مقداردهی اولیه می‌شود. هر وقت گذر روبه عقب کامل شد، گذر روبه جلو یک مسیر جدیدی را محاسبه می نماید:

{\displaystyle {\begin{aligned}{\hat {\mathbf {x} }}(1)&=\mathbf {x} (1)\\{\hat {\mathbf {u} }}(i)&=\mathbf {u} (i)+\mathbf {k} (i)+\mathbf {K} (i)({\hat {\mathbf {x} }}(i)-\mathbf {x} (i))\\{\hat {\mathbf {x} }}(i+1)&=\mathbf {f} ({\hat {\mathbf {x} }}(i),{\hat {\mathbf {u} }}(i))\end{aligned}}}
پاس‌های روبه عقب و جلو آنقدر تکرار می‌شوند تا در نهایت همگرا شوند.

قاعده سازی و جستجوی خطی
-----------------------

برنامه‌نویسی پویای دیفرانسیلی الگویتم مرتبه دویی شبیه به روش نیوتون است. بنابراین این روش از گام‌های بزرگی در راستای مینیم کردن بهره می برد و اغلب نیاز به قاعده سازیregularization و/یا جستجوی خطی line-search برای رسیدن همگرایی دارد.

. قاعده سازی در زمینه DDP، یعنی اطمینان پیدا کردن از اینکه ماتریس {\displaystyle Q\_{\mathbf {u} \mathbf {u} }}در معادله **Eq. 4** همیشه مثبت positive definite است. جستجوی خطی در DDP یعنی تغییر مقیاس دادن کنترل حلقه باز {\displaystyle \mathbf {k} }از طریق ضریب آلفا که به نحوی که {\displaystyle 0<\alpha <1} برقرار باشد.

جستارهای وابسته
---------------

* کنترل بهینهکنترل بهینه

منابع
-----

1. ↑  Mayne, D. Q. (1966). "A second-order gradient method of optimizing non-linear discrete time systems". *Int J Control*. **3**: 85–95. doi:10.1080/00207176608921369.
2. ↑  Mayne, David H. and Jacobson, David Q. (1970). *Differential dynamic programming*. New York: American Elsevier Pub. Co. ISBN 0-444-00070-4.
3. ↑  de O. Pantoja, J. F. A. (1988). "Differential dynamic programming and Newton's method". *International Journal of Control*. **47** (5): 1539–1553. doi:10.1080/00207178808906114. ISSN 0020-7179.
4. ↑  Liao, L. Z.; C. A Shoemaker (1992). "Advantages of differential dynamic programming over Newton's method for discrete-time optimal control problems". Cornell University, Ithaca, NY.
5. ↑  Morimoto, J.; G. Zeglin; C.G. Atkeson (2003). "Minimax differential dynamic programming: Application to a biped walking robot". *Intelligent Robots and Systems, 2003.(IROS 2003). Proceedings. 2003 IEEE/RSJ International Conference on*. Vol. 2. pp. 1927–1932.
6. ↑  
Liao, L. Z; C. A Shoemaker (1991). "Convergence in unconstrained discrete-time differential dynamic programming". *IEEE Transactions on Automatic Control*. **36** (6): 692. doi:10.1109/9.86943.
7. ↑  Tassa, Y. (2011). *Theory and implementation of bio-mimetic motor controllers* (PDF) (Thesis). Hebrew University. Archived from the original (PDF) on 4 March 2016. Retrieved 18 June 2015.

پیوندهای خارجی
--------------

* A Python implementation of DDP
* A MATLAB implementation of DDP