Anda di halaman 1dari 6

Pengaplikasian Divide and Conquer dalam

Algoritma Penggambaran Graf


Aditya Putra Santosa - 13517013
Program Studi Teknik Informatika
Sekolah Teknik Elektro dan Informatika
Institut Teknologi Bandung, Jl. Ganesha 10 Bandung 40132, Indonesia
13517013@std.stei.itb.ac.id

​ Seiring dengan meningkatnya popularitas dari ​Big


Abstrak— Terdapat berbagai macam algoritma untuk menggambar
Data dikarenakan ​Industrial Revolution 4.0​, jumlah data yang graf, seperti ​force-based layout,​ ​spectral layout,​ ​orthogonal
ada menjadi lebih banyak dan lebih komplek dari sebelumnya. layout, tree layout, layered graph method, arc diagrams, ​dan
Untuk memudahkan memahami data tersebut, perlulah
lainnya. Algoritma yang digunakan pada makalah ini adalah
dilakukan visualisasi data. Salah satu teknik dari visualisasi data
adalah dengan memodelkannya sebagai graf. Makalah ini akan Force-based layout atau ​Force-directed algorithm​. Umumnya
membahas salah satu pendekatan penggambaran graf yaitu Force-directed algorithm memiliki kompleksitas sebesar
Force-Directed Algorithm yang akan dioptimasi dengan teknik O(n2 ) tapi jika diterapkan metode ​Divide and Conquer yaitu
Divide and Conquer​ yaitu dengan ​Barnes-Hut Algorithm​. dengan menggunakkan ​Barnes-Hut algorithm​, kita bisa
menurunkan kompleksitasnya menjadi O(n log n) .
Keywords—graf; divide and conquer; penggambaran graf;
barnes hut II. GRAF, DIVIDE AND CONQUER
I. INTRODUCTION A. Graf
Seiring dengan berkembangnya ​Big Data​, kebutuhan akan Graf dapat kita definisikan sebagai ​tuple ​(V, E) dimana V
visualisasi data juga akan meningkat. Hal ini dikarenakan menandakan ​set simpul yang ukurannya tidak kosong dan E
meningkatnya kompleksitas data yang didapat dan semakin menandakan ​set sisi yang menghubungkan sepasang simpul
kompleks suatu data maka akan semakin susah jika kita [1]. Kita bisa mengatakan bahwa dua simpul pada V
mencoba untuk mengerti data tersebut hanya dengan membaca terhubung jika dan hanya jika terdapat setidaknya satu sisi
isinya saja tanpa merubahnya menjadi hal lain yang mudah pada E yang menghubungkan kedua simpul tersebut.
dimengerti. Visualisasi data adalah suatu proses dimana kita
Berdasarkan keterhubungan antara simpulnya, kita bisa
melakukan transformasi fitur-fitur yang ada pada data agar
membagi graf menjadi dua yaitu terhubung dan tak-terhubung.
lebih mudah dimengerti ataupun dipahami. Terdapat banyak
Suatu graf bisa dikatakan terhubung jika terdapat suatu jalan
cara untuk melakukan visualisasi data, seperti ​histogram​,
untuk setiap pasang simpul pada graf tersebut. Jika ada suatu
scatter plot,​ ​correlation matrix,​ ​connected graph​, dan lainnya.
pasang simpul yang tidak memiliki jalan yang
Dalam makalah ini, akan dibahas mengenai komponen menghubungkan mereka, maka graf tersebut dikatakan
visualisasi data menggunakkan graf. Contoh dari penggunaan tak-terhubung.
graf untuk visualisasi data ada pada data peta. Dengan
Berdasarkan properti sisinya, graf dapat dibedakan
membuat representasi graf dari peta, kita bisa melakukan
menjadi graf berarah dan graf tak-berarah. Suatu graf
berbagai hal seperti mencari lintasan terpendek, mencari
dikatakan berarah jika suatu sisi S pada E hanya bisa dilalui
siklus, mencari lintasan yang melalui semua tempat, dan
dari suatu simpul ke simpul lainnya tapi tidak sebaliknya,
lainnya. Untuk bisa melakukan visualisasi tersebut, terdapat
kecuali jika ada sisi lain yang pangkalnya di simpul lain itu.
dua komponen utama yang harus bisa kita lakukan yaitu
Selain itu dapat dibedakan juga menjadi graf berbobot dan
mengubah data menjadi graf, dan menggambar graf tersebut.
tak-berbobot. Graf berbobot adalah graf yang setiap sisinya
Fokus utama dari makalah ini ada pada komponen yang kedua
memiliki suatu nilai / bobot.
yaitu menggambar graf yang dihasilkan dari data.
Dalam makalah ini, graf yang akan digunakan adalah graf
tak-berbobot, tak-berarah dan bisa terhubung ataupun

