Anda di halaman 1dari 15

APLIKASI RELASI REKURSIF

Disusun untuk Memenuhi Tugas Marematika Diskrit Pendidikan Matematika

Dosen Pengampu : Dr. Tri Sri Noor Asih, S.si., M.si.

Disusun Oleh:

Kelompok 5

Krisno Budi Prasetyo (0401518056)

Mei Astuti (0401518058)

Sumayani (0401518061)

Rombel A3 Reguler

PROGRAM STUDI PENDIDIKAN MATEMATIKA

PASCASARJANA

UNIVERSITAS NEGERI SEMARANG

2019
CHAPTER 8
Teknik Penghitungan Tingkat lanjut

Banyak masalah penghitungan tidak dapat dipecahkan dengan mudah


menggunakan metode yang dibahas dalam Bab 6.Salah satu masalah tersebut
adalah: Berapa banyak panjang bit string tidak mengandung dua nol berturut-
turut? Untuk mengatasi masalah ini, biarkan 𝑎𝑛 sejumlah string panjang tersebut
𝑛. Argumen dapat diberikan yang menunjukkan bahwa urutan {𝑎𝑛 } memenuhi
relasi perulangan 𝑎𝑛+1 = 𝑎𝑛 + 𝑎𝑛−1 dan kondisi awal 𝑎1 = 2 dan 𝑎2 = 3. Relasi
perulangan ini dan kondisi awal menentukan urutan {𝑎𝑛 }. Selain itu, rumus
eksplisit dapat ditemukan untuk dari persamaan yang menghubungkan istilah-
istilah urutan. Seperti yang akan kita lihat, teknik yang sama dapat digunakan
untuk menyelesaikan berbagai jenis masalah penghitungan.
Kami akan membahas dua cara bahwa hubungan perulangan memainkan
peran penting dalam studi algoritma. Pertama, kami akan memperkenalkan
paradigma algoritme penting yang dikenal sebagai pemrograman dinamis.
Algoritma yang mengikuti paradigma ini memecah masalah menjadi subproblem
yang tumpang tindih. Solusi untuk masalah ini kemudian ditemukan dari solusi
untuk subproblem melalui penggunaan relasi perulangan. Kedua, kita akan
mempelajari paradigma algoritmik penting lainnya, divide-and-conquer.
Algoritma yang mengikuti paradigma ini dapat digunakan untuk memecahkan
masalah dengan secara rekursif memecahnya menjadi sejumlah subproblem yang
tidak tumpang tindih sampai masalah ini dapat diselesaikan secara langsung.
Kompleksitas dari algoritma tersebut dapat dianalisis dengan menggunakan jenis
khusus dari hubungan perulangan. Dalam bab ini kita akan membahas berbagai
algoritma divide-and-menaklukkan dan menganalisis kompleksitas mereka
menggunakan hubungan perulangan.
Kita juga akan melihat bahwa banyak masalah penghitungan dapat
diselesaikan dengan menggunakan rangkaian daya formal, yang disebut fungsi
pembangkit, di mana koefisien kekuatan x mewakili syarat-syarat dari urutan
yang kita minati. Selain menyelesaikan masalah penghitungan, kita juga akan
dapat menggunakan pembangkit fungsi untuk memecahkan hubungan perulangan
dan untuk membuktikan identitas kombinatorial.
Banyak jenis masalah penghitungan lainnya tidak dapat diselesaikan dengan
menggunakan teknik yang dibahas pada Bab 6, seperti: Berapa banyak cara untuk
menetapkan tujuh pekerjaan menjadi tiga karyawan sehingga setiap karyawan
ditugaskan setidaknya satu pekerjaan? Berapa banyak bilangan prima yang ada
kurang dari 1000? Kedua masalah ini dapat diselesaikan dengan menghitung
jumlah elemen dalam penyatuan set. Kami akan mengembangkan teknik, yang
disebut prinsip inklusi-eksklusi, yang menghitung jumlah elemen dalam gabungan
set, dan kami akan menunjukkan bagaimana prinsip ini dapat digunakan untuk
memecahkan masalah penghitungan.
Teknik yang dipelajari dalam bab ini, bersama dengan teknik dasar Bab 6,
dapat digunakan untuk memecahkan banyak masalah penghitungan.

