Dinamik dasturlash usuli bilan yechiladigan masalalar
“Dinamik dasturlash usuli bilan yechiladigan masalalar” Mundarija Kirish ………………………………………………………………… .. …3 I.BOB. NAZARIY QISM ……………………………………….……….4 1.1 Dinamik dasturlash tarixi va dinamik dasturlash g'oyasi…...4 1.2 Dinamik dasturlash……………………………………………..6 1.3 Dinamik dasturlashning tamoyili …………………………………...8 II.BOB. AMALIY QISM ……………………………………………………....10 2.1 Dinamik dasturlashda muammolar yechim topishi....………………....10 2.2 Dinamik dasturlash ikki yo‘l bilan amalga oshirilishi ...……..………..14 Xulosa…………………………….…………………………………………….…...25 Foydalanilgan adabiyotlar………………..………………………………………..26
Kirish K е yingi yillarda amaliy dasturchilarga juda ko’p int е gratsion dastur tuzish muhitlari taklif etilmoqda. Bu muhitlar u yoki bu imkoniyatlari bilan bir-biridan farq qiladi. Aksariyat dasturlash muhitlarining fundam е ntal asosi C++ tiliga borib taqaladi. Brute force (qo'pol kuch) yechimi uchun dastur manba kodi ko‘proq o‘sib boradigan muammolarni hal qilish uchun C ++ dasturining manba kodi hisoblanadi. C ++ dasturi muvaffaqiyatli tuzilib, windows va linux tizimida ishlaydi. Dinamik dasturlash - bu bir-birlari bilan takroran bog'liq bo'lgan bir nechta bir xil kichik topshiriqlarga bo'lish orqali muammoni hal qilish usuli. Eng oddiy misol Fibonachchi raqamlari bo'lishi mumkin - bu ketma-ketlikdagi ma'lum bir sonni hisoblash uchun birinchi navbatda birinchi ikkitasini qo'shib uchinchi raqamni, so'ngra to'rtinchisini xuddi shu tarzda ikkinchi va uchinchisiga qarab hisoblashimiz kerak va hokazo . Dinamika elementlarining bir-biridan bog'liqligi to'g'ridan-to'g'ri berilishi mumkin (agar bu raqamli ketma-ketliklar uchun muammo bo'lsa, ko'pincha shunday bo'ladi). Aks holda, dastlabki bir nechta qiymatlarni qo'lda hisoblash orqali ma'lum bir qator qatorlarni (xuddi shu Fibonachchi raqamlari kabi) topishga harakat qilishingiz mumkin. 2
I.BOB. NAZARIY QISM 1.1 Dinamik dasturlash tarixi va dinamik dasturlash g'oyasi "Dinamik dasturlash" iborasi birinchi marta 1940-yillarda Richard Bellman tomonidan muammoning yechimini topish jarayonini tasvirlash uchun ishlatilgan, bu yerda bitta masalaga javob uni "oldinda turgan" masalani echgandan keyingina olish mumkin. 1953 yilda u ushbu ta'rifni zamonaviy ta'rifga o'zgartirdi. Ushbu soha dastlab tizimni tahlil qilish va muhandislik sifatida tashkil etilgan bo'lib, IEEE tomonidan tan olingan. Bellmanning dinamik dasturlashdagi hissasi optimallashtirish masalasini rekursiv shaklda qayta tuzadigan dinamik dasturlash nazariyasining markaziy natijasi bo'lgan Bellman tenglamasi sarlavhasida abadiylashtirildi. "Dinamik dasturlash" iborasidagi "dasturlash" so'zining aslida "an'anaviy" dasturlash (yozish kodi) bilan deyarli hech qanday aloqasi yo'q va "optimallashtirish" so'zi bilan sinonim bo'lgan "matematik dasturlash" iborasida bo'lgani kabi mantiqan to'g'ri keladi. Shuning uchun, bu yerda "dastur" so'zi muammoning yechimini topish uchun harakatlarning maqbul ketma-ketligini anglatadi. Masalan, ko'rgazmadagi tadbirlarning ma'lum bir jadvalini ba'zan dastur deb atashadi. Bu holda dastur voqealarning qabul qilinadigan ketma-ketligi sifatida tushuniladi. Dinamik dasturlashdagi maqbul ichki tuzilish degani, dastlabki masalani hal qilish uchun kichikroq kichik muammolarni eng yaxshi yechimidan foydalanish mumkin. Masalan, grafadagi bitta tepadan (s bilan belgilangan) boshqasiga (t bilan belgilanadigan) eng qisqa yo'lni quyidagicha topish mumkin: birinchi navbatda s ga t ga tutash bo'lgan barcha tepaliklardan eng qisqa yo'lni hisoblaymiz, so'ngra s ni qo'shni tepaliklar bilan bog'laydigan qirralarning og'irliklarini hisobga olgan holda, t ga eng yaxshi yo'lni tanlang (qaysi tepalik eng yaxshi o'tish kerak). Umuman olganda, biz quyidagi uchta bosqichni bajarish orqali optimal pastki tuzilma bilan muammoni hal qilishimiz mumkin. 1.Vazifani kichikroq topshiriqlarga bo'lish. 3
2.Xuddi shu uch bosqichli algoritmga amal qilgan holda, rekursiv ravishda subproblemalarning optimal yechimini topish. 3.Dastlabki muammoning yechimini yaratish uchun avvalgi muammolarning olingan yechimidan foydalanish. Subprolemalar doimiy kichik hajmda yechilishi mumkin bo'lgan muammoning ahamiyatsiz holatiga kelguniga qadar ularni kichikroq hajmdagi kichik muammolarga va shu kabilarga bo'lish yo'li bilan hal qilinadi (javobni darhol aytish mumkin). Masalan, agar biz n! ni topishimiz kerak bo'lsa, unda ahamiyatsiz vazifa 1 ga teng! = 1 (yoki 0! = 1). Dinamik dasturlashda ustma-ust keladigan vazifalar ma'lum miqdordagi (bitta emas) kattaroq muammolarni yechish uchun ishlatiladigan subtaskalarni anglatadi (ya'ni biz bir xil narsani bir necha marta bajaramiz). 1.2 Dinamik dasturlash . Dinamik dasturlash ko‘plab amaliyotlarga ega. Bu yerda joylashgan turli xil klassik dinamik dasturlash muammolarini hal qilishga harakat qilish kerak. C ++ da dinamik dasturlash Dinamik dasturlash - bu polindrom vaqtida juda qiyin bo‘lib tuyulishi mumkin bo‘lgan muammolarni hal qilishning kuchli texnikasi. Dinamik dasturlash paradigmasiga asoslangan algoritmlar C++ning ko‘plab sohalarida, shu jumladan sun'iy intellektdagi ko‘plab misollarda qo‘llaniladi (rejalashtirish muammolarini hal qilishdan ovozni tanib olishga qadar). Umuman olganda, dinamik dasturlashning asosiy maqsadi - ma'lum bir muammoli, masalaning turli qismlarini (pastki muammolarni) yechish, so‘ngra umumiy echimga erishish uchun pastki muammolarning keshlangan yechimlaridan foydalanish. Dinamik dasturlashning qo’llanilishi - dinamik dasturlash yordamida yechilishi mumkin bo‘lgan muammolar quyidagi ikkita asosiy xususiyatga ega: 4
1. Ustma-ust keladigan muammolar 2. Optimal pastki tuzilma 1) ustma-ust keladigan muammolar: Ustma-ust tushadigan subproblemalar - bu muammoni bir necha marta ishlatiladigan subproblemlarga ajratish mumkin bo‘lgan xususiyat. Dinamik dasturlash asosan bir xil pastki muammolarning yechimlari qayta- qayta kerak bo‘lganda ishlatiladi. Dinamik dasturlashda subproblemlarga hisoblangan yechimlar massivda saqlanadi, shunda ularni qayta hisoblash shart emas. Shunday qilib, dinamik dasturlash bir-birining ustiga chiqadigan subproblemlar bo‘lmagan taqdirda foydali bo‘lmaydi, chunki yechimlarni qayta saqlash zarurati yo‘q. 2) Optimal pastki tuzilma - bu asl muammoning optimal yechimini uning pastki masalalarining optimal yechimlaridan samarali ravishda qurish mumkin bo‘lgan xususiyatdir. Dinamik dasturlash kichik muammolarni yechish va katta muammoga yechimni tezroq hisoblash uchun ushbu subproblemalarning natijalaridan foydalanish orqali ishlaydi. Bo‘lish va zabt etish paradigmasidan farqli o‘laroq (bunda pastki muammolarni echish g'oyasi ham qo‘llaniladi), dinamik dasturlash odatda kichik qismni emas, balki barcha mumkin bo‘lgan kichik muammolarni echishni o‘z ichiga oladi. Ko‘pincha, dinamik dasturlash algoritmlari "massivni to‘ldirish" sifatida tasavvur qilinadi, bu yerda massivning har bir elementi subproblem natijasi bo‘lib, keyinchalik qayta hisoblanmasdan, balki qayta ishlatilishi mumkin. Fibonachchi raqamlarini hisoblash usullaridan biri bu haqiqatdan foydalanishdir , 1 fibonacci (n) = fibonacci (n-1) + fibonacci (n-2) va keyin kabi rekursiv funktsiyani yozing : int fibonacci(int n) { if (n == 0) { return 0; } if(n == 1) 5