Makalah IF2211 Strategi Algoritma, Semester II Tahun 2018/2019


tak-terhubung. Dikarenakan graf pada makalah ini kita harus memecah senarai itu menjadi dua upa masalah. Tapi
tak-berbobot dan tak-berarah maka salah satu bentuk ketika upa masalah tersebut sudah terurut maka
representasi graf yang paling mudah dipakai untuk makalah menggabungkannya sangat mudah karena tidak usah
ini adalah ​adjacency list atau senarai ketetanggan. Senarai melakukan apa apa. Dalam makalah ini, tipe algoritma ​Divide
ketetanggaan menyimpan data simpul apa bertetangga dengan and Conquer y​ ang dipakai adalah ​hard split, easy join,​ untuk
apa. Dikarenakan tak-berarah maka jika S1 ada di senarai lebih jelasnya akan dijelaskan pada bab ​Barnes-Hut​.
tetangga dari S2, maka S2 juga ada di senarai tetangga dari S1.
III. FORCE-DIRECTED, BARNES-HUT
Selain senarai ketetanggaan, terdapat pula representasi
A. Force-Directed
lainnya yaitu ​matrix ketetanggan dan senarai sisi dan simpul.
Force-Directed​ adalah salah satu metode untuk
Matrix ​ketetanggaan secara sederhana adalah suatu ​matrix
menggambar graf. Metode ini bekerja dengan memanfaatkan
yang akan mencatat bobot dari simpul Si dan Sj di indeks (i,j)
konsep fisika mengenai gaya, terutama gaya tarik menarik dan
jika ada, jika tidak ada maka bobotnya 0. Jika graf tak-berarah,
gaya repulsif. Secara sederhana, kita dapat menganggap setiap
maka bobotnya adalah 1. Senarai sisi dan simpul merupakan
simpul yang ada pada graf sebagai suatu partikel dengan berat
representasi graf yang paling sederhana, sesuai dengan definisi
konstan yaitu satu. Kemudian kita dapat juga menganggap
graf pada awalnya yaitu set dari simpul dan set dari sisi. Set
bahwa muatan setiap partikel tersebut adalah sama, sehingga
dari sisi secara sederhana dapat berupa set dari ​tuple dua
akan ada gaya tolak menolak antar partikel. Tapi, untuk
integer yaitu id dari kedua simpul. Set dari simpul secara
simpul yang terhubung, kita bisa mengasumsikan ada suatu
sederhana dapat berupa set dari id simpul yang ada pada graf.
pegas diantara mereka yang menghubungkan kedua simpul
Dalam makalah ini, tidak digunakan representasi matrik
tersebut, sehingga akan ada gaya tarik yang terjadi diantara
ketetanggaan dikarenakan banyaknya memori yang
mereka [3]. Tujuan dari hal tersebut adalah untuk mencoba
dihabiskan, untuk graf dengan n simpul, dibutuhkan ​matrix
mendekatkan simpul simpul yang saling terhubung dan
berukuran n*n. Senarai sisi dan simpul juga tidak digunakan
menjauhkan simpul yang tidak terhubung.
karena susah untuk mencari atau memodifikasi baik simpul
Algoritma ​Force-Directed​ bekerja dengan cara
ataupun sisinya dikarenakan harus di iterasi terlebih dahulu.
mensimulasikan interaksi antar partikel sesuai aturan aturan
B. Divide and Conquer yang sudah diasumsikan diatas. Diharapkan setelah beberapa
selang waktu, algoritma ini akan menemukan kondisi
Algoritma ​Divide and Conquer sesuai namanya adalah
ekuilibrium / seimbang dimana total semua gaya yang
algoritma yang membagi masalah masalah menjadi upa
bereaksi pada semua partikel adalah nol. Ketika sudah
masalah yang lebih kecil yang nantinya akan lebih mudah
mencapai kondisi ekuilibrium diharapkan juga tidak ada sisi
diselesaikan. Tahapan dari algoritma ​Divide and Conquer
yang berseberangan.
adalah ​Divide atau membagi menjadi upa masalah dengan
Algoritma ini memiliki banyak variasi terutama di bagian
ukuran lebih kecil, ​Conquer atau memecahkan masalah yang
gaya yang digunakan. Dalam makalah ini, gaya tolak-menolak
lebih kecil tersebut, ​Combine atau menggabungkan solusi dari
/ repulsif yang digunakan berasal dari hukum muatan partikel
berbagai upa masalah yang didapat. Dalam tahap pembagian
seperti yang dijelaskan sebelumnya, yaitu F = k/d2 dimana k
menjadi upa masalah ada syarat khusus yang harus dipenuhi
adalah suatu konstanta dan d adalah jarak antara dua partikel.
yaitu karateristik upa masalah yang dihasilkan harus sama
Semakin jauh partikel tersebut maka akan semakin lemah gaya
dengan karateristik masalah asalnya. Dikarenakan memiliki
tolak-menolak nya, sebaliknya semakin dekat partikel
karateristik yang sama, algoritma ​Divide and Conquer
tersebut, akan semakin kuat gaya repulsifnya. Hal ini
umumnya dibuat dengan skema rekursif [2].
bertujuan agar tidak ada partikel yang saling tumpang tindih.
Berdasarkan tingkat kompleksitas tahap tahapnya, Untuk gaya tarik-menarik, dalam makalah ini digunakan
algoritma ​Divide and Conquer dapat dibagi menjadi ​easy split kebalikan dari gaya tolak-menolaknya yaitu F = d2 /k
hard join, d​ an ​hard split easy join.​ ​Easy split hard join adalah dimana k adalah konstanta dan d adalah jarak, sehingga
algoritma yang mudah untuk dipecah menjadi upa masalah semakin jauh jaraknya, semakin besar gaya tariknya dan
tapi susah untuk menggabungkan solusinya. Contoh dari semakin dekat akan semakin kecil gaya tariknya. Tujuannya
algoritma itu adalah ​Merge Sort,​ ​Merge Sort mudah untuk adalah agar partikel yang terhubung tidak terpisah terlalu jauh.
dipecah menjadi upa masalah yang lebih kecil karena kita Ketika gaya tolak-menolak dan gaya tarik-menarik sama
hanya memecah senarai menjadi dua bagian tiap iterasi, maka akan terjadi keseimbangan antara kedua partikel/simpul
sementara untuk menggabung solusi dari ​Merge sort ​kita tersebut. Namun ada beberapa kasus dimana partikel
harus membandingkan satu-satu hasil dari kedua solusi upa menabrak dinding simulasi dan pasangannya juga sehingga
masalah. Sementara ​hard split easy join adalah kebalikannya. mereka berdua hanya bergerak di dinding saja berosilasi dan
Susah untuk membuat upa masalahnya tapi mudah untuk tidak pernah/sangat lama seimbang. Untuk menghindari hal
menggabungkan solusinya. Contoh dari algoritma ini adalah tersebut, dalam makalah ini diberikan satu gaya tambahan
Quick Sort.​ Pada algoritma ​Quick Sort​, kita harus yaitu gaya tarik ke titik tengah simulasi. Gaya tersebut berlaku
mengelompokan isi dari senarai sambil mencari indeks tempat