8.1 Aplikasi Relasi Rekursif


Pengenalan
Ingat kembali dari Bab 2 bahwa definisi rekursif dari urutan menentukan
satu atau lebih istilah awal dan aturan untuk menentukan istilah selanjutnya dari
yang mendahuluinya. Juga, ingatlah bahwa aturan dari jenis yang terakhir (apakah
itu merupakan bagian dari definisi rekursif atau tidak) disebut relasi perulangan
dan bahwa sekuens disebut solusi relasi perulangan jika persyaratannya
memenuhi relasi perulangan.
Pada bagian ini kami akan menunjukkan bahwa hubungan seperti itu dapat
digunakan untuk mempelajari dan memecahkan masalah penghitungan. Sebagai
contoh, anggaplah bahwa jumlah bakteri dalam suatu koloni berlipat ganda setiap
jam. Jika sebuah koloni dimulai dengan lima bakteri, berapa banyak yang akan
ada dalam n jam? Untuk mengatasi masalah ini, menjadi 𝑎𝑛 jumlah bakteri pada
akhir 𝑛 jam. Karena jumlah bakteri berlipat ganda setiap jam, hubungan yang
dimiliki 𝑎𝑛 = 2𝑎𝑛−1 setiap kali 𝑛 adalah bilangan bulat positif. Relasi perulangan
ini, bersama dengan kondisi awal 𝑎0 = 5, secara unik menentukan 𝑎𝑛 untuk
semua bilangan bulat non-negatif 𝑛. Kita dapat menemukan formula untuk 𝑎𝑛
menggunakan pendekatan iteratif yang diikuti pada Bab 2, yaitu bahwa 𝑎𝑛 =
5. 2𝑛 untuk semua 𝑛 bilangan bulat tidak negatif.
Beberapa masalah penghitungan yang tidak dapat dipecahkan dengan
menggunakan teknik yang dibahas pada Bab 6 dapat diselesaikan dengan
menemukan hubungan pengulangan yang melibatkan ketentuan urutan, seperti
yang dilakukan dalam masalah yang melibatkan bakteri. Pada bagian ini kita akan
mempelajari berbagai masalah penghitungan yang dapat dimodelkan
menggunakan hubungan perulangan. Dalam Bab 2 kami mengembangkan metode
untuk memecahkan hubungan perulangan tertentu. Dalam Bagian 8.2 kita akan
mempelajari metode untuk menemukan rumus eksplisit untuk persyaratan urutan
yang memenuhi jenis hubungan perulangan tertentu.

Kami menyimpulkan bagian ini dengan memperkenalkan paradigma


algoritmik pemrograman dinamis. Setelah menjelaskan bagaimana paradigma ini
bekerja, kami akan menggambarkan penggunaannya dengan sebuah contoh.

8.1.1 Pemodelan Dengan Hubungan Berulang

Kita dapat menggunakan hubungan perulangan untuk memodelkan berbagai


masalah, seperti menemukan bunga majemuk (lihat Contoh 11 dalam Bagian2.4),
menghitung kelinci di sebuah pulau, menentukan banyaknya perpindahan di Teka-
teki Menara Hanoi, dan menghitung string bit dengan properti tertentu.
Contoh 1 menunjukkan bagaimana populasi kelinci di suatu pulau dapat
dimodelkan menggunakan hubungan perulangan

CONTOH 1
Kelinci dan Deret Fibonacci : Pertimbangkan masalah ini, yang pada
awalnya diajukan oleh Leonardo Pisano, juga dikenal sebagai Fibonacci, pada
abad ketiga belas dalam bukunya Liber abaci. Sepasang kelinci muda (satu dari
setiap jenis kelamin) ditempatkan di sebuah pulau. Sepasang kelinci tidak
berkembang biak sampai mereka berumur 2 bulan. Setelah mereka berumur 2
bulan, setiap pasangan kelinci menghasilkan pasangan lain setiap bulan, seperti
yang ditunjukkan pada Gambar 1. Temukan hubungan perulangan untuk jumlah
pasangan kelinci di pulau setelah n bulan, dengan asumsi bahwa tidak ada kelinci
yang pernah mati.

