Ciri -ciri pengaturcaraan dinamik, contoh, kelebihan, kelemahan

Ciri -ciri pengaturcaraan dinamik, contoh, kelebihan, kelemahan

The Pengaturcaraan dinamik Ini adalah model algoritma yang menyelesaikan masalah yang rumit dengan membahagikannya menjadi subproblem, menyimpan hasilnya untuk mengelakkan harus mengira hasil tersebut.

Program ini digunakan apabila masalah dapat dibahagikan kepada subproblem yang sama, sehingga hasilnya dapat digunakan semula. Bagi majoriti, program ini digunakan untuk pengoptimuman.

Pengaturcaraan dinamik. Subproblem yang ditapis dalam penggantian Fibonacci. Sumber: Wikimedia Commons, di: Pengguna: Dcoatzee, dikesan oleh Pengguna: Domain Stannered / Awam

Sebelum menyelesaikan subproblema yang ada, algoritma dinamik akan cuba memeriksa hasil subproblem yang telah diselesaikan sebelumnya. Penyelesaian subproblem digabungkan untuk mencapai penyelesaian terbaik.

Daripada mengira subproblema yang sama sekali lagi, penyelesaian anda dapat disimpan dalam ingatan, ketika pertama kali bertemu dengan subproblema ini. Apabila ia muncul lagi semasa penyelesaian subproblem lain, penyelesaian yang telah disimpan dalam ingatan akan diambil.

Ini adalah idea yang indah untuk membetulkan masa dengan ingatan, di mana apabila menggunakan ruang tambahan, anda dapat memperbaiki masa yang diperlukan untuk mencari penyelesaian.

[TOC]

Ciri -ciri pengaturcaraan dinamik

Ciri -ciri penting berikut adalah masalah yang boleh digunakan untuk pengaturcaraan dinamik:

Substruktur optimum

Ciri ini menyatakan bahawa masalah pengoptimuman dapat diselesaikan dengan menggabungkan penyelesaian optimum masalah sekunder yang membuatnya. Substruktur yang optimum ini digambarkan oleh rekursi.

Sebagai contoh, dalam graf substruktur yang optimum akan dibentangkan pada laluan terpendek yang pergi dari puncak ke puncak T:

Iaitu, pada laluan terpendek ini, anda boleh mengambil mana -mana puncak pertengahan i. Jika R benar -benar laluan terpendek, maka ia boleh dibahagikan kepada subrutas R1 (dari S ke I) dan R2 (dari I ke T), supaya ini adalah laluan terpendek di antara simpang yang sepadan.

Oleh itu, untuk mencari laluan terpendek, anda boleh merumuskan penyelesaian secara rekursif, iaitu algoritma Floyd-Warshall.

Subproblem superimposed

Ruang subproblem mesti kecil. Iaitu, mana -mana algoritma rekursif yang menyelesaikan masalah mesti menyelesaikan subproblem yang sama berulang kali, bukannya menghasilkan subproblem baru.

Sebagai contoh, untuk menghasilkan siri Fibonacci, formulasi rekursif ini boleh dipertimbangkan: Fn = F (N-1) + F (N-2), mengambil sebagai kes asas yang F1 = F2 = 1. Maka anda perlu: F33 = F32 + F31, dan F32 = F31 + F30.

Seperti yang dapat dilihat, F31 sedang diselesaikan dalam sub -season rekursif kedua -dua F33 dan F32. Walaupun jumlah subproblem sangat kecil, jika penyelesaian rekursif diterima pakai kerana ini akan menyelesaikan masalah yang sama sekali lagi dan lagi.

Boleh melayani anda: 7 komponen sistem maklumat

Ini diambil kira oleh pengaturcaraan dinamik, jadi ia menyelesaikan setiap subproblem sekali sahaja. Ini dapat dicapai dalam dua cara:

Pendekatan teratas

Sekiranya penyelesaian kepada sebarang masalah boleh dirumuskan secara rekursif menggunakan penyelesaian subproblem mereka, dan jika subproblem ini bertindih, maka penyelesaian kepada subproblem dapat dengan mudah diakui atau disimpan dalam jadual dalam jadual.

Setiap kali penyelesaian subproblema baru dicari, ia akan dikaji semula dalam jadual jika diselesaikan sebelumnya. Sekiranya penyelesaian disimpan, ia akan digunakan dan bukannya mengira lagi. Jika tidak, subproblema akan diselesaikan, menyimpan penyelesaian dalam jadual.

Pendekatan menaik