Makalah IF2211 Strategi Algoritma, Semester II Tahun 2018/2019


untuk setiap partikel dengan harapan mereka tidak menyentuh Langkah dari algoritma ​Barnes-Hut​ adalah mulai dengan
dinding dan akan lebih cepat mencapai keseimbangan. suatu dunia yang kosong, tidak berisi apa apa. Kemudian
lakukan secara berulang salah satu dari kasus berikut setiap
B. Implementasi Bruteforce ​Force-Directed ada titik yang dimasukkan:
Dalam implementasinya, algoritma ​Force-Directed​ versi 1. Jika dunia kosong, maka titik langsung dimasukkan,
bruteforce memiliki pseudocode seperti berikut : jumlah titik di dunia ini menjadi 1
2. Jika ada tepat 1 titik di dunia, maka pecah dunia
menjadi 4 dunia lainnya yang terletak di atas-kanan,
atas-kiri, bawah-kiri, bawah-kanan. Kemudian
tentukan titik di dunia masuk di upa-dunia bagian
mana, kemudian masukkan titik di dunia ini ke
upa-dunia lalu cari upa-dunia bagian mana tempat
titik baru berada, kemudian masukan titik baru ke
upa-dunia tersebut. Kemudian naikan 1 jumlah titik
di dunia ini
3. Jika sudah ada lebih dari 1 titik di dunia itu, maka
tentukan posisi titik baru ada di upa-dunia yang
mana, kemudian masukkan titik baru ke upa-dunia
tersebut. Lalu naikkan 1 jumlah titik di dunia ini