Solusi:
Diterangkan oleh 𝑓𝑛 jumlah pasangan kelinci setelah 𝑛 bulan. Kami akan
menunjukkan bahwa 𝑓𝑛 , 𝑛 = 1,2,3, …, adalah syarat dari deret Fibonacci.
Populasi kelinci dapat dimodelkan menggunakan hubungan perulangan.
Pada akhir bulan pertama, jumlah pasangan kelinci di pulau itu adalah 𝑓1 = 1.
Karena pasangan ini tidak berkembang biak selama bulan kedua, 𝑓2 = 1 juga.
Untuk menemukan jumlah pasangan setelah 𝑛 bulan, tambahkan nomor di pulau
bulan sebelumnya 𝑓𝑛 − 1, dan jumlah pasangan yang baru lahir, yang sama
dengan 𝑓𝑛 − 2, karena setiap pasangan yang baru lahir berasal dari pasangan yang
berumur setidaknya 2 bulan.
Akibatnya, urutan {𝑓𝑛 } memenuhi hubungan perulangan
𝑓𝑛 = 𝑓𝑛−1 + 𝑓𝑛−2
untuk 𝑛 ≥ 3 bersamaan dengan kondisi awal 𝑓1 = 1 dan 𝑓2 = 1. Karena
hubungan perulangan ini dan kondisi awal secara unik menentukan urutan ini,
jumlah pasangan kelinci di pulau setelah 𝑛 bulan diberikan oleh deret Fibonacci
ke- 𝑛.
CONTOH 2 Simulasi Menara Hanoi
Menara Hanoi: Teka-teki populer pada akhir abad ke-19 yang ditemukan
oleh ahli matematika Prancis Édouard Lucas, yang disebut Menara Hanoi, terdiri
dari tiga pasak yang dipasang di papan bersama dengan cakram dengan ukuran
berbeda. Awalnya piringan ini ditempatkan di pasak pertama dalam urutan
ukuran, dengan yang terbesar di bagian bawah (seperti yang ditunjukkan pada
Gambar 2). Aturan teka-teki memungkinkan piringan untuk dipindahkan satu per
satu dari satu pasak ke pasak lain asalkan piringan tidak pernah ditempatkan di
atas piringan yang lebih kecil. Tujuan dari teka-teki adalah untuk memiliki semua
piringan di pasak kedua dalam urutan ukuran, dengan yang terbesar di bagian
bawah.
Biarkan 𝐻𝑛 menunjukkan jumlah gerakan yang diperlukan untuk menyelesaikan
masalah Menara Hanoi dengan 𝑛 piringan. Atur relasi perulangan untuk urutan
{𝐻𝑛 }.

Solusi:
Mulailah dengan 𝑛 piringan pada pasak 1. Kita dapat mentransfer piringan 𝑛 − 1
teratas, mengikuti aturan teka-teki, ke pasak 3 menggunakan gerakan 𝐻𝑛−1 (lihat
Gambar 3 untuk ilustrasi pasak dan piringan pada titik ini) . Kami menjaga
piringan terbesar tetap selama gerakan ini. Kemudian, kami menggunakan satu
gerakan untuk mentransfer piringan terbesar ke pasak kedua. Kita dapat
mentransfer piringan 𝑛 − 1 pada pasak 3 ke pasak 2 menggunakan 𝐻𝑛−1 gerakan
tambahan, menempatkannya di atas piringan terbesar, yang selalu tetap di bagian
bawah pasak 2. Selain itu, mudah untuk melihat bahwa teka-teki tidak bisa
diselesaikan dengan menggunakan lebih sedikit tangga. Ini menunjukkan
𝐻𝑛 = 2𝐻𝑛−1 + 1
Kondisi awal adalah 𝐻1 = 1, karena satu piringan dapat ditransfer dari pasak 1
ke pasak 2, sesuai dengan aturan teka-teki, dalam satu gerakan.
Kita bisa menggunakan pendekatan rekrusif untuk menyelesaikan hubungan
rekrusif ini.

𝐻𝑛 = 2𝐻𝑛−1 + 1
𝐻𝑛 = 2(2𝐻𝑛−2 + 1) + 1 = 22 𝐻𝑛−2 + 2 + 1
= 22 (2𝐻𝑛−3 + 1) + 2 + 1 = 23 𝐻𝑛−3 + 22 + 2 + 1