Selepas penyelesaian masalah dirumuskan secara rekursif dari segi subproblemenya, masalahnya boleh dicuba di atas: pertama mereka akan cuba menyelesaikan subproblem dan menggunakan penyelesaian mereka untuk mencapai penyelesaian kepada subproblem terbesar.

Ini juga biasanya dilakukan dalam bentuk jadual, menghasilkan penyelesaian berulang kepada subproblem yang semakin besar dengan menggunakan penyelesaian kepada subproblem kecil. Sebagai contoh, jika nilai f31 dan f30 sudah diketahui, nilai f32 dapat dikira secara langsung.

Perbandingan dengan teknik lain

Kepunyaan masalah yang dapat diselesaikan oleh pengaturcaraan dinamik adalah bahawa ia sepatutnya mempunyai subproblem bertindih. Inilah yang membezakan pengaturcaraan dinamik teknik membahagikan dan menaklukkan, di mana tidak perlu menyimpan nilai yang paling mudah.

Ia serupa dengan rekursi, kerana dengan mengira kes asas, nilai akhir dapat ditentukan secara induktif. Pendekatan menaik ini berfungsi dengan baik apabila nilai baru hanya bergantung pada nilai yang dikira sebelumnya.

Contoh

Langkah minimum untuk mencapai 1

Untuk mana -mana nombor keseluruhan positif "E", anda boleh melakukan mana -mana tiga langkah berikut.

- Tolak 1 dari nombor. (E = E-1).

- Sekiranya dibahagikan dengan 2, ia dibahagikan dengan 2 (jika e%2 == 0, maka E = E/2).

- Sekiranya dibahagikan dengan 3, ia dibahagikan dengan 3 (jika e%3 == 0, maka E = E/3).

Berdasarkan langkah -langkah sebelumnya, anda mesti mencari jumlah minimum langkah -langkah ini untuk diambil dan 1. Sebagai contoh:

- Jika E = 1, hasilnya: 0.

- Jika E = 4, hasilnya: 2 (4/2 = 2/2 = 1).

- Bila E = 7, Hasil: 3 (7-1 = 6/3 = 2/2 = 1).

Pendekatan

Anda mungkin selalu berfikir tentang memilih langkah yang menjadikan n serendah mungkin dan terus seperti ini, sehingga mencapai 1. Walau bagaimanapun, dapat dilihat bahawa strategi ini tidak berfungsi di sini.

Boleh melayani anda: perisian komersial

Sebagai contoh, jika E = 10, langkah-langkahnya ialah: 10/2 = 5-1 = 4/2 = 2/2 = 1 (4 langkah). Walau bagaimanapun, cara yang optimum ialah: 10-1 = 9/3 = 3/3 = 1 (3 langkah). Oleh itu, semua langkah yang mungkin dibuat untuk setiap nilai n mesti dibuktikan, memilih jumlah minimum kemungkinan ini.

Semuanya bermula dengan rekursi: f (e) = 1 + min f (e-1), f (e/2), f (e/3) jika e> 1, mengambil sebagai kes asas: f (1 ) = 0. Mempunyai persamaan berulang, anda boleh mula mengodkan rekursi.

Walau bagaimanapun, dapat diperhatikan bahawa ia mempunyai subproblem yang ditumpukan. Di samping itu, penyelesaian optimum untuk input yang diberikan bergantung kepada penyelesaian optimum subproblemenya.

Seperti dalam hafalan, di mana penyelesaian subproblem yang diselesaikan disimpan untuk menggunakannya kemudian. Atau seperti dalam pengaturcaraan dinamik, ia bermula dari bawah, memajukan e yang diberikan. Seterusnya, kedua -dua kod:

Hafalan

Pengaturcaraan ke atas dinamik

Kelebihan

Salah satu kelebihan utama menggunakan pengaturcaraan dinamik ialah mempercepatkan pemprosesan, kerana rujukan yang dikira sebelum ini digunakan. Seperti teknik pengaturcaraan rekursif, ia mengurangkan garis kod program.

Vorace Algoritmos vs Pengaturcaraan Dinamik

Algoritma Voracious serupa dengan pengaturcaraan dinamik dalam erti kata bahawa kedua -duanya adalah alat untuk pengoptimuman. Walau bagaimanapun, algoritma Voraz mencari penyelesaian yang optimum dalam setiap langkah tempatan. Iaitu, ia mencari pilihan tamak dengan harapan mencari optimum global.

Oleh itu, algoritma yang luar biasa dapat membuat anggapan yang kelihatan optimum pada masa itu, tetapi itu menjadi mahal pada masa akan datang dan tidak menjamin optimum global.

