Dynamic programming — برنامه‌نویسی پویا

From Systems analysis Wiki
Jump to navigation Jump to search

برنامه‌نویسی پویا (DP؛ انگلیسی: dynamic programming, DP) روشی برای حل مسائل پیچیده بهینه‌سازی است که بر پایه تجزیه مسئله اصلی به دنباله‌ای از زیرمسائل ساده‌تر استوار است[1][2]. این روش برای فرآیندهای چندمرحله‌ای تصمیم‌گیری به کار می‌رود، جایی که راه‌حل بهینه کل مسئله از راه‌حل‌های بهینه زیرمسائل آن ساخته می‌شود.

این اصطلاح توسط ریاضیدان آمریکایی ریچارد بلمن در دهه ۱۹۵۰ معرفی شد[3]. در این زمینه، واژه «programming» به معنای «برنامه‌ریزی» یا «تدوین طرح بهینه اقدام» به کار می‌رود و نه نوشتن کد رایانه‌ای[4].

ویژگی‌ها و قضایای کلیدی

قابلیت اعمال برنامه‌نویسی پویا بر یک مسئله با وجود دو ویژگی بنیادی در آن تعیین می‌شود.

اصل بهینگی بلمن

مفهوم محوری این روش اصل بهینگی بلمن (انگلیسی: Bellman's principle of optimality) است. این اصل بیان می‌کند: صرف‌نظر از حالت اولیه و تصمیم اولیه، تصمیم‌های بعدی باید استراتژی بهینه‌ای را نسبت به حالتی که در نتیجه تصمیم اول حاصل شده، تشکیل دهند[3].

به بیان دیگر، هر بخشی از مسیر بهینه، خود به تنهایی بهینه است. این ویژگی امکان تجزیه مسئله کلی به دنباله‌ای از زیرمسائل ساده‌تر و حل بازگشتی آن‌ها را فراهم می‌کند.

Overlapping Subproblems - زیرمسائل همپوشان

یک مسئله دارای ویژگی زیرمسائل همپوشان (انگلیسی: overlapping subproblems) است، اگر در حل بازگشتی آن، زیرمسائل یکسان بارها و بارها پدیدار شوند. DP با ذخیره راه‌حل زیرمسائلی که پیش از این حل شده‌اند (این فن مموایزیشن یا جدول‌بندی نامیده می‌شود) از محاسبات تکراری اجتناب می‌کند و بدین ترتیب کارایی را در مقایسه با جستجوی بازگشتی ساده به طور چشمگیری افزایش می‌دهد.

معادله بلمن

از اصل بهینگی، رابطه بازگشتی اساسی این روش یعنی معادله بلمن استخراج می‌شود[1]. این معادله «ارزش» (بهترین سود یا هزینه) حالت جاری را به ارزش‌های حالت‌های بعدی مرتبط می‌سازد. به طور کلی برای یک فرآیند چندمرحله‌ای قطعی با تابع هدف افزایشی، این معادله به شکل زیر است:

Vk1(x)=maxyU(x){φk(x,y)+Vk(fk(x,y))}

که در آن:

  • k — شماره گام (از m تا ۱)؛
  • x — حالت سیستم در گام k1؛
  • y — تصمیم کنترلی که در گام k اتخاذ می‌شود؛
  • φk(x,y) — سود (یا هزینه) در گام k-ام؛
  • fk(x,y) — تابعی که حالت جدید سیستم را تعیین می‌کند؛
  • Vk(s) — مقدار بهینه تابع هدف برای زیرمسئله‌ای که از گام k در حالت s آغاز می‌شود.

معادله به صورت متوالی، معمولاً «از انتها» و با حرکت از گام آخر به گام اول، حل می‌شود.

نمونه‌های کاربرد

  • مسئله کوتاه‌ترین مسیر در گراف: این مسئله دارای ویژگی زیرساختار بهینه است، زیرا هر بخشی از کوتاه‌ترین مسیر خود کوتاه‌ترین است. الگوریتم‌های Bellman-Ford و Floyd-Warshall نمونه‌های کلاسیک کاربرد DP برای حل این مسئله هستند[5].
  • مسئله کوله‌پشتی: مسئله پر کردن بهینه کوله‌پشتی با ظرفیت محدود با اشیایی که ارزش و وزن متفاوت دارند. DP با بررسی متوالی اشیا و محاسبه حداکثر ارزش برای تمام مقادیر ممکن ظرفیت باقی‌مانده در هر گام، این مسئله را حل می‌کند.
  • مسئله تخصیص منابع: توزیع منابع محدود (مثلاً سرمایه‌گذاری) میان چندین پروژه به منظور بیشینه کردن اثر کلی.

محدودیت‌ها

محدودیت اصلی این روش لعنت ابعاد (انگلیسی: curse of dimensionality) است — اصطلاحی که بلمن برای نامیدن رشد نمایی تعداد حالت‌ها و در نتیجه پیچیدگی محاسباتی با افزایش تعداد متغیرهای توصیف‌کننده حالت سیستم معرفی کرد[6][7]. این امر کاربرد عملی DP دقیق را برای مسائل با ابعاد بسیار بزرگ محدود می‌سازد.

مفاهیم مرتبط

  • تحقیق در عملیات
  • نظریه کنترل بهینه
  • فرآیند تصمیم‌گیری مارکوف (تعمیم تصادفی)
  • معادله Hamilton–Jacobi–Bellman (معادل برای زمان پیوسته)

یادداشت‌ها

[1] [2] [3] [4] [5] [6] [7] </references>

  1. 1.0 1.1 1.2 "Динамическое программирование". Большая российская энциклопедия. [۱]
  2. 2.0 2.1 "Динамическое программирование". Википедия. [۲]
  3. 3.0 3.1 3.2 Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). Динамическое программирование. Примеры применения. Учебное пособие, ННГУ им. Лобачевского (ВМиК). [۳]
  4. 4.0 4.1 "Dynamic programming". Wikipedia. [۴]
  5. 5.0 5.1 Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [۵]
  6. 6.0 6.1 "Проклятие размерности". Википедия. [۶]
  7. 7.0 7.1 Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [۷]