= 2𝑛−1 𝐻1 + 2𝑛−2 + 2𝑛−3 + ⋯ + 2 + 1
= 2𝑛−1 + 2𝑛−2 + ⋯ + 2 + 1
= 2𝑛 − 1

Kami telah menggunakan relasi perulangan berulang kali untuk mengekspresikan


𝐻𝑛 dalam istilah sebelumnya. Di sebelah kesetaraan terakhir, kondisi awal 𝐻1 = 1
telah digunakan. Kesetaraan terakhir didasarkan pada rumus untuk jumlah istilah
deret geometri, yang dapat ditemukan dalam Teorema 1 di Bagian 2.4.

Pendekatan berulang telah menghasilkan solusi untuk hubungan pengulangan


𝐻𝑛 = 2𝐻𝑛−1 + 1 dengan kondisi awal 𝐻1 = 1. Formula ini dapat dibuktikan
menggunakan induksi matematika. Ini dibiarkan bagi pembaca sebagai Latihan 1.
Sebuah mitos yang dibuat untuk mengiringi puzzle menceritakan tentang
sebuah menara di Hanoi di mana para biksu memindahkan 64 piringan emas dari
satu pasak ke pasak yang lain, menurut aturan teka-teki. Mitos mengatakan bahwa
dunia akan berakhir ketika mereka menyelesaikan puzzle. Berapa lama setelah
para biksu memulai dunia akan berakhir jika para biksu membutuhkan satu detik
untuk memindahkan piringan?
Dari rumus eksplisit, para biksu membutuhkan

264 − 1 = 18,446,744,073,709,551,615

berpindah untuk mentransfer disk. Dengan membuat satu langkah per detik,
mereka akan membutuhkan lebih dari 500 miliar tahun untuk menyelesaikan
transfer, sehingga dunia harus bertahan beberapa saat lebih lama daripada yang
sudah ada.

Contoh 3 menggambarkan bagaimana hubungan perulangan dapat digunakan


untuk menghitung string bit yang ditentukan panjang yang memiliki properti
tertentu.

CONTOH 3 Temukan relasi rekursif dan berikan kondisi awal untuk jumlah
panjang string bit n yang tidak memiliki dua barisan 0. Berapa banyak bit string
yang panjangnya lima?

Solusi:
Misalkan 𝑎𝑛 merupakan jumlah panjang string bit n yang tidak memiliki dua
barisan 0. Untuk mendapatkan relasi rekursif untuk {an}, perhatikan bahwa
dengan aturan penjumlahan, jumlah panjang string bit n yang tidak memiliki dua
barisan 0 berturut-turut sama dengan jumlah string bit yang diakhiri dengan 0
ditambah jumlah string bit yang diakhiri dengan 1. Kita akan menganggap bahwa
n ≥ 3, sehingga bit string setidaknya memiliki tiga bit.
String bit dengan panjang n yang diakhiri dengan 1 yang tidak memiliki 2 barisan
0 adalah tepat string bit yang panjangnya n-1 yang tidak memiliki 2 barisan 0
dengan 1 ditambahkan di akhir. Karena itu, ada 𝑎𝑛−1 string bit tersebut.
String bit dengan panjang n yang diakhiri dengan 0 yang tidak memiliki dua
barisan 0 berturut-turut harus memiliki 1 sebagai bit (n - 1), Oleh karena itu
panjang string bit n berakhir dengan 0 yang tidak memiliki 2 barisan 0 adalah
panjang string bit n - 2 yang tidak memiliki 2 barisan 0 dengan 10 ditambahkan
di akhir. Akibatnya, ada 𝑎𝑛−2 string bit.
Kami menyimpulkan, seperti yang diilustrasikan dalam Gambar 4, yaitu
𝑎𝑛 = 𝑎𝑛−1 + 𝑎𝑛−2
untuk n ≥ 3.
Kondisi awal adalah 𝑎1 = 2, karena kedua bit string dengan panjang satu, 0 dan 1
yang tidak memiliki dua barisan 0 dan 𝑎2 = 3, karena string bit valid panjang dua
adalah 01, 10, dan 11. Untuk memperoleh 𝑎5 kami menggunakan relasi
perulangan tiga kali untuk menemukan yaitu
𝑎3 = 𝑎2 + 𝑎1 = 3 + 2 = 5
𝑎4 = 𝑎3 + 𝑎2 = 5 + 3 = 8
𝑎5 = 𝑎4 + 𝑎3 = 8 + 5 = 13