dapat terlihat bahwa untuk setiap simpul yang bertetangga /


terhubung, maka akan diberi gaya tarik-menarik antara
mereka, serta untuk setiap pasangan simpul akan diberi gaya
tolak-menolak antara mereka, dan juga untuk setiap simpul
akan diberi gaya tarik ke tengah layar. Kompleksitas dari
algoritma ​Force-Directed v​ ersi​ bruteforce​ adalah O(n2 )
dengan n adalah banyak simpul.

C. Barnes-Hut
Barnes-Hut ​adalah algoritma yang biasanya digunakan
Gambar 1. Contoh ​Barnes-Hut ​(diambil dari :
untuk mensimulasikan ​N-Body Problem​ atau permasalahan
http://www.cs.princeton.edu/courses/archive/fall03/cs126/assi
simulasi menentukan gerakan n buah objek yang berinteraksi
gnments/barnes-hut.html​, diakses pada 26 april 2019)
satu sama lain dengan gaya gravitasi. ​Barnes-Hut​ merupakan
Terlihat pada contoh titik a berada di upa-dunia bagian atas
algoritma aproksimasi, sehingga hasil yang didapat belum
kiri, kemudian b awalnya berada di upa-dunia atas kanan, tapi
tentu eksak tapi jika diberikan waktu yang cukup lama, maka
karena c masuk maka upa-dunia atas kanan terbagi lagi
algoritma ​Barnes-Hut​ akan memberikan hasil yang sangat
menjadi 4 bagian, dan karena b dan c masih 1 upa-dunia, maka
dekat dengan hasil eksaknya.
dibagi lagi sehingga upa-dunia yang berisi b dan c berbeda.
Barnes-Hut ​bekerja dengan cara memanfaatkan konsep
Kegunaan penting dari ​Barnes-Hut​ adalah mencoba untuk
Divide and Conquer​ dimana dibandingkan dengan melakukan
mengelompokkan beberapa kelompok titik menjadi satu.
perhitungan total gaya secara manual untuk setiap pasang,
Setiap simpul pada ​quadtree t​ ersebut berisi informasi
akan lebih baik jika ada beberapa titik yang dekat maka
mengenai pusat massa dari gabungan anak anak ​tree​ tersebut
titik-titik itu akan dianggap sebagai suatu titik baru dengan
dan berapa total massa nya.
posisinya adalah pusat massa titik-titik itu dan beratnya adalah
Hal tersebut sangat berguna karena jika kita ingin
berat total titik-titik itu.
menghitung total gaya yang berlaku di suatu titik T, kita hanya
Untuk bisa melakukan hal tersebut, perlulah dunia
perlu menghitung total gaya titik T dengan pusat massa
simulasinya dibagi menjadi 4 bagian yaitu atas kanan, atas
kelompok titik lainnya. Tapi, agar lebih akurat lagi, total gaya
kiri, bawah kiri, bawah kanan yang nantinya akan disebut
hanya akan dihitung menggunakkan pusat massa kelompok
sebagai kuadran 1, 2, 3, 4. Untuk mewujudkan hal tersebut,
titik lainnya jika perbandingan panjang upa-dunia dengan
kita akan menggunakkan struktur data yang bernama ​Quad
jarak titik T dan kelompok titik melebihi suatu nilai konstanta
Tree​ atau ​Tree​ tapi dengan jumlah anak tepat 4.
yang kita beri nama tetha [4]. Jika tidak melebihi tetha maka
Bagian ​Divide and Conquer​ dari algoritma ​Barnes-Hut
total gaya adalah total gaya titik dengan semua upa-dunia dari
terdapat di bagian membuat ​tree a​ walnya dengan memasukkan
dunia itu. Perbandingan panjang upa-dunia dengan jarak
berbagai titik kedalam ​tree nya.​
tersebut menandakan apakah titik T cukup jauh dengan
kelompok titik yang diuji.

Makalah IF2211 Strategi Algoritma, Semester II Tahun 2018/2019


