ماذا تعرف عن برمجة ديناميكية

البرمجة الديناميكية ( بالإنجليزية: Dynamic programming) في الرياضيات وعلم الحاسوب، هي: طريقة لحل المسائل المعقّدة الصعبة عن طريق تقسيمها لمسائلَ فرعية أبسط وأسهل حلًا.

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

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

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

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

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

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



قراءة المقال الكامل على ويكيبيديا ←