Jumlah string bit dengan


panjang n yang tidak
memiliki dua barisan 0

Sedikit string dengan panjang


Berakhir dengan 1 n - 1 dengan tidak memiliki 1
dua barisan 0

Sedikit string dengan panjang


Berakhir dengan 0 n - 2 dengan tidak memiliki 10
dua barisan 0

Total= 𝒂𝒏 = 𝒂𝒏−𝟏 + 𝒂𝒏−𝟐

GAMBAR 4 Menghitung String Bit Panjang n dengan tidak memiliki 2 barisan


0.
Catatan: Perhatikan bahwa {an} memenuhi relasi perulangan yang sama dengan
deret Fibonacci. Karena 𝑎1 =𝑓3 dan 𝑎2 = 𝑓4 berarti 𝑎𝑛 = 𝑓𝑛 + 2.

Contoh 4 menunjukkan bagaimana relasi perulangan dapat digunakan untuk


memodelkan jumlah codeword yang diizinkan menggunakan pemeriksaan
validitas tertentu.

CONTOH 4 Enumerasi Codeword Suatu sistem komputer menganggap string


angka desimal yang valid codeword jika berisi angka 0 pada digit genap.
Misalnya, 1230407869 valid, sedangkan 120987045608 tidak valid. Misalkan 𝑎𝑛
menjadi jumlah codeword n-digit yang valid. Temukan relasi rekursif untuk 𝑎𝑛 ..

Solusi:
Perhatikan bahwa 𝑎1 = 9 karena ada 10 digit setiap stringnya, dan hanya satu
tidak valid, yaitu string 0. Relasi rekursif dapat diturunkan untuk urutan ini
dengan mempertimbangkan caranya string n-digit yang valid dapat diperoleh dari
string n - 1 digit. Ada dua cara untuk membentuk string yang valid dengan n digit
dari string dengan satu digit lebih sedikit.
Pertama, string n digit yang valid dapat diperoleh dengan menambahkan string n -
1 digit yang valid dengan angka selain 0. Penambahan ini dapat dilakukan dalam
sembilan cara. Oleh karena itu, string yang valid dengan n digit dapat dibentuk
dengan cara ini dalam 9𝑎𝑛 − 1 cara.
Kedua, string n digit yang valid dapat diperoleh dengan menambahkan 0 ke string
dengan panjang n - 1 yang tidak valid. (Ini menghasilkan string dengan angka 0
digit karena string panjang tidak valid n - 1 memiliki jumlah ganjil 0 digit.)
banyaknya cara yang dapat dilakukan sama dengan jumlah string -digit yang
tidak valid (n - 1). Karena ada 10𝑛−1 string panjang n-1 dan 𝑎𝑛−1
valid, ada 10𝑛−1 − 𝑎𝑛−1 valid n -digit string yang diperoleh dari menambahkan
string dengan panjang n – 1yang tidak valid dengan 0.
Karena semua string valid panjang n diproduksi dalam salah satu dari dua cara ini,
maka hal itu mengikuti ada
𝑎𝑛 = 9𝑎𝑛−1 + (10𝑛−1 − 𝑎𝑛−1 )
= 8𝑎𝑛−1 + 10𝑛−1

string panjang yang valid n .

Contoh 5 menetapkan hubungan rekursif yang muncul dalam banyak konteks


yang berbeda.

CONTOH 5 Temukan relasi rekursif untuk Cn , banyak cara untuk


mengurungkan produk dari n + 1 angka, 𝑥0 , 𝑥1 , 𝑥2 , … . 𝑥𝑛 , untuk menentukan
urutan perkalian. Misalnya, 𝐶3 =5 karena ada lima cara untuk
mengurungkan 𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 untuk menentukan urutan perkalian:
((𝑥0 . 𝑥1 ). 𝑥2 ). 𝑥3 (𝑥0 .(𝑥1 .𝑥2 )). 𝑥3 (𝑥0 . 𝑥1 ). (𝑥2 . 𝑥3 )
𝑥0 . ((𝑥1.𝑥2 ). 𝑥3 ) 𝑥0 . (𝑥1 . (𝑥2 . 𝑥3 ))