Algoritma ​Barnes-Hut​ tergolong dalam algoritma yang kompleksitas algoritmanya menjadi O(n) tapi nilai gaya total
hard split, easy join​. Susah untuk membuat upa-masalahnya akan menjadi lebih akurat.
karena ada 3 kasus yang harus di cek, sementara setelah Jika nilai tetha yang digunakkan tepat, tidak terlalu besar,
dipecah menjadi sub-dunia, bagian untuk mendapat solusinya dan tidak terlalu kecil, maka algoritma ini akan menjadi mirip
yaitu total gaya yang berlaku di suatu titik menjadi gampang dengan algoritma ​traversal tree ​biasa yang memiliki
karena struktur datanya berbentuk ​tree ​sehingga kita cukup kompleksitas O(log n). Sehingga total penghitungan gaya total
melakukan ​traversal tree saja.​ untuk semua titik adalah O(n log n).
Pseudocode dari pemasukkan titik ke ​quadtree a​ dalah Dari gabungan memasukkan titik dan mencari gaya total,
sebagai berikut: kita bisa mendapatkan total kompleksitas algoritma
Barnes-Hut​ adalah 2*O(n log n) yaitu O(n log n).

IV. OPTIMASI FORCE-DIRECTED


Force-Directed ​dengan menggunakkan metode ​bruteforce
membutuhkan kompleksitas O(n2 ) untuk menghitung total
gaya untuk semua titik di dalam dunia. Dengan menganggap
semua simpul sebagai partikel kita dapat mendekati hasil
algoritma ​Force-Directed​ dengan menggunakkan ​Barnes-Hut
algorithm yang sudah dimodifikasi.
Bagian modifikasi yang harus dilakukan adalah pada bagian
gaya tariknya. Sepasang partikel hanya akan saling tarik
menarik jika representasi simpulnya merupakan tetangga, jika
tidak maka hanya akan ada gaya repulsif/tolak-menolak saja.
terlihat bahwa ​quadtree​ dengan kedalaman d, total titik yang Hasil pseudocode ​Barnes-Hut​ yang telah dimodifikasi
d
bisa ditampung adalah maksimal 4 sehingga untuk adalah seperti berikut:
memasukkan n titik paling banyak kita hanya butuh
kedalaman log 4 n , sehingga ​traversal tree​ yang harus
dilakukan untuk memasukkan 1 titik ada pada batasan O(log
n), maka total kompleksitas untuk memasukkan n titik
kedalam ​quadtree Barnes-Hut​ adalah O(n log n).
Pseudocode dari pencarian total gaya yang berlaku pada
suatu titik adalah sebagai berikut:

kompleksitas dari penghitungan total gaya tersebut masih


sama seperti sebelumnya yaitu bergantung pada nilai tetha,
tapi umumnya akan memiliki kompleksitas O(n log n) untuk
menghitung total gaya semua titik.
dapat terlihat jika tetha kecil, maka sebagian besar kasus akan Kita juga harus melakukan modifikasi terhadap algoritma
masuk ke bagian penghitungan total gaya menggunakkan Force-Directed​ agar menggunakkan ​Barnes-Hut. B ​ erikut
pusat massa dan kompleksitas untuk penghitungan gaya total adalah pseudocode ​Force-Directed​ yang sudah dimodifikasi
di suatu titik akan menjadi O(1) tapi nilai gaya totalnya akan agar menggunakkan algoritma ​Barnes-Hut:​
kurang akurat.
Tapi jika nilai tetha besar, maka akan menghitung total
gaya dengan menghitung jumlah total gaya di setiap
upa-dunia, dimana pada akhirnya akan sama saja dengan
menghitung total gaya terhadap semua titik. Sehingga

Makalah IF2211 Strategi Algoritma, Semester II Tahun 2018/2019


Gambar 2. Perbandingan ​bruteforce(​ kiri)​ ​dan
Barnes-Hut​(kanan)

mulai terlihat perbedaan antara ​bruteforce dan Barnes-Hut


dimana ​Barnes-Hut​ lebih cepat mencapai kondisi ekuilibrium
& tidak ada sisi yang bersilangan.

Ukuran 100 Simpul


