انتقل إلى المحتوى

برمجة ديناميكية: الفرق بين النسختين

من ويكيبيديا، الموسوعة الحرة
[نسخة منشورة][نسخة منشورة]
تم حذف المحتوى تمت إضافة المحتوى
الرجوع عن تعديلين معلقين من Alisaad313 و JarBot إلى نسخة 53003936 من JarBot.
طلا ملخص تعديل
وسم: تعديل مصدر 2017
 
(44 مراجعة متوسطة بواسطة 31 مستخدماً غير معروضة)
سطر 1: سطر 1:
{{تدقيق لغوي}}
{{تدقيق لغوي}}


في [[الرياضيات]] و[[علم الحاسوب]]، '''البرمجة الديناميكية''' {{إنج|Dynamic programming}} هي طريقة لحل مسائل معقدة و صعبة الحل عن طريق تقسيمها لمسائل فرعية أبسط و سهلة الحل .<ref>{{استشهاد ويب| مسار = https://thes.bncf.firenze.sbn.it/termine.php?id=22135 | عنوان = معلومات عن برمجة ديناميكية على موقع thes.bncf.firenze.sbn.it | ناشر = thes.bncf.firenze.sbn.it| مسار أرشيف = https://web.archive.org/web/20190830122532/https://thes.bncf.firenze.sbn.it/termine.php?id=22135 | تاريخ أرشيف = 30 أغسطس 2019 }}</ref><ref>{{استشهاد ويب| مسار = https://psh.techlib.cz/skos/PSH11423 | عنوان = معلومات عن برمجة ديناميكية على موقع psh.techlib.cz | ناشر = psh.techlib.cz| مسار أرشيف = https://web.archive.org/web/20190830122523/https://psh.techlib.cz/skos/PSH11423 | تاريخ أرشيف = 30 أغسطس 2019 }}</ref><ref>{{استشهاد ويب| مسار = https://www.jstor.org/topic/dynamic-programming | عنوان = معلومات عن برمجة ديناميكية على موقع jstor.org | ناشر = jstor.org| مسار أرشيف = https://web.archive.org/web/20190525201637/https://www.jstor.org/topic/dynamic-programming/ | تاريخ أرشيف = 25 مايو 2019 }}</ref>
'''البرمجة الديناميكية''' {{إنج|Dynamic programming}} , في [[رياضيات|الرياضيات]] [[علم الحاسوب|وعلم الحاسوب]]: هي طريقة لحل المسائل المعقّدة الصعبة عن طريق تقسيمها لمسائل فرعية أبسط وأسهل حلاً.<ref>{{استشهاد ويب| مسار = https://thes.bncf.firenze.sbn.it/termine.php?id=22135 | عنوان = معلومات عن برمجة ديناميكية على موقع thes.bncf.firenze.sbn.it | ناشر = thes.bncf.firenze.sbn.it| مسار أرشيف = https://web.archive.org/web/20190830122532/https://thes.bncf.firenze.sbn.it/termine.php?id=22135 | تاريخ أرشيف = 30 أغسطس 2019 }}</ref><ref>{{استشهاد ويب| مسار = https://psh.techlib.cz/skos/PSH11423 | عنوان = معلومات عن برمجة ديناميكية على موقع psh.techlib.cz | ناشر = psh.techlib.cz| مسار أرشيف = https://web.archive.org/web/20190830122523/https://psh.techlib.cz/skos/PSH11423 | تاريخ أرشيف = 30 أغسطس 2019 }}</ref><ref>{{استشهاد ويب| مسار = https://www.jstor.org/topic/dynamic-programming | عنوان = معلومات عن برمجة ديناميكية على موقع jstor.org | ناشر = jstor.org| مسار أرشيف = https://web.archive.org/web/20190525201637/https://www.jstor.org/topic/dynamic-programming/ | تاريخ أرشيف = 25 مايو 2019 }}</ref>


الفكرة وراء البرمجة الديناميكية بسيطة. بشكل عام، لحل مسألة ما، نحن بحاجة إلى حل أجزاء مختلفة من المسألة ( مسائل فرعية ) ، ومن ثم جمع حلول المسائل الفرعية للحصول على حل شامل. في كثير من الأحيان، كثير من هذه المسائل الفرعية هي في الواقع متشابهة. نهج البرمجة الديناميكية هو البحث عن حل كل مسألة فرعية مرة واحدة فقط، وبالتالي تقليل عدد الحسابات: حالما تم حساب حل مسألة فرعية ما، يتم حفظه، وفي المرة القادمة عند الحاجة للحل نفسه، يتم ببساطة استرجاعه. هذا النهج مفيد خصوصا عندما يكون عدد المسائل الفرعية المتكررة [[نمو أسي|ينمو بشكل أسي]] كعلاقة بحجم المدخل.
عادة ماتكون الفكرة وراء البرمجة الديناميكية بسيطة لحل مسألة ما، فنحتاج إلى حل أجزاء مختلفة من المشكلة (مسائل فرعية)، ومن ثم جمع حلول المسائل الفرعية للحصول على الحل الشامل، في كثير من الأحيان، العديد من تلك المسائل الفرعيّة متشابهة في الواقع، نهج البرمجة الديناميكية يتم من خلال البحث عن حل كل مسألة فرعيّة مرة واحدة فقط، مما يقلل من عدد العمليات الحسابية وبمجرد حساب حل مسألة فرعيّة معينة، يتم حفظ الحل، ويكون الحل نفسه في المرة القادمة، نفس عدد المسائل الفرعية المتكررة، وهذا الأسلوب مفيد بشكل خاص عندما ينمو حجم المدخلات بشكل كبير ([[نمو أسي]]).


عندما تطبق هذه الطريقة فإنها تستغرق وقت أقل مما تستغرقه الطرق الأخرى التي ليس لها ميزة حل المسائل الثانوية المتداخلة( مثل بحث العمق أولا).
عند استخدام هذه الطريقة، يتم توفير الوقت بشكل كبير مقارنة بالطرق الأخرى التي لا تتمتع بقدرة حل المسائل الثانوية المتداخلة مثل: (بحث العمق أولاً).


لحل مسألة ما، و باستخدام البرمجة الديناميكية نحتاج لحل أجزاء مختلفة من المسألة (مسائل ثانوية) بعدها يتم دمج بينهم للحصول على الحل للمسألة بشكل عام.
لحل مسألة ما، وباستخدام البرمجة الديناميكية نحتاج لحل أجزاء مختلفة من المسألة (مسائل ثانويّة) بعدها يتم الدمج بينهم للحصول على الحل للمسألة بشكل عام، في الكثير من الأحيان عند استخدام طريقة [[خوارزمية جشعة]] فإنه يكون هناك العديد من المسائل الثانويّة التي تحل بشكل متكرر ولكن البرمجة الديناميكية تهدف إلى حل كل مسألة ثانويّة لمرة واحدة فقط مما يؤدي إلى تقليل عدد الحسابات، فإنه بمجرد حل مسألة ثانوية فإنه يتم تخزينها في «مذكرة أوتوماتيكية» لذا في المرة القادمة عندما نحتاج لنفس الحل فإنه ببساطة يتم البحث عنه و هذا النهج مفيد خاصةً عندما يكون عدد المسائل المتكررة يزداد بشكل مفرط كدالة في حجم المدخلات.
في كثير من الأحيان عند استخدام طريقة أكثر سذاجة فإنه يكون هناك العديد من المسائل الثانوية التي تحل بشكل متكرر في البرمجة الديناميكية تهدف إلي حل كل مسالة ثانوية لمرة واحدة فقط مما يؤدي إلى تقليل عدد الحسابات. فإنه بمجرد حل مسالة ثانوية فإنه يتم تخزينها "، أوتوماتيكية مذكرة" لذا في المرة القادمة عندما نحتاج لنفس الحل فإنه ببساطة يتم البحث عنه. هذا النهج مفيد خاصة عندما يكون عدد المسائل المتكررة يزداد بشكل مطرد كدالة في حجم المدخلات.


تستخدم خوارزميات البرمجة الديناميكية لتعظيم الاستفادة ( مثلا للحصول علي أقصر طريق بين نقطتين أو أسرع طريقة لضرب مصفوفات). خوارزميات البرمجة الديناميكية ستدرس الحلول السابقة للمسائل الثانويه وتقوم بدمجها للحصول على أفضل حل للمسألة المراد حلها.
تستخدم خوارزميّات البرمجة الديناميكية لتعظيم الاستفادة (مثلاً للحصول على أقصر طريق بين نقطتين أو أسرع طريقة لضرب مصفوفات)، خوارزميات البرمجة الديناميكية ستدرس الحلول السابقة للمسائل الثانويّة وتقوم بدمجها للحصول على أفضل حل للمسألة المراد حلها.


يوجد هناك بدائل كثيرة لهذه الطريقة مثل [[خوارزمية جشعة]] والتي بها يتم الحصول على الخيار الأمثل الموضعي في كل فرع في الطريق. الخيار الأمثل الموضعي ممكن أن يكون حل سيئ للمسألة بالكامل.
يوجد هناك بدائل كثيرة لهذه الطريقة مثل [[خوارزمية جشعة]] والتي بها يتم الحصول على الخيار الأمثل الموضعي في كل فرع في الطريق. الخيار الأمثل الموضعي ممكن أن يكون حل سَيئ للمسألة بالكامل، بالرغم ان [[خوارزمية جشعة]] لا تضمن الحل الامثل فإنها في كثير من الأحيان تقدم حسابات أسرع ولحسن الحظ فإن بعض من [[خوارزمية جشعة]] ([[Minimum spanning tree|Minimum spanning trees]]) أثبت أنها تقدم الحل الأفضل.
بالرغم ان greedy algorithm لا تضمن الحل الامثل فإنها في كثير من الأحيان تقدم حسابات أسرع. لحسن الحظ فان بعض من greedy algorithm (minimum spanning trees )اثبت انها تقدم الحل الأفضل.


على سبيل المثال، إذا كنا نريد الوصول من النقطة a إلى النقطة b في ساعة الذروة فإن البرمجة الديناميكية سوف تبحث عن النقاط القريبة من النقطة و a ثم يتم استخدامها للحصول على أقرب طريق إلى النقطة b على الجانب الآخر فإنك سوف تبدأ بالسواقة ومن ثم يتم البحث عن الطريق الأسرع عند كل تقاطع. كل ان تتخيل ان في هذه الطريقة قد لا تؤدي الي اسرع وقت للوصول حيث انه ممكن ان تختار طريق ظنا بأنه الطريق الاسرع ثم تجد أنك وقعت في أزمة مرورية.
على سبيل المثال، إذا كنا نريد الوصول من النقطة a إلى النقطة b في ساعة الذروة فإن البرمجة الديناميكية سوف تبحث عن النقاط القريبة من النقطة و a ثم يتم استخدامها للحصول على أقرب طريق إلى النقطة b على الجانب الآخر فإنك سوف تبدأ بالقيادة ومن ثم يتم البحث عن الطريق الأسرع عند كل تقاطع و لك أن تتخيل أن هذه الطريقة قد لا تؤدي إلى أسرع وقت للوصول حيث إنه من الممكن أن تختار طريقاً ظناً بأنه الطريق الأسرع ثم تجد أنك وقعت في أزمة مرورية.


2- مثال: اقتصاد امثل
2- مثال: اقتصاد أمثل


== نظرة عامة ==
== نظرة عامة ==
البرمجة الديناميكية هي طريقة للحصول علي الامثل رياضيا وبرمجية حاسوبية أيضا. في كلا السياقين نهدف إلى تبسيط المسائل المعقدة عن طريق تجزئتها إلى مسائل ثانوية أبسط في طريقة التكرار. في حين أن بعض المسائل المتعلقة باتخاذ قرار لا يمكن أن تحل بهذه الطريقة فإنه في كثير من الأحيان القرارات التي تمتد على مدار الوقت لكثير من النقاط لا تتفكك بشكل مستمر. [[Bellman]] سمي ذلك في "Principle of optimality"
البرمجة الديناميكية هي طريقة للحصول على الأمثل رياضيا وبرمجية [[حوسبة|حاسوبية]] أيضا. في كلا السياقين تهدف إلى تبسيط المسائل المعقدة عن طريق تجزئتها إلى مسائل ثانوية أبسط في طريقة التكرار. في حين أن بعض المسائل المتعلقة باتخاذ قرار لا يمكن أن تحل بهذه الطريقة فإنه في كثير من الأحيان القرارات التي تمتد على مدار الوقت لكثير من النقاط لا تتفكك بشكل مستمر. [[ريتشارد بيلمان|بيلمان]] سمي ذلك في "Principle of optimality"
بطريقة متشابهة فإنه في علم الكمبيوتر المسائل التي تحل للحصول على الحل الأمثل عن طريق تجزئة المسالة الي مسائل أصغر وأسهل وبعدها يتم حل باقي المسائل بطريقة متكررة للوصول للحل الأمثل للمسألة يقال أن لها بناء أمثل.
بطريقة متشابهة فإنه في [[علم الحاسوب|علم الكمبيوتر]] المسائل التي تحل للحصول على الحل الأمثل عن طريق تجزئة المسالة إلى مسائل أصغر وأسهل وبعدها يتم حل باقي المسائل بطريقة متكررة للوصول للحل الأمثل للمسألة يقال إن لها بناء أمثل.


إذا كانت المسائل الثانوية ممكن أن تكون متداخله بشكل متكرر داخل المسألة حيث يمكن أن تطبق البرمجة الديناميكية عليها فإنه يوجد علاقة بين قيم المسألة الكبيرة وبين قيم المسائل الصغيرة الثانوية. في ال optimization literature تسمي هذه العلاقة ب[[معادلة Bellman]].
إذا كانت المسائل الثانوية ممكن أن تكون متداخلة بشكل متكرر داخل المسألة حيث يمكن أن تطبق البرمجة الديناميكية عليها فإنه يوجد علاقة بين قيم المسألة الكبيرة وبين قيم المسائل الصغيرة الثانوية. في ال optimization literature تسمي هذه العلاقة ب[[معادلة Bellman]].


=== البرمجة الديناميكية في الأمثل الرياضي ===
=== البرمجة الديناميكية في الأمثل الرياضي ===
في مصطلح الأمثل الرياضي البرمجة الديناميكية تشير ببساطة إلى تفكيك القرار إلى سلسلة من خطوات القرار على مدار الوقت.
في مصطلح الأمثل الرياضي البرمجة الديناميكية تشير ببساطة إلى تفكيك القرار إلى سلسلة من خطوات القرار على مدار الوقت. يتم فعل ذلك عن طريق القيام بتعريف قيم الدوال بف1, ف2........ف ن بمتغير x الذي يعبر عن حالة النظام في فترات زمنية a من 1 الي n. تعريف (f n (x بأنها القيمة التي يتم الحصول عليها من الحلة ص عند آخر وقت n.
يتم فعل ذلك عن طريق القيان بتعريف قيم الدوال ب ف1, ف2........ف ن بمتغير x الذي يعبر عن حالة النظام في فترات زمنية a من 1 الي n. تعريف (f n (x بانها القيمة الي يتم الحصول عليها من الحلة ص عند آخر وقت n.


قيم ف أ في أوقات ابكر في ن-1 ,ن- 2 ,.......2 ,1 يمكن الحصول عليها عن طريق الحساب للخلف باستخدام علاقيات متكررة مسماه بمعادلة Bellman
قيم فا في أوقات أبكر في ن-1, ن- 2,....... 2, 1 يمكن الحصول عليها عن طريق الحساب للخلف باستخدام علاقات متكررة مسماه بمعادلة Bellman
لكل أ=2 ,.... ن ف أ-1 عند كل قيمه ل ستحسب من ف أ عن طريق الحصول على أكبر قيمة لدالة بسيطه (غالبا عن طريق الجمع) للربح من القرار عند وقت ا-1 ودالة ف أ عند الحلة الجديدة النظام إذا تم اتخاذ القرار . حيث أن قيمة ف أ تم حسابها للحالة المطلوبة فان العملية السابقة ينتج عنها قيمة ف أ-1 لهذه الحالات. اخيرا فان قيمة ف1 للحالة الابتدائية هي قيمة الحل الأمثل للمسألة. القيم المثلى للمتغيرات الخاصة بالقرار ممكن ايجادها عن طريق الرجوع إلى الحسابات التي تمت بالفعل.
لكل أ=2,.... ن ف أ-1 عند كل قيمه ل ستحسب من ف أ عن طريق الحصول على أكبر قيمة لدالة بسيطة (غالباً عن طريق الجمع) للربح من القرار عند وقتا-1 ودالة ف أ عند الحلة الجديدة النظام إذا تم اتخاذ القرار. حيث أن قيمة ف أ تم حسابها للحالة المطلوبة فان العملية السابقة ينتج عنها قيمة ف أ-1 لهذه الحالات. اخيراً فان قيمة ف 1 للحالة الابتدائية هي قيمة الحل الأمثل للمسألة. القيم المثلى للمتغيرات الخاصة بالقرار ممكن إيجادها عن طريق الرجوع إلى الحسابات التي تمت بالفعل.


=== البرمجة الديناميكية في المعلوماتية الحيوية ===
=== البرمجة الديناميكية في المعلوماتية الحيوية ===
تستخدم البرمجة الديناميكية بشكل واسع في المعلوماتية الحيوية في كثير من المهام مثل تسلسل المحاذاة ووطي البروتين وتوقع بناء RNA وروابط بروتين ال DNA.
تستخدم البرمجة الديناميكية بشكل واسع في المعلوماتية الحيوية في كثير من المهام مثل تسلسل المحاذاة و وطي البروتين وتوقع بناء [[حمض نووي ريبوزي|RNA]] وروابط بروتين ال DNA.
اولا فان خوارزميات البرمجة الديناميكية استخدمت بشكل منفصل في روابط بروتين الـ DNA في عام 1970 عن طريق CHarlesDelisis في [[الولايات المتحدة|الولايات المتحدة الأمريكية]]
اولا فان خوارزميات البرمجة الديناميكية استخدمت بشكل منفصل في روابط بروتين الـDNA في عام 1970 عن طريق CHarles Delisis في [[الولايات المتحدة|الولايات المتحدة الأمريكية]]
وGeorgii Gurskii و Alexander Zasedetelv في [[الاتحاد السوفيتي|الاتحاد السوفييتي]] السابق.
و GeorgهGurskii و Alexander Zasedetelv في [[الاتحاد السوفيتي|الاتحاد السوفييتي]] السابق.


حاليا، أصبحت هذه الخوارزميات معروفة في المعلوماتية الحيوية وعلم الأحياء الحسابي خاصة في الدراسات المختصة بالمواقع جسيم نووي وعامل النسخ ملزمة.
حاليا، أصبحت هذه الخوارزميات معروفة في المعلوماتية الحيوية وعلم الأحياء الحسابي خاصة في الدراسات المختصة بالمواقع جسيم نووي وعامل النسخ ملزمة.


=== البرمجة الديناميكية في برمجة الحاسوب===
=== البرمجة الديناميكية في برمجة الحاسوب ===
هناك مفتاحان رئيسان يجب ان تتواجد في المشكلة لكي يمكن ان تطبق عليها البرمجة الديناميكية : البناء الامثل والمسائل الثانوية المتداخلة. إذا كانت المسالة ممكن ان تنجل عن طريق دمج عدد من الحلول المثلي لمشاكل ثانوية غير متداخلة فان هذه الطريقة تسمي ''فرق تسد'' بدلا من ذلك لهذا السبب فأن تصنيف الدمج والتصنيف السريع لا يمكن ان تصنف ضمن مسائل البرمجة الديناميكية.
هناك مفتاحان رئيسان يجب أن يتواجدا في المشكلة لكي يمكن أن تطبق عليها البرمجة الديناميكية: البناء الأمثل والمسائل الثانوية المتداخلة. إذا كانت المسألة ممكن أن تنحل عن طريق دمج عدد من الحلول المثلي لمشاكل ثانوية غير متداخلة فان هذه الطريقة تسمي ''فرق تسد'' بدلا من ذلك لهذا السبب فإن تصنيف الدمج والتصنيف السريع لا يمكن أن تصنف ضمن مسائل البرمجة الديناميكية.


يقصد بالبناء الامثل ان الحل للمسالة الامثل المعطا يمكن الحصول عليها عن طريق دمج الحلول المثلى للمسائل الثانوية. لذلك فان أول خطوة لاعطاء حل للبرمجة الديناميكية هو التاكد من وجود مثل ذلك البناء الأمثل لهذه المسالة. مثل هذا البناء الامثل يتم وصفه عادة عن طريق التكرار. عن طريق المثال :لرسم معين ج(ف، ي)
يقصد بالبناء الأمثل أن الحل للمسألة الأمثل المعطى يمكن الحصول عليها عن طريق دمج الحلول المثلى للمسائل الثانوية. لذلك فإن أول خطوة لإعطاء حل للبرمجة الديناميكية هو التأكد من وجود مثل ذلك البناء الأمثل لهذه المسالة. مثل هذا البناء الامثل يتم وصفه عادة عن طريق التكرار. عن طريق المثال: لرسم معين ج (ف، ي)
فان أقصر طريق ب من النقطة ف لنقطة ك له بناء امثل إذا: يمكن ان نختار نقطة في منتصف الطريق بين النقطتبن "و " حيث انه إذا كان الطريق ب هو الطريق الأمثل فان هذا الطريق يمكن ان ينقسم الي طريقين ب1 من النقطة" ب" الي النقطة" و" وطريق ب2 من النقطة" و" إلى النقطة "ك" بنفس الطريقة يكونوا ايضا اصغر طرق بين النقاط المقابلة (باستخدام ببساطة مبدأ [[قص ونسخ ولصق|قص ولصق]] المشروحة في مقدمة الخواريزميات) . وهكذا فانه ممكن فانه بسهولة إيجاد الطريق الأقصر بطريقة متكررة وهذا نفس ما قام به خوارزيميات بولمان–فورد وخوارزميات فولياد وارشال.
فان أقصر طريق ب من النقطة فالنقطة كله بناء أمثل إذا: يمكن أن نختار نقطاً في منتصف الطريق بين النقطتين «و» حيث إنه إذا كان الطريق ب هو الطريق الأمثل فان هذا الطريق يمكن ان ينقسم طريقين ب 1 من النقطة» إلى النقطة» وطريق ب2 من النقطة» إلى النقطة «ك» بنفس الطريقة يكونوا أيضا أصغر طرق بين النقاط المقابلة (باستخدام ببساطة مبدأ [[قص ونسخ ولصق|قص ولصق]] المشروحة في مقدمة الخوارزميات). وهكذا فانه ممكن فانه بسهولة إيجاد الطريق الأقصر بطريقة متكررة وهذا نفس ما قام به خوارزميات بولمان–فورد و خوارزميات فولياد وارشال.


المسائل الثانوية المتداخلة مقصود بها ان المساحة المسموحة للمسائل الثانوية يجب أن تكون صغيرة لذا فإن أي خوارزميات متكررة لحل هذه المسالة يجب ان تحل هذه المسائل الثانوية بدلا من ايجاد مسائل ثانوية جديدة.
المسائل الثانوية المتداخلة مقصود بها ان المساحة المسموحة للمسائل الثانوية يجب أن تكون صغيرة لذا فإن أي خوارزميات متكررة لحل هذه المسألة يجب أن تحل هذه المسائل الثانوية بدلا من إيجاد مسائل ثانوية جديدة. علي طريق المثال: اعتبر الصيغة المتكررة لإنشاء متسلسلات Fibonacci
ف أ = ف أ-1 + ف أ-2 بحالة أساسية ف1=ف2=1 وبالتالي فإن ف34= ف24+ف14 و ف24= ف14+ف04 الآن فإن ف14 تم حلها باستخدام شجرة ثانوية من كلا ف 34 وف 24
علي طريق المثال :اعتبر الصيغة المتكررة لإنشاء متسلسلات Fibonacci
بالرغم من أن العدد الكلي للمسائل الثانوية صغير بالفعل (فقط 43) فإننا يمكننا إنهاء حل نفس المسائل مرارا وتكرارا إذا تمكنا من الوصول إلى حل متكرر ساذج مثل ذلك، لأن البرمجة الديناميكية أخذت ذلك في الاعتبار هذه الحقيقة تقوم بحل المسائل الثانوية لمرة واحدة. وذلك ممكن أن يتحقق بطريقتين:
ف أ = ف أ-1 + ف أ-2 بحالة أساسية ف1=ف2=1 وبالتالي فان ف34= ف24+ف14 و ف24= ف14+ف04 الان فان ف14 تم حلها باستخدام شجرة ثانوية من كلا ف 34 وف 24
طريقه من الأعلى إلى أسفل:
بالرغم من أن العدد الكلي للمسائل الثانوية صغير بالفعل ( فقط 43) فإننا يمكننا إنهاء حل نفس المسائل مرارا وتكرارا إذا تمكنا من الوصول إلى حل متكرر ساذج مثل ذلك، لأن البرمجة الديناميكية أخذت ذلك في الاعتبار هذه الحقيقة تقوم بحل هذه المسائل الثانوية لمرة واحدة.
وذلك ممكن أن يتحقق بطريقتين:
طريقه من الأعلي إلي أسفل:


هي عبارة عن إسقاط مباشر لاي صيغة رجعية لأي مسألة. إذا كان الحل لأي مسألة يمكن أن يتكون بشكل رجعي باستخدام الحل لمسائل الثانوية له فإنه يمكن تسجيل أو تخزين الحل لهذه المسائل الثانوية في جدول. لذا عند حل أي مسائل ثانوية جديدة نبحث اولا في الجدول إذا كانت تم حلها بالفعل. إذا كان الحل مسجل فإننا يمكننا استخدامه مباشرة غير ذلك فإنه يتم حل المسألة واضافاتها في الجدول.
هي عبارة عن إسقاط مباشر لأي صيغة رجعية لأي مسألة. إذا كان الحل لأي مسألة يمكن أن يتكون بشكل رجعي باستخدام الحل لمسائل الثانوية له فإنه يمكن تسجيل أو تخزين الحل لهذه المسائل الثانوية في جدول. لذا عند حل أي مسائل ثانوية جديدة نبحث اولاً في الجدول إذا كانت تم حلها بالفعل. إذا كان الحل مسجل فإننا يمكننا استخدامه مباشرةً غير ذلك فإنه يتم حل المسألة وإضافاتها في الجدول. طريقه من أسفل إلى أعلى:
بمجرد تكوين الحل للمسألة بطريقة رجعية في صيغة مسائلها الثانوية نقوم بإعادة تكوين المسألة من أسفل إلى أعلى: عن طريق محاولة إيجاد حل للمسائل الثانوية ومن ثم إيجاد الحل للمسائل الأكبر. هذه أيضا يتم تكوينها في صيغة جدولية عن طريق تكوين الحل للمسائل الأكبر فالأكبر باستخدام الحلول للمسائل الأصغر. عن طريق المثال إذا تم الوصول لحل ف 14 و ف 04 يمكن إيجاد حل ل ف 24
طريقه من أسفل إلى أعلى:
بعض لغات البرمجة من الممكن أن تقوم بتخزين النتائج بطريقة أوتوماتيكية كدالة يمكن مناداتها باستخدام عدد من الأوامر وذلك لكي يتم تسريع تقييم المناداة بالاسم (هذه الطريقة التي تسمي المناداة حسب الحاجة) بعض اللغات تجعل من الممكن تنقلنا. بعض اللغات لديها آلية التحفيظ في بني مثل جداول Prolog and J والتي تدعم التخزين باستخدام M adverb
بمجرد تكوين الحل للمسألة بطريقة رجعية في صيغة مسائلها الثانويه نقوم بإعادة تكوين المسألة من أسفل إلى أعلى : عن طريق محاولة إيجاد حل للمسائل الثانوية ومن ثم إيجاد الحل للمسائل الأكبر. هذه ايضا يتم تكوينها في صيغة جدولية عن طريق تكوين الحل للمسائل الأكبر فالأكبر باستخدام الحلول للمسائل الأصغر. عن طريق المثال إذا تم الوصول لحل ف 14 و ف04 يمكن إيجاد حل ل ف 24
2-مثال: اقتصاد أمثل
بعض لغات البرمجة ممكن أن تقوم بتخزين النتائج بطريقة أوتوماتيكية كدالة ممكن مناداتها باستخدام عدد من الأوامر وذلك لكي يتم تسريع تقييم المناداة بالاسم( هذه الطريقة التي تسمي المناداة حسب الحاجة) بعض اللغات تجعل من الممكن تنقليا . بعض اللغات لديها آلية
التحفيظ في بني مثل جداول Prolog and J والتي تدعم التخزين باستخدام M adverb
2-مثال: اقتصاد امثل


=== الاستهلاك والتوفير الأمثل ===
=== الاستهلاك والتوفير الأمثل ===
كتطبيق مسألة الأمثل رياضيا التي تستخدم غالبا في تعليم البرمجة الديناميكية متعلقة بمستهلك يعيش علي فترات زمنية t=1,2,3,.....T والمطلوب أن تقرر مقدار الذي يجب أن يستهلكه المستهلك وكم يجب أن يوفره.
كتطبيق مسألة الأمثل رياضيا التي تستخدم غالبا في تعليم البرمجة الديناميكية متعلقة بمستهلك يعيش على فترات زمنية t=1,2,3,.....T والمطلوب أن تقرر مقدار الذي يجب أن يستهلكه المستهلك وكم يجب أن يوفره. نفرض أن " Ct" تمثل الاستهلاك عند زمن "t" مع افتراض أن الاستهلاك يؤدي إلى فائدة
U(t)=ln C<sub>t</sub> طالما المستهلك على قيد الحياة. مع افتراض أن المستهلك غير صبور فهو يريد أن يعد فوائد المستقبل بمعامل "b" لكل فترة حيث ان 1 <b <0↵افترض Kt رأس مال عند فترة زمنية t . افترض أن الراس مال الابتدائي <k<sub>0</sub> مع افتراض أن هذا الرأس مال مع الاستهلاك يمكن أن يحددوا الرأس مال في الفترة الزمنية المقبلة حيث A هو ثابت موجب و 1 <a< 0 نفتر ان الرأس مال لا يمكن ان يكون سالب. لذا فإن مسألة اتخاذ قرار للمستهلك يمكن ان تكتب:
نفرض أن " Ct" تمثل الاستهلاك عند زمن "t" مع افتراض أن الاستهلاك يؤدي إلى فائدة

U(t)=ln Ct طالما المستهلك علي قيد الحياة. مع افتراض أن المستهلك غير صبور فهو يريد أن يعد فوائد المستقبل بمعامل "b" لكل فترة حيث ان <nowiki>1<b<0</nowiki>
افترض Kt رأسمال عند فترة زمنية t . افترض ان الراسمال الابتدائي <k0مع افتراض أن هذا الرأسمال مع الاستهلاك يمكن أن يحددوا الرأسمال في الفترة الزمنية المقبلة
حيث A هو ثابت موجب و1 <a< 0 نفتر ان الراسمال لايمكن ان يكون سالب . لذا فإن مسألة اتخاذ قرار للمستهلك يمكن ان تكتب:
بهذه الطريقة فإن المسألة تبدو معقدة حيث انه يجب ايجاد الحلول لكل المتغيرات المتاحة
بهذه الطريقة فإن المسألة تبدو معقدة حيث انه يجب ايجاد الحلول لكل المتغيرات المتاحة
C<sub>0</sub> ,C<sub>1</sub> ,C<sub>2</sub> ,………C<sub>t</sub>
C0,C1,C2,………Ct


استخدام نهج البرمجة الديناميكية حيث يتم تفكيك المسألة إلى سلسلة قرارات أصغر. لفعل ذلك نقوم بتعريف قيمة دالة Vt(K) لكل t=0,1,2,….T,T+1 والتي تمثل قيمة ما نمتلك من رأس مال عند كل فترة زمنية t . لاحظ أنه VT+1(K)=0 حيث انه بالافتراض لا يوجد فائدة من امتلاك رأس مال بعد الموت. قيمة الرأس مال عند أي فترة زمنية سابقة يمكن أن تحسب عن طريق الحث للوراء باستخدام معادلة Bellman. لهذه المسألة تكون معادلة Bellman كالآتي
هذه المسألة أسهل بكثير من المسائل المكتوبة سابقا لأنها تحتوي فقط على متغيرين للقرار فقط C<sub>t</sub>, K<sub>t+1</sub> وبالتالي انه بدل ان يقوم المستهلك بوضع خطة لحياته بأكملها عند الولادة هو يأخذ كل خطوة على حده. لذا عند كل فترة زمنية t يكون الرأس مال معطي ومعروف للمستهلك فكل ما عليه هو أن يحسب استهلاكه Ct وبحسب ما يدخره K<sub>t+1</sub>
استخدام نهج البرمجة الديناميكية حيث يتم تفكيك المسألة إلى سلسلة قرارات أصغر. لفعل ذلك نقوم بتعريف قيمة دالة Vt(K) لكل t=0,1,2,….T,T+1 والتي تمثل قيمة ما نمتلك من رأسمال عند كل فترة زمنية t . لاحظ أنه VT+1(K)=0 حيث انه بالافتراض لا يوجد فائده من امتلاك رأس مال بعد الموت.
قيمة الرأسمال عند أي فترة زمنية سابقة يمكن أن تحسب عن طريق الحث للوراء باستخدام معادلة Bellman . لهذه المسألة تكون معادلة Bellman كالاتي
هذه المسألة أسهل بكثير من المسائل المكتوبة سابقا لأنها تحتوي فقط على متغيرين للقرار فقط Ct, Kt+1 وبالتالي انه بدل ان يقوم المستهلك بوضع خطة لحياته بأكملها عند الولادة هو يأخذ كل خطوة على حده. لذا عند كل فترة زمنية t يكون الرأسمال معطي ومعروف للمستهلك فكل ما عليه هو ان يحسب استهلاكه Ct ويحسب ما يدخره Kt+1


لحل المسألة بالضبط فإننا نرجع للخلف. كتبسيط مستوى الرأسمال عند هذه النقط يعرف ب K
لحل المسألة بالضبط فإننا نرجع للخلف. كتبسيط مستوى الرأس مال عند هذه النقط يعرف ب K
قيمة VT+1(K) معروفة لذا باستخدام معادلة Bellman يمكن حساب VT(K) ونستمر كذلك حتى يتم حساب V0(K) والتي تمثل القيمة للقرار الابتدائي للمسألة على مدار حياته
قيمة VT+1(K) معروفة لذا باستخدام معادلة Bellman يمكن حساب VT(K) ونستمر كذلك حتى يتم حساب V0(K) والتي تمثل القيمة للقرار الابتدائي للمسألة على مدار حياته


بالعمل للخلف واضح ان قيمة الدالة لفترة زمنية t=T-j
بالعمل للخلف واضح أن قيمة الدالة لفترة زمنية t=T-j
حيث كل VT-j ثابت لذا الكمية المثلى للاستهلاك عند فترة زمنية t=T-j
حيث كل VT-j ثابت لذا الكمية المثلى للاستهلاك عند فترة زمنية t=T-j


ويمكن أن تبسط الي{{عبارة مبهمة}}
ويمكن أن تبسط إلى{{عبارة مبهمة}}


كما هو واضح فإنه يتم استهلاك كمية أكبر من الصحة كلما يكبر في العمر و يقوم باستهلاك كل الصحة عند وقت T أي عند الوفاة.
كما هو واضح فإنه يتم استهلاك كمية أكبر من الصحة كلما يكبر في العمر ويقوم باستهلاك كل الصحة عند وقت T أي عند الوفاة.


== مراجع ==
== مراجع ==
سطر 94: سطر 82:


{{خوارزميات التحسين|combinatorial|state=expanded}}
{{خوارزميات التحسين|combinatorial|state=expanded}}
{{شريط بوابات|خوارزميات|رياضيات|علم الحاسوب}}
{{شريط بوابات|علم الأنظمة|خوارزميات|رياضيات|علم الحاسوب}}
{{ضبط استنادي}}
{{ضبط استنادي}}


[[تصنيف:برمجة ديناميكية]]
[[تصنيف:برمجة ديناميكية| ]]
[[تصنيف:تحكم أمثل]]
[[تصنيف:تحكم أمثل]]
[[تصنيف:معادلات]]
[[تصنيف:معادلات]]

النسخة الحالية 07:51، 25 أغسطس 2024

البرمجة الديناميكية (بالإنجليزية: Dynamic programming)‏ , في الرياضيات وعلم الحاسوب: هي طريقة لحل المسائل المعقّدة الصعبة عن طريق تقسيمها لمسائل فرعية أبسط وأسهل حلاً.[1][2][3]

عادة ماتكون الفكرة وراء البرمجة الديناميكية بسيطة لحل مسألة ما، فنحتاج إلى حل أجزاء مختلفة من المشكلة (مسائل فرعية)، ومن ثم جمع حلول المسائل الفرعية للحصول على الحل الشامل، في كثير من الأحيان، العديد من تلك المسائل الفرعيّة متشابهة في الواقع، نهج البرمجة الديناميكية يتم من خلال البحث عن حل كل مسألة فرعيّة مرة واحدة فقط، مما يقلل من عدد العمليات الحسابية وبمجرد حساب حل مسألة فرعيّة معينة، يتم حفظ الحل، ويكون الحل نفسه في المرة القادمة، نفس عدد المسائل الفرعية المتكررة، وهذا الأسلوب مفيد بشكل خاص عندما ينمو حجم المدخلات بشكل كبير (نمو أسي).

عند استخدام هذه الطريقة، يتم توفير الوقت بشكل كبير مقارنة بالطرق الأخرى التي لا تتمتع بقدرة حل المسائل الثانوية المتداخلة مثل: (بحث العمق أولاً).

لحل مسألة ما، وباستخدام البرمجة الديناميكية نحتاج لحل أجزاء مختلفة من المسألة (مسائل ثانويّة) بعدها يتم الدمج بينهم للحصول على الحل للمسألة بشكل عام، في الكثير من الأحيان عند استخدام طريقة خوارزمية جشعة فإنه يكون هناك العديد من المسائل الثانويّة التي تحل بشكل متكرر ولكن البرمجة الديناميكية تهدف إلى حل كل مسألة ثانويّة لمرة واحدة فقط مما يؤدي إلى تقليل عدد الحسابات، فإنه بمجرد حل مسألة ثانوية فإنه يتم تخزينها في «مذكرة أوتوماتيكية» لذا في المرة القادمة عندما نحتاج لنفس الحل فإنه ببساطة يتم البحث عنه و هذا النهج مفيد خاصةً عندما يكون عدد المسائل المتكررة يزداد بشكل مفرط كدالة في حجم المدخلات.

تستخدم خوارزميّات البرمجة الديناميكية لتعظيم الاستفادة (مثلاً للحصول على أقصر طريق بين نقطتين أو أسرع طريقة لضرب مصفوفات)، خوارزميات البرمجة الديناميكية ستدرس الحلول السابقة للمسائل الثانويّة وتقوم بدمجها للحصول على أفضل حل للمسألة المراد حلها.

يوجد هناك بدائل كثيرة لهذه الطريقة مثل خوارزمية جشعة والتي بها يتم الحصول على الخيار الأمثل الموضعي في كل فرع في الطريق. الخيار الأمثل الموضعي ممكن أن يكون حل سَيئ للمسألة بالكامل، بالرغم ان خوارزمية جشعة لا تضمن الحل الامثل فإنها في كثير من الأحيان تقدم حسابات أسرع ولحسن الحظ فإن بعض من خوارزمية جشعة (Minimum spanning trees) أثبت أنها تقدم الحل الأفضل.

على سبيل المثال، إذا كنا نريد الوصول من النقطة a إلى النقطة b في ساعة الذروة فإن البرمجة الديناميكية سوف تبحث عن النقاط القريبة من النقطة و a ثم يتم استخدامها للحصول على أقرب طريق إلى النقطة b على الجانب الآخر فإنك سوف تبدأ بالقيادة ومن ثم يتم البحث عن الطريق الأسرع عند كل تقاطع و لك أن تتخيل أن هذه الطريقة قد لا تؤدي إلى أسرع وقت للوصول حيث إنه من الممكن أن تختار طريقاً ظناً بأنه الطريق الأسرع ثم تجد أنك وقعت في أزمة مرورية.

2- مثال: اقتصاد أمثل

نظرة عامة

[عدل]

البرمجة الديناميكية هي طريقة للحصول على الأمثل رياضيا وبرمجية حاسوبية أيضا. في كلا السياقين تهدف إلى تبسيط المسائل المعقدة عن طريق تجزئتها إلى مسائل ثانوية أبسط في طريقة التكرار. في حين أن بعض المسائل المتعلقة باتخاذ قرار لا يمكن أن تحل بهذه الطريقة فإنه في كثير من الأحيان القرارات التي تمتد على مدار الوقت لكثير من النقاط لا تتفكك بشكل مستمر. بيلمان سمي ذلك في "Principle of optimality" بطريقة متشابهة فإنه في علم الكمبيوتر المسائل التي تحل للحصول على الحل الأمثل عن طريق تجزئة المسالة إلى مسائل أصغر وأسهل وبعدها يتم حل باقي المسائل بطريقة متكررة للوصول للحل الأمثل للمسألة يقال إن لها بناء أمثل.

إذا كانت المسائل الثانوية ممكن أن تكون متداخلة بشكل متكرر داخل المسألة حيث يمكن أن تطبق البرمجة الديناميكية عليها فإنه يوجد علاقة بين قيم المسألة الكبيرة وبين قيم المسائل الصغيرة الثانوية. في ال optimization literature تسمي هذه العلاقة بمعادلة Bellman.

البرمجة الديناميكية في الأمثل الرياضي

[عدل]

في مصطلح الأمثل الرياضي البرمجة الديناميكية تشير ببساطة إلى تفكيك القرار إلى سلسلة من خطوات القرار على مدار الوقت. يتم فعل ذلك عن طريق القيام بتعريف قيم الدوال بف1, ف2........ف ن بمتغير x الذي يعبر عن حالة النظام في فترات زمنية a من 1 الي n. تعريف (f n (x بأنها القيمة التي يتم الحصول عليها من الحلة ص عند آخر وقت n.

قيم فا في أوقات أبكر في ن-1, ن- 2,....... 2, 1 يمكن الحصول عليها عن طريق الحساب للخلف باستخدام علاقات متكررة مسماه بمعادلة Bellman لكل أ=2,.... ن ف أ-1 عند كل قيمه ل ستحسب من ف أ عن طريق الحصول على أكبر قيمة لدالة بسيطة (غالباً عن طريق الجمع) للربح من القرار عند وقتا-1 ودالة ف أ عند الحلة الجديدة النظام إذا تم اتخاذ القرار. حيث أن قيمة ف أ تم حسابها للحالة المطلوبة فان العملية السابقة ينتج عنها قيمة ف أ-1 لهذه الحالات. اخيراً فان قيمة ف 1 للحالة الابتدائية هي قيمة الحل الأمثل للمسألة. القيم المثلى للمتغيرات الخاصة بالقرار ممكن إيجادها عن طريق الرجوع إلى الحسابات التي تمت بالفعل.

البرمجة الديناميكية في المعلوماتية الحيوية

[عدل]

تستخدم البرمجة الديناميكية بشكل واسع في المعلوماتية الحيوية في كثير من المهام مثل تسلسل المحاذاة و وطي البروتين وتوقع بناء RNA وروابط بروتين ال DNA. اولا فان خوارزميات البرمجة الديناميكية استخدمت بشكل منفصل في روابط بروتين الـDNA في عام 1970 عن طريق CHarles Delisis في الولايات المتحدة الأمريكية و GeorgهGurskii و Alexander Zasedetelv في الاتحاد السوفييتي السابق.

حاليا، أصبحت هذه الخوارزميات معروفة في المعلوماتية الحيوية وعلم الأحياء الحسابي خاصة في الدراسات المختصة بالمواقع جسيم نووي وعامل النسخ ملزمة.

البرمجة الديناميكية في برمجة الحاسوب

[عدل]

هناك مفتاحان رئيسان يجب أن يتواجدا في المشكلة لكي يمكن أن تطبق عليها البرمجة الديناميكية: البناء الأمثل والمسائل الثانوية المتداخلة. إذا كانت المسألة ممكن أن تنحل عن طريق دمج عدد من الحلول المثلي لمشاكل ثانوية غير متداخلة فان هذه الطريقة تسمي فرق تسد بدلا من ذلك لهذا السبب فإن تصنيف الدمج والتصنيف السريع لا يمكن أن تصنف ضمن مسائل البرمجة الديناميكية.

يقصد بالبناء الأمثل أن الحل للمسألة الأمثل المعطى يمكن الحصول عليها عن طريق دمج الحلول المثلى للمسائل الثانوية. لذلك فإن أول خطوة لإعطاء حل للبرمجة الديناميكية هو التأكد من وجود مثل ذلك البناء الأمثل لهذه المسالة. مثل هذا البناء الامثل يتم وصفه عادة عن طريق التكرار. عن طريق المثال: لرسم معين ج (ف، ي) فان أقصر طريق ب من النقطة فالنقطة كله بناء أمثل إذا: يمكن أن نختار نقطاً في منتصف الطريق بين النقطتين «و» حيث إنه إذا كان الطريق ب هو الطريق الأمثل فان هذا الطريق يمكن ان ينقسم طريقين ب 1 من النقطة» إلى النقطة» وطريق ب2 من النقطة» إلى النقطة «ك» بنفس الطريقة يكونوا أيضا أصغر طرق بين النقاط المقابلة (باستخدام ببساطة مبدأ قص ولصق المشروحة في مقدمة الخوارزميات). وهكذا فانه ممكن فانه بسهولة إيجاد الطريق الأقصر بطريقة متكررة وهذا نفس ما قام به خوارزميات بولمان–فورد و خوارزميات فولياد وارشال.

المسائل الثانوية المتداخلة مقصود بها ان المساحة المسموحة للمسائل الثانوية يجب أن تكون صغيرة لذا فإن أي خوارزميات متكررة لحل هذه المسألة يجب أن تحل هذه المسائل الثانوية بدلا من إيجاد مسائل ثانوية جديدة. علي طريق المثال: اعتبر الصيغة المتكررة لإنشاء متسلسلات Fibonacci ف أ = ف أ-1 + ف أ-2 بحالة أساسية ف1=ف2=1 وبالتالي فإن ف34= ف24+ف14 و ف24= ف14+ف04 الآن فإن ف14 تم حلها باستخدام شجرة ثانوية من كلا ف 34 وف 24 بالرغم من أن العدد الكلي للمسائل الثانوية صغير بالفعل (فقط 43) فإننا يمكننا إنهاء حل نفس المسائل مرارا وتكرارا إذا تمكنا من الوصول إلى حل متكرر ساذج مثل ذلك، لأن البرمجة الديناميكية أخذت ذلك في الاعتبار هذه الحقيقة تقوم بحل المسائل الثانوية لمرة واحدة. وذلك ممكن أن يتحقق بطريقتين: طريقه من الأعلى إلى أسفل:

هي عبارة عن إسقاط مباشر لأي صيغة رجعية لأي مسألة. إذا كان الحل لأي مسألة يمكن أن يتكون بشكل رجعي باستخدام الحل لمسائل الثانوية له فإنه يمكن تسجيل أو تخزين الحل لهذه المسائل الثانوية في جدول. لذا عند حل أي مسائل ثانوية جديدة نبحث اولاً في الجدول إذا كانت تم حلها بالفعل. إذا كان الحل مسجل فإننا يمكننا استخدامه مباشرةً غير ذلك فإنه يتم حل المسألة وإضافاتها في الجدول. طريقه من أسفل إلى أعلى: بمجرد تكوين الحل للمسألة بطريقة رجعية في صيغة مسائلها الثانوية نقوم بإعادة تكوين المسألة من أسفل إلى أعلى: عن طريق محاولة إيجاد حل للمسائل الثانوية ومن ثم إيجاد الحل للمسائل الأكبر. هذه أيضا يتم تكوينها في صيغة جدولية عن طريق تكوين الحل للمسائل الأكبر فالأكبر باستخدام الحلول للمسائل الأصغر. عن طريق المثال إذا تم الوصول لحل ف 14 و ف 04 يمكن إيجاد حل ل ف 24 بعض لغات البرمجة من الممكن أن تقوم بتخزين النتائج بطريقة أوتوماتيكية كدالة يمكن مناداتها باستخدام عدد من الأوامر وذلك لكي يتم تسريع تقييم المناداة بالاسم (هذه الطريقة التي تسمي المناداة حسب الحاجة) بعض اللغات تجعل من الممكن تنقلنا. بعض اللغات لديها آلية التحفيظ في بني مثل جداول Prolog and J والتي تدعم التخزين باستخدام M adverb 2-مثال: اقتصاد أمثل

الاستهلاك والتوفير الأمثل

[عدل]

كتطبيق مسألة الأمثل رياضيا التي تستخدم غالبا في تعليم البرمجة الديناميكية متعلقة بمستهلك يعيش على فترات زمنية t=1,2,3,.....T والمطلوب أن تقرر مقدار الذي يجب أن يستهلكه المستهلك وكم يجب أن يوفره. نفرض أن " Ct" تمثل الاستهلاك عند زمن "t" مع افتراض أن الاستهلاك يؤدي إلى فائدة U(t)=ln Ct طالما المستهلك على قيد الحياة. مع افتراض أن المستهلك غير صبور فهو يريد أن يعد فوائد المستقبل بمعامل "b" لكل فترة حيث ان 1 <b <0↵افترض Kt رأس مال عند فترة زمنية t . افترض أن الراس مال الابتدائي <k0 مع افتراض أن هذا الرأس مال مع الاستهلاك يمكن أن يحددوا الرأس مال في الفترة الزمنية المقبلة حيث A هو ثابت موجب و 1 <a< 0 نفتر ان الرأس مال لا يمكن ان يكون سالب. لذا فإن مسألة اتخاذ قرار للمستهلك يمكن ان تكتب:

بهذه الطريقة فإن المسألة تبدو معقدة حيث انه يجب ايجاد الحلول لكل المتغيرات المتاحة C0 ,C1 ,C2 ,………Ct

استخدام نهج البرمجة الديناميكية حيث يتم تفكيك المسألة إلى سلسلة قرارات أصغر. لفعل ذلك نقوم بتعريف قيمة دالة Vt(K) لكل t=0,1,2,….T,T+1 والتي تمثل قيمة ما نمتلك من رأس مال عند كل فترة زمنية t . لاحظ أنه VT+1(K)=0 حيث انه بالافتراض لا يوجد فائدة من امتلاك رأس مال بعد الموت. قيمة الرأس مال عند أي فترة زمنية سابقة يمكن أن تحسب عن طريق الحث للوراء باستخدام معادلة Bellman. لهذه المسألة تكون معادلة Bellman كالآتي

هذه المسألة أسهل بكثير من المسائل المكتوبة سابقا لأنها تحتوي فقط على متغيرين للقرار فقط Ct, Kt+1 وبالتالي انه بدل ان يقوم المستهلك بوضع خطة لحياته بأكملها عند الولادة هو يأخذ كل خطوة على حده. لذا عند كل فترة زمنية t يكون الرأس مال معطي ومعروف للمستهلك فكل ما عليه هو أن يحسب استهلاكه Ct وبحسب ما يدخره Kt+1

لحل المسألة بالضبط فإننا نرجع للخلف. كتبسيط مستوى الرأس مال عند هذه النقط يعرف ب K قيمة VT+1(K) معروفة لذا باستخدام معادلة Bellman يمكن حساب VT(K) ونستمر كذلك حتى يتم حساب V0(K) والتي تمثل القيمة للقرار الابتدائي للمسألة على مدار حياته

بالعمل للخلف واضح أن قيمة الدالة لفترة زمنية t=T-j

حيث كل VT-j ثابت لذا الكمية المثلى للاستهلاك عند فترة زمنية t=T-j

ويمكن أن تبسط إلى[مبهم]

كما هو واضح فإنه يتم استهلاك كمية أكبر من الصحة كلما يكبر في العمر ويقوم باستهلاك كل الصحة عند وقت T أي عند الوفاة.

مراجع

[عدل]
  1. ^ "معلومات عن برمجة ديناميكية على موقع thes.bncf.firenze.sbn.it". thes.bncf.firenze.sbn.it. مؤرشف من الأصل في 2019-08-30.
  2. ^ "معلومات عن برمجة ديناميكية على موقع psh.techlib.cz". psh.techlib.cz. مؤرشف من الأصل في 2019-08-30.
  3. ^ "معلومات عن برمجة ديناميكية على موقع jstor.org". jstor.org. مؤرشف من الأصل في 2019-05-25.

انظر أيضا

[عدل]