Solusi:
Untuk mengembangkan relasi rekursif untuk Cn , kami mencatat bahwa
bagaimanapun kami menyisipkan tanda kurung dalam produk 𝑥0 , 𝑥1 , 𝑥2 , … . 𝑥𝑛 ,
satu operator “ · ” tetap berada di luar semua tanda kurung yaitu, operator untuk
perkalian akhir yang akan dilakukan. [Misalnya, dalam (𝑥0 .(𝑥1 .𝑥2 )). 𝑥3 , itu
adalah " · " terakhir, sementara di (𝑥0 . 𝑥1 ). (𝑥2 . 𝑥3 ) itu adalah " · " kedua .]
Operator terakhir ini muncul antara dua dari n + 1 angka, katakanlah, 𝑥𝑘
dan 𝑥𝑘+1. Ada 𝐶𝑘 𝐶𝑛−𝑘−1 cara untuk memasukkan kurung untuk menentukan
urutan nomor n +1 yang akan dikalikan saat operator terakhir muncul di
antara 𝑥𝑘 dan 𝑥𝑘+1 , karena ada 𝐶𝑘 cara menyisipkan tanda kurung di
dalam produk 𝑥0 , 𝑥1 , 𝑥2 , … . 𝑥𝑘 untuk menentukan urutan nomor k + 1 ini akan
dikalikan dan 𝐶𝑛−𝑘−1 cara memasukkan tanda kurung ke dalam
produk 𝑥𝑘+1 , 𝑥𝑘+2 , … . . 𝑥𝑛 untuk menentukan urutan nomor n - k ini
akan dikalikan. Karena operator akhir ini bisa muncul di antara dua dari n + 1
angka, maka
𝐶𝑛 = 𝐶0 𝐶𝑛−1 + 𝐶1 𝐶𝑛−2 + ⋯ + 𝐶𝑛−2 𝐶1 + 𝐶𝑛−1 𝐶0
𝑛−1

∑ 𝐶𝑘 𝐶𝑛−𝑘−1
𝑘=0

Perhatikan bahwa kondisi awal adalah 𝐶0 = 1 dan 𝐶1 = 1.

Algoritma dan Hubungan Perulangan

Relasi Rekrusif memainkan peran penting dalam banyak aspek studi


tentang algoritma dan mereka kompleksitas. Dalam Bagian 8.3, kami akan
menunjukkan bagaimana hubungan pengulangan dapat digunakan untuk
menganalisis kompleksitas algoritma divide-and-conquer, seperti algoritma sortge
gabungan yang diperkenalkan di Bagian 5.4. Seperti yang akan kita lihat di
Bagian 8.3, algoritma divide-and-menaklukkan membagi secara a masalah
menjadi tetap jumlah submasalah tidak tumpang tindih sampai mereka menjadi
cukup sederhana untuk menyelesaikan secara langsung. Kami menyimpulkan
bagian ini dengan memperkenalkan paradigma algoritmik lain yang
dikenal sebagai pemrograman dinamis , yang dapat digunakan untuk
menyelesaikan banyak masalah optimasi secara efisien.
Algoritma mengikuti paradigma pemrograman dinamis ketika secara
rekursif rusak masalah menjadi subproblem tumpang tindih yang lebih sederhana ,
dan menghitung solusi menggunakan solusi dari submasalah . Umumnya,
hubungan perulangan digunakan untuk mencari solusi secara keseluruhan dari
solusi submasalah. Pemrograman dinamis telah digunakan untuk menyelesaikan
masalah penting masalah di berbagai bidang seperti ekonomi, visi komputer,
pengenalan suara, buatan kecerdasan, grafik komputer, dan bio informatika. Pada
bagian ini kami akan menggambarkan penggunaan pemrograman dinamis dengan
membangun algoritma untuk menyelesaikan masalah
penjadwalan. Sebelum dengan melakukan itu, kita akan mengaitkan asal usul
dari pemrograman dinamis nama , yang diperkenalkan oleh ahli matematika
Richard Bellman pada 1950-an. Bellman sedang bekerja di RAND Corporation
pada proyek untuk militer AS, dan pada saat itu, Sekretaris AS Pertahanan
bermusuhan dengan penelitian matematika.Bellman memutuskan untuk
memastikan pendanaan, dia membutuhkan nama yang tidak mengandung kata
matematika untuk metodenya untuk menyelesaikan penjadwalan dan masalah
perencanaan. Dia memutuskan untuk menggunakan kata sifat dinamis karena,
ketika dia berkata "itu tidak mungkin untuk menggunakan kata dinamis dalam arti
merendahkan ”dan dia berpikir bahwa pemrograman dinamis adalah "Sesuatu
yang bahkan seorang anggota Kongres tidak bisa keberatan."

