Skip to main content

Tugas AP2C : Metode Greedy, Divide & Conquer

  1. Metode Greedy 
Contoh 1 (Masalah Penukaran uang):

Persoalan: Diberikan uang senilai A. Tukar A dengan koin-koin uang yang ada. Berapa jumlah minimum koin yang diperlukan untuk penukaran tersebut?

Contoh: tersedia koin-koin 1, 5, 10, dan 25

Uang senilai 57 dapat ditukar dengan cara berikut
       57 = 1 + 1 + … + 1                         (57 koin)       

       57 = 5 + 5 + 5 + 10 + 10 + 10 + 10 + 1 + 1 (9 koin)
       57 = 10 + 10 + 10 + 10 + 10 + 5 + 1 + 1    (8 koin)

            … dan seterusnya                 

Minimum: 57 = 25 + 25 + 5 + 1 + 1       hanya 5 koin

Strategi greedy yang digunakan  adalah:

Pada setiap langkah, pilihlah koin dengan nilai sebesar mungkin dari himpunan koin yang tersisa dengan syarat (kendala) tidak melebihi nilai uang yang ditukarkan.

Tinjau masalah menukarkan uang 57 dengan koin 1, 5, 10, dan 25:

Langkah 1: pilih 2 buah koin 25 (Total = 50)

Langkah 2: pilih 1 buah koin 5  (Total = 50 + 5 = 55)

Langkah 3: pilih 2 buah koin 1  (Total = 25+25++5+1+1= 57) 

Solusi: Jumlah koin minimum = 5 (solusi optimal!)
Pada setiap langkah di atas kita memperoleh optimum lokal, dan pada akhir algoritma kita memperoleh optimum global (yang pada contoh ini merupakan solusi optimum).


Divide and Conquer

Komputer pada awalnya diciptakan sebagai perangkat untuk melakukan kalkulasi secara otomatis dan akurat. Meskipun awalnya hanya berfokus pada kalkukasi numerik, komputer modern yang dijumpai sekarang telah melakukan kalkulasi pada banyak hal, seperti teks ataupun gambar. Berbagai kalkulasi dan analisa yang dilakukan komputer biasanya diimplementasikan melalui perangkat lunak. Dengan semakin besarnya ruang lingkup hal-hal yang dilakukan oleh komputer, perangkat lunak yang dikembangkan juga menjadi semakin kompleks. Algoritma, sebagai bagian dari perangkat lunak yang melakukan pemrosesan, juga memerlukan berbagai teknik baru. Misalkan, untuk menghitung total jumlah dari bilangan-bilangan yang ada di dalam sebuah list, kita dapat menggunakan perulangan sederhana:
nums = [1, 2, 3, 5, 6, 7, 19, 28, 58, 18, 28, 67, 13]
total = 0

for i in range(0, len(nums)):
    total = total + nums[i]

print(total) # 255
Algoritma perulangan yang digunakan pada kode di atas memang sederhana dan memberikan hasil yang benar, tetapi terdapat beberapa masalah pada kode tersebut, yaitu perhitungan dilakukan secara linear, yang menghasilkan kompleksitas O(n). Hal ini tentunya cukup ideal untuk ukuran list kecil, tetapi jika ukuran list menjadi besar (beberapa Milyar elemen) maka perhitungan akan menjadi sangat lambat. Kenapa perhitungannya menjadi lambat? Karena nilai dari total tergantung kepada kalkulasi nilai total sebelumnya. Kita tidak dapat melakukan perhitungan total dari depan dan belakang list sekaligus, sehingga kita dapat mempercepat perhitungan dua kali lipat. Dengan kode di atas, kita tidak dapat membagi-bagikan pekerjaan ke banyak pekerja / CPU!
Lalu apa yang dapat kita lakukan? Langkah pertama yang dapat kita lakukan adalah menerapkan teknik rekursif untuk membagi-bagikan masalah menjadi masalah yang lebih kecil. Jika awalnya kita harus menghitung total keseluruhan list satu per satu, sekarang kita dapat melakukan perhitungan dengan memecah-mecah list terlebih dahulu:
def sums(lst):
    if len(lst) >= 1:
         return lst[0]

    mid = len(lst) // 2
    left = sums(lst[:mid])
    right = sums(lst[mid:])

    return left + right

print(sums(nums)) # 255
Apa yang kita lakukan pada kode di atas?
  1. Baris if len(lst) >= 1 memberikan syarat pemberhentian fungsi rekursif, yang akan mengembalikan isi dari list ketika list berukuran 1 (hanya memiliki satu elemen).
  2. Baris mid = len(lst) // 2 mengambil median dari list, sebagai referensi ketika kita membagi list menjadi dua bagian.
  3. Baris left = sum(lst[:mid]) dan selanjutnya membagikan list menjadi dua bagian, dengan nilai mid sebagai tengah dari list.