Sebaliknya, pengaturcaraan dinamik mendapati penyelesaian optimum untuk subproblem dan kemudian membuat pilihan yang tepat dengan menggabungkan hasil subproblem tersebut untuk benar -benar mencari penyelesaian yang paling optimum.

Kekurangan

- Banyak ingatan diperlukan untuk menyimpan hasil yang dikira dari setiap subproblem, tanpa dapat memastikan nilai yang disimpan akan digunakan atau tidak.

- Berkali -kali, nilai output disimpan tanpa pernah digunakan dalam subproblem berikut semasa pelaksanaan. Ini membawa kepada penggunaan memori yang tidak perlu.

- Dalam pengaturcaraan dinamik fungsi dipanggil rekursif. Ini menjadikan memori bateri kekal meningkat.

Pengaturcaraan vs pengaturcaraan dinamik

Sekiranya anda mempunyai memori terhad untuk melaksanakan kod dan kelajuan pemprosesan tidak membimbangkan, rekursif boleh digunakan. Sebagai contoh, jika aplikasi mudah alih sedang dibangunkan, ingatan sangat terhad untuk melaksanakan aplikasi.

Boleh melayani anda: Peranti campuran: Ciri dan contoh

Sekiranya program ini dikehendaki dilaksanakan dengan lebih cepat dan tidak ada sekatan memori, lebih baik menggunakan pengaturcaraan dinamik.

Aplikasi

Pengaturcaraan Dinamik adalah kaedah yang berkesan untuk menyelesaikan masalah yang mungkin kelihatan sangat sukar untuk diselesaikan dalam masa yang munasabah.

Algoritma berdasarkan paradigma pengaturcaraan dinamik digunakan di banyak bidang sains, termasuk banyak contoh kecerdasan buatan, dari resolusi masalah perancangan untuk pengiktirafan suara.

Algoritma pengaturcaraan dinamik

Pengaturcaraan dinamik agak berkesan dan berfungsi dengan baik untuk pelbagai masalah. Banyak algoritma dapat dilihat sebagai aplikasi algoritma yang penuh semangat, seperti:

- Siri nombor Fibonacci.

- Menara Hanoi.

- Semua laluan laluan terpendek oleh Floyd-Warshall.

- Beg galas.

- Pengaturcaraan Projek.

- Jalan terpendek oleh Dijkstra.

- Kawalan dan Kawalan Penerbangan Robotik.

- Masalah pengoptimuman matematik.

- Masa Dikongsi: Program kerja untuk memaksimumkan penggunaan CPU.

Siri nombor Fibonacci

Nombor Fibonacci adalah nombor yang terdapat dalam urutan berikut: 0, 1, 1, 3, 5, 8, 13, 21, 34, 55, 89, 144, dll.

Dalam terminologi matematik, penggantian Fn fibonacci ditakrifkan oleh formula berulang: f (n) = f (n -1) + f (n -2), di mana f (0) = 0 dan f (1) = 1.

Pendekatan teratas

Dalam contoh ini, matriks carian dengan semua nilai awal diasaskan dengan -1. Setiap kali penyelesaian kepada subproblem diperlukan, ia akan dicari dalam matriks carian ini.

Sekiranya terdapat nilai yang dikira, nilai itu akan dikembalikan. Jika tidak, hasilnya akan dikira untuk menyimpannya dalam matriks carian dan dengan itu dapat menggunakannya kemudian.

Pendekatan menaik

Dalam kes ini, untuk siri Fibonacci yang sama, F (0), kemudian F (1), F (2), F (3), dan sebagainya dikira terlebih dahulu. Oleh itu, penyelesaian subproblem dari bawah akan dibina.

Rujukan

  1. Vineet Choudhary (2020). Pengenalan kepada Pengaturcaraan Dinamik. Orang dalam yang tidak berpengalaman.Diambil dari: DevelopterInsider.co.
  2. Alex Allain (2020). Pengaturcaraan dinamik dalam c++. Pengaturcaraan c. Diambil dari: cprogrammming.com.
  3. Selepas Akademi (2020). Idea pengaturcaraan dinamik. Diambil dari: Afteracademy.com.
  4. Aniruddha Chaudhari (2019). Pengaturcaraan dan rekursi dinamik | Berbeza. Stack CSE. Diambil dari: CSESTACK.org.
  5. Kod Chef (2020). Untuk tutorial pengaturcaraan dinamik. Diambil dari: codhef.com.
  6. Programiz (2020). Pengaturcaraan dinamik. Diambil dari: Programz.com.