Contoh Dinamis Programing


Masalah yang kami gunakan untuk menggambarkan dinamis pemrograman
berhubungan dengan masalah yang dipelajari dalam Contoh 7 pada Bagian
3.1. Dalam masalah itu tujuan kami adalah menjadwalkan sebanyak mungkin
pembicaraan dalam satu ruang kuliah. Pembicaraan ini waktu mulai dan akhir
yang telah ditetapkan; sekali pembicaraan dimulai, itu berlanjut sampai
berakhir; tidak ada dua pembicaraan yang bisa dilanjutkan pada waktu
bersamaan; dan pembicaraan dapat dimulai pada saat yang sama yang lain
berakhir. Kami mengembangkan a algoritma greedy yang selalu menghasilkan
jadwal optimal, seperti yang kami buktikan pada Contoh 12 di Bagian
5.1. Sekarang anggaplah bahwa tujuan kita bukan untuk menjadwalkan
pembicaraan sebanyak mungkin, tetapi untuk memiliki kemungkinan kehadiran
gabungan terbesar dari pembicaraan terjadwal.

Kami mengandaikan masalah ini dengan kita memiliki n pembicaraan, di mana


pembicaraan j dimulai pada waktu tj , berakhir pada waktu ej , dan akan dihadiri
oleh wj siswa. Kami ingin jadwal yang maksimal jumlah total siswa yang
hadir. Artinya, kami ingin menjadwalkan subset pembicaraan untuk
memaksimalkan jumlah wj atas semua pembicaraan yang
dijadwalkan. (Perhatikan bahwa ketika seorang siswa menghadiri lebih dari satu
ceramah, ini siswa dihitung berdasarkan jumlah pembicaraan yang dihadiri.)
Kami dilambangkan dengan T(j) maksimum Jumlah total peserta untuk jadwal
optimal dari pembicaraan j pertama, sehingga T (n) adalah maksimal yang Jumlah
total peserta untuk jadwal optimal untuk semua n pembicaraan.

Kami pertama-tama mengurutkan pembicaraan untuk meningkatkan waktu


akhir. Setelah melakukan ini, kami memberi nomor baru pada yang berbicara
sehingga e 1 ≤ e 2 ≤ · · · ≤ id. Kami mengatakan bahwa dua
pembicaraan kompatibel jika mereka dapat menjadi bagian dari jadwal yang
sama, yaitu, jika waktu yang dijadwalkan tidak tumpang tindih (selain dari
kemungkinan satu berakhir dan yang lainnya dimulai pada waktu yang
sama). Kami mendefinisikan p ( j) sebagai bilangan bulat terbesar i , i <j , untuk
itu ei ≤ sj , jika bilangan bulat seperti itu ada, dan p (j) = 0 sebaliknya. Artinya,
bicara p (j) adalah bicara akan berakhir terakhir di antara pembicaraan yang
kompatibel dengan pembicaraan j yang berakhir sebelum pembicaraan j berakhir,
jika pembicaraan seperti itu ada, dan p (j) = 0 jika tidak ada pembicaraan seperti
itu.
CONTOH 6 Pertimbangkan tujuh pembicaraan dengan waktu mulai dan waktu
akhir ini, seperti yang diilustrasikan dalam Gambar 5.
Bicara 1: mulai jam 8 pagi, akhir jam 10 pagi
Bicara 2: mulai jam 9 pagi, akhir jam 11 pagi
Bicara 3: mulai 10:30 pagi, akhiri 12 siang
Bicara 4: mulai jam 9:30 pagi, akhiri jam 1 siang
Bicara 5: mulai jam 8:30 pagi, akhiri jam 2 siang
Bicara 6: mulai jam 11 pagi, akhiri jam 2 siang
Bicara 7: mulai jam 1 siang, akhiri jam 2 siang
Temukan p ( j) untuk j = 1 , 2 ,. . . , 7.