kita harus membuat dunia baru setiap iterasi karena setiap
titiknya bergerak, bisa saja dia pindah ke upa-dunia yang lain.
Total kompleksitas untuk algoritma baru ini adalah
kompleksitas untuk menghitung total gaya semua titik +
kompleksitas untuk memasukkan semua titik ke dunia baru,
sehingga totalnya adalah O(n log n) + O(n log n) = 2*O(n log
n) = O(n log n). Sehingga algoritma ​Force-Directed​ yang
dioptimasi dengan menggunakkan ​Barnes-Hut​ memiliki
kompleksitas yang lumayan jauh berbeda dibanding metode
bruteforce​.
V. EKSPERIMEN
Telah dilakukan uji coba penggambaran graf dengan dua Gambar 2. Perbandingan ​bruteforce(​ kiri)​ ​dan
variasi algoritma ​Force-Directed​ yaitu ​bruteforce ​dan Barnes-Hut​(kanan)
Barnes-Hut.​ Berikut adalah hasilnya: Ukuran 500 Simpul
Ukuran 10 simpul

Gambar 2. Perbandingan ​bruteforce(​ kiri)​ ​dan


Gambar 2. Perbandingan ​bruteforce​(kiri)​ ​dan Barnes-Hut​(kanan)
Barnes-Hut(​ kanan)
algoritma ​Barnes-Hut​ telah melewati tahap seperti gambar
tidak terlihat perbedaan yang signifikan kecuali animasi
graf dengan ​bruteforce​ dengan waktu hampir ⅓ waktu
Barnes-Hut l​ ebih cepat dibanding ​bruteforce
bruteforce
Ukuran 50 simpul
Barnes-Hut ​menghitung posisi setiap simpul lebih cepat, tapi
karena ​Barnes-Hut​ merupakan algoritma yang
mengaproksimasi maka kelihatannya tidak serapi yang
bruteforce

Makalah IF2211 Strategi Algoritma, Semester II Tahun 2018/2019


Ukuran 2000 Simpul
REFERENCES
[1] Rinaldi Munir, Matematika Diskrit”, 6th ed. Bandung:
Informatika Bandung, 2016,ch. 8
[2] Slide Divide and Conquer IF2211, didapat dari :
http://informatika.stei.itb.ac.id/~rinaldi.munir/Stmik/2017
-2018/Algoritma-Divide-and-Conquer-(2018).pdf
(diakses pada 26 April 2019)
[3] Handbook of Graph Drawing and Visualization, didapat
dari :
http://cs.brown.edu/people/rtamassi/gdhandbook/chapters/
force-directed.pdf​ (diakses 26 April 2019)
[4] Barnes-Hut Programming Assignment, didapat dari :
terlihat ketika ukuran 2000 simpul, algoritma ​bruteforce​ tidak http://www.cs.princeton.edu/courses/archive/fall03/cs126/
bisa menangani kasus tersebut dan crash. assignments/barnes-hut.html​ (diakses 26 April 2019)
Jadi dapat disimpulkan bahwa algoritma ​Barnes-Hut
dengan metode ​Divide and Conquer​ bisa bekerja lebih baik
PERNYATAAN
dibandingkan metode ​bruteforce​ untuk algoritma
penggambaran graf ​Force-Directed​ ​Layout.​ Dengan ini saya menyatakan bahwa makalah yang saya tulis
ini adalah tulisan saya sendiri, bukan saduran, atau terjemahan
dari makalah orang lain, dan bukan plagiasi.
VI. APPENDIX Bandung, 26 April 2019
Implementasi algoritma oleh penulis yang dibahas dalam
makalah ini dapat diakses di akun GitHub milik penulis di :
https://github.com/AdityaPutraS/Barnes-Hut-Force-Directed​.
Aplikasi membutuhkan OpenCV sebagai ​frontend​ untuk
berjalan dengan lancar. OpenCV bisa didapatkan di
https://opencv.org​. Program berbentuk ​Notebook Python,​
silahkan buka mengunakkan ​Jupyter Notebook /​ sejenisnya
ACKNOWLEDGMENT
Aditya Putra Santosa - 13517013
Penulis ingin menyatakan terima kasih kepada Dr. Nur
Ulfa Maulidevi ST,M.Sc. sebagai dosen pengampu Strategi
Algoritma IF2211 di kelas penulis. Penulis juga ingin
berterima kasih kepada teman-teman penulis yang telah
membantu dalam pembuatan makalah ini. 

Makalah IF2211 Strategi Algoritma, Semester II Tahun 2018/2019

Anda mungkin juga menyukai