Singkatnya, setelah membagikan list menjadi dua bagian terus menerus sampai bagian terkecilnya, kita menjumlahkan kedua nilai list tersebut, seperti pada gambar berikut:
Langkah Kerja Divide and Conquer
Langkah Kerja Divide and Conquer
Apa kelebihan pendekatan dengan membagi-bagikan masalah ini? Dengan menggunakan bahasa dan library yang tepat, kita dapat membagi-bagikan setiap bagian rekursif (left = ... dan right = ...) ke satu unit kerja baru, yang dikenal dengan nama thread. Mekanisme pada sistem operasi atau compiler kemudian akan membagi-bagikan tugas pembagian dan perhitungan lanjutan agar dapat dijalankan secara paralel, misalnya dengan membagikan tugas ke dalam beberapa core prosesor, atau bahkan ke dalam mesin lain (jika terdapat sistem dengan banyak mesin).
Dengan membagi-bagikan pekerjaan ke dalam banyak unit, tentunya pekerjaan akan lebih cepat selesai! Teknik memecah-mecah pekerjaan untuk kemudian dibagikan kepada banyak pekerja ini dikenal dengan nama divide and conquer.

sumber :
bertzzie.com
google.com 

Nama : Fadhly Muharram
NPM  : 53414754
Kelas: 1IA24

Comments

Popular posts from this blog

Sejarah Internet & Pengertian Internet

Sejarah Internet dan Perkembangan Internet Internet berawal dari diciptakannya teknologi jaringan komputer sekitar tahun 1960. Apa sebenarnya jaringan komputer itu ? Jaringan komputer adalah beberapa komputer terhubung satu sama lain dengan memakai kabel dalam satu lokasi, misalnya dalam satu kantor atau gedung. Jaringan komputer ini berfungsi agar pengguna komputer bisa bertukar informasi dan data dengan pengguna komputer lainnya. Pada awal diciptakannya, jaringan komputer dimanfaatkan oleh angkatan bersenjata Amerika untuk mengembangkan senjata nuklir. Amerika khawatir jika negaranya diserang maka komunikasi menjadi lumpuh. Untuk itulah mereka mencoba komunikasi dan menukar informasi melalui jaringan komputer. Setelah angkatan bersenjata Amerika, dunia pendidikan pun merasa sangat perlu mempelajari dan mengembangkan jaringan komputer. Salah satunya adalah Universitas of California at Los Angeles (UCLA). Akhirnya tahun 1970 internet banyak digunakan di unversitas-universitas di Ame...

Strategi Murni Dengan Prinsip Maximin dan Minimax

NAMA : FADHLY MUHARRAM NPM : 53414754 KELAS : 3IA22 MATA KULIAH : Pengantar Teknologi Game DOSEN : Rifki Amalia PENULISAN KE 12 Pemecahan optimal dikatakan dicapai jika tidak ada satupun pemain akan memperoleh manfaat dari perubahan strateginya. Dalam kasus ini, permainan tersebut dikatakan stabil. Kriteria pemecahan masalah yang digunakan adalah kriteria minimaks-maksimin. Contoh Kasus : Pertimbangkan matriks hasil diatas, yang mewakili keuntungan Pemain A. ! Perhitungan nilai minimaks dan maksimin diperlihatkan dalam matrik diatas dengan penjelasan sebagai berikut :         Pemain A memainkan strategi pertamanya, ia dapat memperoleh 8, 2, 9 atau 5, yang bergantung pada strategi yang dipilih Pemain B. Tetapi, ia pasti memperoleh keuntungan setidaknya sebesar min { 8,2,9,5 } = 2 tanpa bergantung pada strategi yang dipilih Pemain B. Demikian pula jika Pemain A memainkan strateginya yang kedua, ia dijamin...

Interaksi Fisik & Efek Fisik Manusia Pada Game

Interaksi Fisik Manusia Pada Lingkungan Game Interaksi fisik dalam Game Game konsol modern saat ini sudah dilengkapi dengan perangkat gerak yang melibatkan aktivitas fisik sehingga permainan video game dapat sekaligus melatih otot dan gerak selayaknya berolahraga, seperti halnya yang disediakan oleh konsol Nintendo Wii, PS3 Move, atau yang lebih canggih lagi, Xbox 360 Kinect. Game – game yang melibatkan aktivitas fisik seperti game tinju, tennis, sepakbola dsb, yang mengharuskan anda untuk menggerakkan tangan dan anggota tubuh anda sesuai tema video game yang dimainkan.  Untuk mendapatkan seperangkat konsol tersebut tidaklah perlu mengeluarkan kocek yang dalam. Ketiganya memiliki harga yang berlainan yang dapat disesuaikan dengan kocek anda. Efek fisik pada Manusia Ketika Main Game Efek fisik terbagi 2 :  Efek Positif Meningkatkan konsentrasi. kemampuan konsentrasi pemain game Online akan meningkat karena mereka harus menyelesaikan beberapa tugas, mencari celah yang...