Solusi:
Kami memiliki p ( 1 ) = 0 dan p ( 2 ) = 0, karena tidak ada pembicaraan yang
berakhir sebelum salah satu dari dua yang pertama pembicaraan dimulai. Kami
memiliki p ( 3 ) = 1 karena bicara 3 dan bicara 1 kompatibel, tetapi bicara 3 dan
bicara 2 tidak kompatibel; p ( 4 ) = 0 karena pembicaraan 4 tidak kompatibel
dengan pembicaraan 1, 2, dan 3; p ( 5 ) = 0 karena pembicaraan 5 tidak
kompatibel dengan pembicaraan 1, 2, 3, dan 4; dan p ( 6 ) = 2 karena bicara 6
dan bicara 2 kompatibel, tetapi bicara 6 tidak kompatibel dengan pembicaraan 3,
4, dan 5. Akhirnya, p ( 7 ) = 4, karena bicara 7 dan bicara 4 kompatibel, tetapi
bicara 7 tidak kompatibel dengan keduanya pembicaraan 5 atau 6.

Untuk mengembangkan algoritma pemrograman dinamis untuk masalah ini,


pertama-tama kita mengembangkan kunci hubungan perulangan. Untuk
melakukan ini, perhatikan terlebih dahulu bahwa jika j ≤ n , ada dua kemungkinan
untuk optimal jadwal pembicaraan j pertama (ingat bahwa kita mengasumsikan
bahwa n pembicaraan yang diperintahkan oleh meningkatnya waktu
selesai): (i) bicara j termasuk dalam jadwal optimal atau (ii) tidak. Kasus (i): Kita
tahu bahwa pembicaraan p (j) + 1,. . . , j - 1 tidak termasuk dalam jadwal ini,
karena tidak ada Pembicaraan lain ini kompatibel dengan
pembicaraan j . Selanjutnya, pembicaraan lain dalam jadwal optimal ini harus
terdiri dari jadwal optimal untuk pembicaraan 1 , 2 ,. . . , p (j) . Sebab jika ada
jadwal yang lebih baik untuk pembicaraan 1 , 2 ,. . . , p (j) , dengan menambahkan
pembicaraan j , kita akan memiliki jadwal yang lebih baik dari pada keseluruhan
optimal susunan acara. Akibatnya, dalam kasus (i) , kami memiliki T (j) = wj + T
( p ( j)) . Kasus (ii): Ketika pembicaraan j tidak termasuk dalam jadwal optimal,
maka itu adalah optimal jadwal dari pembicaraan 1 , 2 ,. . . , j sama dengan jadwal
optimal dari pembicaraan 1 , 2 ,. . . , j - 1.
Akibatnya, dalam kasus (ii) , kami memiliki T (j) = T (j - 1 ) . Menggabungkan
case (i) dan (ii) menuntun kita ke hubungan perulangan
T (j) = maks ( wj + T (p (j)), T (j - 1 )).

Sekarang kita telah mengembangkan hubungan perulangan ini, kita dapat


membangun algoritma yang efisien, Algoritma 1, untuk
menghitung jumlah total peserta maksimum. Kami memastikan algoritma
tersebut efisien dengan menyimpan nilai setiap T (j) setelah kami
menghitungnya. Ini memungkinkan kita untuk menghitung T (j) hanya sekali. Jika
kita tidak melakukan ini, algoritma akan memiliki kompleksitas kasus terburuk
yang eksponensial. Proses menyimpan nilai-nilai karena masing-masing dihitung
dikenal sebagai memoisasi dan merupakan teknik penting untuk membuat
algoritma rekursif menjadi efisien.

Anda mungkin juga menyukai