Anda di halaman 1dari 41

Algoritma Kruskal untuk Memecahkan Masalah Pohon Merentang Minimum

Tugas Proyek Algoritma dan Pemrograman Oleh : Kelompok 1 Kelas : A ADI RAHMADANI WIJAYA CHATIYAH TRI LESTARI DEWI SULISTIAWATI EKA A. SURBAKTI IRVANIA SUKMA K. MOCH. ILHAM FATHILLAH PRILA IKA TRISDIANI SHOLIHATUL LAILI

0810940021 0810943005 0810943007 0810940035 0810940045 0810940073 0810940059 0810940067

PROGRAM STUDI MATEMATIKA FAKULTAS MIPA UNIVERSITAS BRAWIJAYA MALANG 2009

Abstrak
Mendesain jaringan dan memasang kabel jaringan bukan lagi merupakan masalah yang jarang ditemui. Dewasa ini semakin banyak organisasi yang menggunakan teknologi komputer. Seiring dengan kebutuhan komputerisasi yang semakin besar tersebut, jumlah komputer yang digunakan juga turut meningkat. Selain kegiatan dokumentasi yang semakin banyak dan kompleks, arus dokumen antar komputer juga semakin meningkat. Data yang diolah di satu komputer akan digunakan untuk mengolah data lain di komputer yang lain. Untuk perpindahan data ini dibutuhkan adanya jaringan yang menghubungkan setiap komputer yang saling terkait. Kondisi ini yang menyebabkan kebutuhan akan instalasi jaringan menjadi kebutuhan yang penting. Untuk instalasi jaringan komputer hal pertama yang perlu dipikirkan adalah bagaimana mendesain jaringan agar kabel yang dibutuhkan seminimal mungkin. Semakin pendek kabel yang digunakan tidak hanya menyebabkan biaya instalasi yang semakin murah tetapi juga transfer data antar komputer yang semakin cepat. Desain jaringan ini seringkali dilakukan secara manual. Jika komputer yang dihubungkan sedikit jumlahnya, maka tidak akan timbul masalah dalam mendesain, tetapi jika jumlah komputer yang akan dihubungkan cukup banyak, maka mendesain secara manual tidak mungkin lagi dilakukan karena akan memakan waktu lama dan belum tentu optimal. Dengan adanya kesulitan tersebut di atas, maka dalam penelitian ini dikembangkan suatu perangkat lunak yang mampu menghasilkan desain jaringan yang optimal, dalam arti membutuhkan kabel seminimal mungkin. Konsep yang diterapkan dalam perangkat lunak ini adalah minimum spanning tree. Tree adalah suatu diagram yang digambar dengan menggunakan titik(vertex) dan garis(edge). Setiap garis menghubungkan dua titik. Tree mempunyai kekhususan, yaitu dari vertex yang satu ke vertex yang lain hanya terhubung oleh serangkaian edge dengan jalur tunggal (tidak ada dua jalur antara dua titik). Minimum spanning tree adalah tree dengan jarak

terpendek yang menghubungkan semua vertex dalam tree tersebut. Untuk mencari minimum spanning tree ada beberapa metode yang bisa diterapkan. Dalam program yang dikembangkan ini digunakan metode kruskal.

LEMBAR PENILAIAN
NIM 0810940021 NAMA Makalah 30% Nilai Presentasi 70%

NA

ADI RAHMADANI WIJAYA


CHATIYAH TRI LESTARI DEWI SULISTIAWATI EKA A. SURBAKTI IRVANIA SUKMA K. MOCH. ILHAM FATHILLAH PRILA IKA TRISDIANI SHOLIHATUL LAILI

0810943005 0810943007 0810940035 0810940045 0810940073 0810940059 0810940067

BAB I PENDAHULUAN
1.1. Latar Belakang
Graf merupakan salah satu cabang ilmu matematika yang merepresentasikan objek objek diskrit dan hubungan antara objek objek tersebut. Representasi visual dari graf adalah dengan menyatakan obyek dengan noktah dan hubungan antara objeknya dengan garis. Untuk selanjutnya kita sebut noktah pada graf sebagai simpul (vertex) dan garis pada graf sebagai sisi (edge). Pada saat membicarakan graf tentu kita tidak boleh lupa pada salah satu struktur graf yang cukup penting yaitu pohon (beberapa referensi menetapkan pokok bahasan pohon pada bab yang berbeda karena luasnya bahasan tentang bab ini.). Pohon adalah graf berarah / tak berarah yang tidak membentuk sirkuit. Penggunaan struktur graf ini sangat penting dalam bidang informatika dan ilmu komputer. Salah satu kegunaan graf yang cukup penting adalah dalam hal pengrutean. Perutean yaitu kegiatan membuat rute dengan tujuan tertentu. Dengan penggunaan graf kita akan mendapatkan rute dengan keunggulan keunggulan tertentu misalnya : lintasan dengan biaya paling murah, lintasan dengan waktu tempuh paling cepat, lintasan dengan jarak paling pendek, lintasan dengan tingkat efisiensi paling tinggi. Banyak permasalahan yang dapat dimodelkan dengan menggunakan graf, khususnya di bidang teknologi informasi. Salah satunya adalah masalah dalam pencarian jarak terpendek. Banyak aplikasi yang membutuhkan adanya pencarian jarak / jalur terpendek dari suatu graf. Termasuk didalamnya adalah mencari panjang kabel minimum dari suatu desain penataan jaringan komputer. Akan tetapi hanya menerapkan secara langsung algoritma untuk mencari jarak terpendek atau biasa disebut minimum spanning tree, tidak mungkin dilakukan karena adanya kondisi yang membatasi. Perlu adanya

pengecekan tersendiri dalam mencari jalur jalur yang akan digunakan. Pengecekan ini disesuaikan dengan kondisi nyata yang ingin diimplementasikan. Metode yang lebih baik dan sering digunakan untuk mencari minimum spanning tree adalah algoritma kruskal yang dikembang-kan di tahun 1950an oleh J.B. Kruskal dan algoritma Prim yang dikembangkan oleh R. C. Prim. Perbedaan kedua algoritma tersebut adalah inputnya. Algoritma kruskal mampu mencari minimum spanning tree untuk sekumpulan tree yang diinputkan (forest) atau bisa dikatakan graf yang tidak terhubung. Sedangkan algoritma prim hanya untuk tree tunggal. Hal ini dikarenakan Kruskal memilih edge dari yang berbobot terkecil, sedangkan prim mencari dari satu edge ke edge lain yang terhubung.

1.2. Rumusan Masalah Bagaimana cara menyalurkan informasi ke berbagai jaringan? Bagaimana cara mengetahui jarak terpendek yang diperlukan dalam menyalurkan informasi? 1.3. Tujuan Mahasiswa dapat menyelesaikan masalah mengenai

mengubungkan semua wilayah yang ada namun dengan menggunakan jarak seminimal mungkin dengan menggunakan algoritma kruskal

1.4 Batasan Masalah Menyalurkan informasi ke berbagai jaringan dengan memilih jalur terpendek dengan menggunakan Delphi.

BAB II KAJIAN PUSTAKA


2.1 Teori Graf
Graf (Graph) didefiniskan sebagai: G = {V, E} Dalam hal ini, V merupakan himpunan tidak kosong dari simpul-simpul (vertices/node) di gambarkan dalam titik-titik, dan E adalah himpunan sisi-sisi (edges/arcs) digambarkan dalam garis-garis yang menghubungkan sepasang simpul. Dapat dikatakan graf adalah kumpulan dari simpul-simpul yang dihubungkan oleh sisi-sisi.

Gambar 1: Graf G1 Pada G1 diatas, graf terdiri dari himpunan V dan E yaitu: V = {A, B, C, D} E = {e1, e2, e3, e4} ; bisa kita tulis = {(A,B),(B,C),(B,C),(A,C)} Aplikasi graf sangat luas. Graf dipakai dalam berbagai disiplin ilmu maupun dalam kehidupan sehari-hari. Penggunaan graf di berbagai bidang tersebut adalah untuk memodelkan persoalan. Beberapa terminologi dasar yang harus diketahui:

2.1.1. Graf Berarah (Directed Graph/Digraph)

Graf berarah adalah graf yang setiap sisinya diberi orientasi arah. Dalam hal ini sisi yang ditulis (v1,v2) berbeda dengan sisi (v2,v1)

Gambar 2: Graf Berarah

2.1.2 Graf Berbobot (Weight Graf)


Graf berbobot adalah graf yang setiap sisinya diberi sebuah harga.

Gambar 3: Graf Berbobot

2.1.3 Graf Lengkap (Complete Graph)

Graf lengkap adalah graf sederhana, tidak mengandung gelang (sisi yang kedua simpulnya sama) maupun sisi ganda (dua sisi yang memiliki simpul asal dan simpul tujuan yang sama), serta setiap sisinya mempunyai sisi ke simpul lain.

Gambar 4: Graf Lengkap K5

2.1.4

Bertetangga (Adjacent)

Dua buah simpul pada graf tak berarah dikatakan bertentangga bila keduanya terhubung dengan sebuah sisi. Dapat dikatakan, jika ada v1 dan v2 yang bertetangga, maka harus ada sisi (v1,v2)

2.1.5

Bersisian (Incident)

Untuk sembarang sisi e = (v1,v2), sisi e dikatakan bersisian dengan simpul v1 dan simpul v2.

2.1.6

Simpul Terpencil (Isolated Vertex)

Simpul terpencil adalah simpul yang tidak mempunyai sisi yang bersisian dengannya. Dengan kata lain, simpul ini ialah simpul yang tidak satupun bertetangga dengan simpulsimpul lain. 2.1.7 Graf Kosong (Empty Graf)

Graf kosong yaitu graf yang himpunan sisinya merupakan himpunan kosong.

2.1.8

Lintasan (Path)

Lintasan yang panjangnya n dari simpul awal v0 ke simpul akhir vn di dalam graf G ialah barisan berselang-seling simpulsimpul dan sisi-sisi yang berbentuk v0, e1, v1, e2, , vn-1, en, vn sedemikian sehingga e1=(v0,v1), e2=(v1,v2), , en=(vn-1,vn) adalah sisi-sisi dari graf G.

2.1.9

Siklus (Cycle) atau Sirkuit (Circuit)

Lintasan yang berawal dan berakhir pada simpul yang sama disebut siklus atau sirkuit.

2.1.10 Terhubung (Connected)


Graf disebut graf terhubung jika untuk setiap pasang simpul v1 dan v2 di dalam himpunan V terdapat lintasan dari v1 ke v2, yang juga berarrti ada lintasan dari v2 ke v1 (untuk graf berarah).

2.1.11 Upagraf (Subgraf) dan Komplemen Upagraf


Misalkan G = {V,E} sebuah graf, G1 = {V1,E1} dikatakan upagraf dari G jika V1 V dan E1 E. Komplemen dari upagraf G1 terhadap G adalah graf G2 = {V2,E2} sedemikian sehingga E2 = E E1 dan V2 adalah himpunan simpul yang anggota-anggota E2 bersisian dengannya. 2.1.12 Upagraf Merentang (Spanning Subgraf) Upagraf G1 = {V1,E1} dari G = {V,E} dikatakan upagraf merentang jika V1=V, G1 mengandung semua simpul G.

2.1.13 Pohon (Tree)

Pohon adalah graf tak berarah terhubung yang tidak mempunyai sirkuit.

2.2

Representasi Graf

Untuk maksud pemodelan graf, pemrosesan graf dalam program komputer graf harus direpresentasikan di dalam memori. Ada beberapa cara dalam merepresentasikan sebuah graf:

2.2.1 Himpunan Simpul dan Sisi (Set)


Representasi ini adalah permodelan yang paling mendekati dengan definisi graf itu sendiri. Secara umum graf dengan representasi himpunan dapat digambarkan sebagai berikut: - Graf memiliki dua komponen, dalam hal ini tipe dari graf adalah tipe bentukan (record) dengan himpunan simpul dan sisi sebagai komponennya. - Himpunan simpul dapat direpresentasikan dalam himpunan yang beranggotakan huruf-huruf yang melambangkan setiap simpul (set of char) - Himpunan sisi beranggotakan sisi-sisi yang juga merupakan tipe bentukan dari 2 simpul. Jika graf merupakan graf berbobot, ditambahkan 1 komponen lagi pada sisi, yaitu bobot dari sisi itu.

Gambar 5: Graf G4 Graf G4 dapat direpresentasikan sebagai berikut: G = (V,E) V = {A,B,C,D} E = {(A,D,15), (B,A,10), (B,C,12), (C,A,14), (C,B,8),(C,D,9)} Karena keterbatasan penggunaan himpunan dalam bahasa Pascal, kita dapat menggunakan larik (array) sebagai pengganti himpunan. Sehingga dapat dituliskan: E1 = (A,D,15) E2 = (B,A,10) E3 = (B,C,12) E4 = (C,A,14) E5 = (C,B,8) E6 = (C,D,9) 2.2.2 Matriks Ketetanggaan (Matrix) Dalam merepresentasikan graf dengan matriks kita dapat menggunakan larik 2 dimensi. Dimana setiap indeks yang digunakan melambangkan simpul-simpul yang ada dan isi dari larik itu adalah kondisi keterhubungan antara simpul atau bobot dari sisi yang menghubungkan 2 simpul tersebut.

Untuk graf G4 diatas, matriks ketetanggaan yang bisa dituliskan: Lambang tak hingga () berarti tidak ada sisi yang menghubungkan kedua simpul tersebut. Dengan representasi matriks ini, hubungan antar simpul lebih terlihat. Graf yang direpresentasikan pun lebih tergambar dibenak kita. Oleh karena itu, matriks ketetanggaan lebih sering digunakan.

2.2.3 Senarai Ketetanggan (List)


Hampir sama dengan matriks ketetanggaan, namun kali ini kita menggunakan kombinasi antara larik dengan senarai berkait (linked list). Gambarannya dalah sebagai berikut: - Kita menggunakan simpul sebagai indeks larik. - Larik itu merupakan list yang menunjuk ke list lain yang berisi info berupa simpul yang bertetanggan dengan indeks. List ini tidak menunjuk kemanapun (NULL) jika indeks tidak memiliki tetangga dengan simpul yang lain - Kembali, list yang ditunjuk tadi menunjuk list lain yang bertetanggan dengan indeks. - Hal ini terus diulang sebanyak simpul yang bertetangga dengan indeks tersebut. Untuk graf G4 representasinya adalah sebagai berikut: A:D Karena tidak bisa menjelaskan bobot dari sisi B : A, C yang menghubungkan simpul-simpul graf, C : A, B, D representasi ini tidak digunakan dalam D:pembahasan kali ini.

2.3

Pohon

Sesuai permasalahan yang akan diketengahkan, kita akan membahas graf yang tidak berarah serta tidak mempunyai sirkuit. Sebelum beranjak ke permasalahan utama, terlebih dulu kita sajikan beberapa sifat-sifat pohon: Misalkan G = (V,E) adalah graf tak berarah sederhana dengan jumlah simpulnya n, maka semua pernyataan dibawah ini adalah ekuivalen: a. G adalah pohon. b. Setiap pasang simpul di dalam G terhubung dengan lintasan tunggal. c. G terhubung dan memiliki m = n1 buah sisi. d. G tidak mengandung sirkuit dan memiliki m=n1 buah sisi. e. G tidak mengandung sirkuit dan penambahan satu sisi pada graf akan membuatnya memiliki satu sirkuit. f. G terhubung dan semua sisinya adalah jembatan, yaitu sisi yang bila dihapus menyebabkan graf terpecah menjadi dua komponen. Semua butir diatas juga dapat diangap sebagai definisi dari pohon.

Gambar 6: Tiga Pohon yang Membentuk Hutan Kita dapat mengatakan bahwa beberapa pohon dapat membentuk hutan. Hutan adalah kumpulan pohon yang saling lepas. 2.3.1 Pohon Merentang (Spanning Tree)

Misalkan G = (V,E) adalah graf tak berarah terhubung yang bukan pohon, berarti G memiliki beberapa sirkuit. G dapat diubah menjadi pohon T = (V1,E1) dengan memutuskan sirkuit-sirkuit yang ada. Caranya, mula-mula dipilih sebuah sirkuit, lalu hapus satu buah sisi dari sirkuit ini. G akan tetap terhubung dan jumlah sirkuitnya berkurang satu. Bila proses ini dilakukan berulang-ulang sampai semua sirkuit di G hilang, maka G menjadi sebuah pohon T, yang dinamakan pohon merentang. Walaupun semua pohon bisa dikatakan graf merentang, pohon merentang merupakan graf dengan semua simpul pada simpul T sama dengan semua simpul pada G dan himpunana sisi-sisi pada pohon T merupakan himpunan bagian dari himpunana sisi-sisi pada graf G. Dengan kata lain, jika upagraf dari graf terhubung berbentuk pohon, maka upagraf rentang tersebut dinamakan pohon merentang.

2.3.2 Algoritma Pohon Merentang Minimum


Sebenarnya ada banyak teknik pemecahan masalah pembuatan pohon merentang minimum ini. Namun pada makalah ini hanya dibahas mengenai algoritma kruskal saja. Algoritma Kruskal adalah juga tergolong algoritma greedy dalam teori graf yang digunakan untuk mencari pohon merentang minimum. Algoritma greedy adalah algoritma yang memecahkan masalah langkah per langkah, pada setiap langkah : - Mengambil pilihan yang terbaik yang dapat diperoleh saat itu tanpa memperhatikan konsekuensi ke depan (prinsip take what you can get now!)

- Berharap bahwa dengan memilih optimum lokal pada

setiap langkah akan berakhir dengan optimum global Algoritma Kruskalpertama kali muncul pada tahun 1956 dalam sebuah tulisan yang ditulis oleh Joseph Kruskal. Algoritmanya:
1. Himpunan sisi dari G diurutkan membesar sesuai bobot sisi 2. Buat T dengan memasukkan 1 sisi terpendek dari G 3. Ulang (banyak sisi T = (banyak simpul G) -1) a. Ambil sisi selanjutnya dari G. b. Jika sisi itu tidak membuat sirkuit di T - Masukkan sisi itu ke T. - Masukkan simpul-simpul sisi itu ke T. Pada algoritma kruskal, sisi-sisi graf diurut terlebih dahulu berdasarkan bobotnya dari kecil ke besar. Sisi yang dimasukkan ke dalam himpunan T adalah sisi graf G sedemikian sehingga T adalah pohon. Pada keadaan awal, sisi-sisi sudah diurut berdasarkan bobot membentuk hutan, masing-masing pohon di hutan hanya berupa satu buah simpul, hutan tersebut dinamakan hutan merentang (spanning forest). Sisi dari graf G ditambahkan ke T jika ia tidak membentuk siklus di T.

BAB III PEMBAHASAN


3.1. Contoh Kasus / Hitungan Manual
Algoritma Kruskal digunakan untuk menyelesaikan persoalan pedagang keliling (travelling salesperson problem). Penggambaran yang sangat sederhana dari istilah Traveling Salesperson Problem (TSP) adalah seorang salesman keliling yang harus mengunjungi n kota dengan aturan sebagai berikut : 1. Ia harus mengunjungi setiap kota hanya sebanyak satu kali. 2. Ia harus meminimalisasi total jarak perjalanannya. 3. Pada akhirnya ia harus kembali ke kota asalnya. Dengan demikian, apa yang telah ia lakukan tersebut akan kita sebut sebagai sebuah tour. Guna memudahkan permasalahan, pemetaan n kota tersebut akan digambarkan dengan sebuah graph, dimana jumlah vertice dan edge-nya terbatas (sebuah vertice akan mewakili sebuah kota dan sebuah edge akan mewakili jarak antar dua kota yang dihubungkannya). Penanganan problem TSP ini ekuivalen dengan mencari sirkuit Hamiltonian terpendek. Terdapat berbagai algoritma yang dapat diterapkan untuk menangani kasus TSP ini, mulai dari exhaustive search hingga dynamic programming. Akan tetapi saat ini yang akan digunakan adalah algoritma Greedy. Strategi greedy yang digunakan untuk memilih kota berikutnya yang akan dikunjungi adalah sebagai berikut : Pada setiap langkah, akan dipilih kota yang belum pernah dikunjungi, dimana kota tersebut memiliki jarak terdekat dari kota sebelumnya, berdasarkan aturan tersebut dapat dilihat bahwa greedy tidak mempertimbangkan nilai heuristic (dalam hal ini bisa berupa jarak langsung antara dua kota).

3.2. Flowchart dan Pseudocode 3.2.1 Flowchart

start

Input true node , barrier node , wall node

Set prioritas semua edge true node true node 0 W node true node 1 all W node siku node 2 all Barrier node true node -1 Barrier node barrier node -2

Pengurutan sem edge ua berdasarkan prioritas dan jarak

Proses pencarian spanning tree dengan metode kruskal

I 1 to jum edge lah yang terpilih

Apakah menghubungkan barrier node barrier node

Hapus node

Apakah menghubungkan barrier node true node

Hapus node

3.2.2 Pseudocode Fungsi kruskal (G) Untuk masing-masing vertek V di G do

Definisi dasar pengelompokan C(V){V} Pada permulaannya dibuat pengurutan prioritas Q yang mengandung semua edges didalam G, menggunakan berat sebagai dasar pengurutan. Medifinisikan sebuah pohon Ttidak nol{T akan memiliki edges yang tak hingga dari mst dan n adalah totl nomor verteks} While T < n-1 do {edge u,v adalah jarak terpendek terhadap rute dari atau ke V} (u,v)Q removemin() {mencegah perputaran di T, dengan menambahkan u,v hanya jika T tidak mengandung bagian diantara u dan v dan sebagai catatan, kelompok mengandung lebih dari satu verteks hanya jikaedge mengandung sepasang vertices telah ditambahkan ke pohon} C(V) mengandung V dan C(U) mengandung U C(V) tidak sama dengan C(U) then Menambah edge (V,U) ke T Penggabungan C(V) dan C(U) kedalam satu kelompok, itu merupakan gabungan C(V) dan C(U) Retun pohon T *secara sistematis kruskal(V,E,w) 1. A tidak kosong 2. for each v in V 3. do make-set(v) 4. sort(E,w) 5. for each (u, v) in (sorted) E 6. do if Find-Set(u) 6= Find-Set(v) 7. then A A [ {(u, v)} 8. Union(u, v)return A 3.3. Desain Interface sebelum algoritma kruskal dilakukan

Setelah algoritma kruskal

3.4. Listing Program NO SOURCE CODE

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.

unit U_MinimalSpan; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ShellAPI, StdCtrls, Menus, UGeometry, DFFUtils, UTGraphSearch; procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ResetBtnClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure DeleteVertex1Click(Sender: TObject); procedure Delete1Click(Sender: TObject); procedure Changeweight1Click(Sender: TObject); procedure EdgeStartClick(Sender: TObject); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure Load1Click(Sender: TObject); procedure SaveAs1Click(Sender: TObject); procedure KruskalsBtnClick(Sender: TObject); procedure Save1Click(Sender: TObject); procedure Movevertex1Click(Sender: TObject); procedure StaticText1Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure ClearBtnClick(Sender: TObject); public GraphList:TGraphlist; nextVertexNbr:char; StartVertex:TNode; vertex1:TNode; SelectedEdge:TEdge; mouseuppoint:TPoint; lastdragpoint:TPoint;

33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.

ScreenMouseUpPoint:TPoint; filename:string; MakingEdge:boolean; MovingVertex:boolean; modified:boolean; highlights:boolean; function Onvertex(x,y:integer; var vertex:TNode):boolean; function Onedge(x,y:integer; var edge:TEdge):boolean; function makenewvertex(x,y:integer):string; procedure makeedgetohere; procedure drawimage; function checkmodified:boolean; procedure Setfilename(const newname:string); end; var Form1: TForm1; implementation {$R *.DFM} var nodesize:integer=5; function TForm1.Onvertex(x,y:integer; var vertex:TNode):boolean; var i:integer; v:TNode; begin result:=false; with graphlist do for i:=0 to count-1 do begin v:=TNode(objects[i]); if (v.x-nodesize<x) and (x<v.x+nodesize) and (v.y-nodesize<y) and (y<v.y+nodesize)

66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98.

then begin vertex:=v; result:=true; break; end; end; end; function TForm1.Onedge(x,y:integer; var Edge:TEdge):boolean; begin if graphlist.closetoedge(x,y,10, Edge) then result:=true else result:=false; end; function TForm1.makeNewVertex(x,y:Integer):string; var index:integer; begin if graphlist.addnode(nextvertexnbr,x,y) then begin graphlist.find(nextvertexnbr,index); nextvertexnbr:=succ(nextvertexnbr); drawimage; modified:=true; end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var p:Tpoint; begin mouseuppoint:=point(x,y);

99. 100. 101. 102. 103. 104. 105. 106. 107. 108. A 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. A 132. 133.

p:=image1.clienttoscreen(point(x,y)); ScreenMouseUpPoint:=p; if highlights then begin graphlist.resetallhighlight; drawimage; highlights:=false; end; if movingvertex then begin graphlist.moveNode(graphlist[vertex1.index],point(x,y)); drawimage; movingvertex:=false; image1.cursor:=crdefault; modified:=true; end else if onvertex(x,y,vertex1) then begin if makingedge then begin if (vertex1<>startvertex) then begin makeedgetohere; end; makingedge:=false; end else vertexmenu.popup(p.x,p.y); end else if onEdge(x,y, selectededge) then edgemenu.popup(p.x,p.y) else makeNewVertex(x,y); end; function TForm1.checkmodified: boolean; var mr:integer; begin

134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169.

result:=true; if modified then begin mr:=messagedlg('Save current graph first?',mtconfirmation,[mbyes,mbno,mbcancel],0); if mr=mrcancel then result:=false else modified:=false; if mr=mryes then saveas1click(self); end; end; procedure TForm1.ResetBtnClick(Sender: TObject); begin if checkmodified then begin nextvertexnbr:='A'; if assigned(Graphlist) then Graphlist.free; Graphlist:=TGraphlist.create; drawimage; setfileName(''); makingedge:=false; movingVertex:=false; image1.cursor:=crdefault; statictext2.caption:='Current graph file: None'; end; end; procedure TForm1.ClearBtnClick(Sender: TObject); var i,j:integer; begin with graphlist do for i:= 0 to graphlist.count-1 do with TNode(graphlist.objects[i]) do for j:=0 to nbradjacents-1 do adjacents[j].highlight:=false; drawimage; end;

170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206.

procedure TForm1.drawimage; var i,j:integer; temp,temp2:TNode; L,L2:TLine; begin with image1, canvas, graphlist do begin If not makingedge then fillrect(clientrect); if count>0 then begin pen.color:=clblack; for i:=0 to count-1 do begin temp:=TNode(objects[i]); with temp do begin L.p1.x:=temp.x; L.p1.y:=temp.y; if nbradjacents>0 then for j:=0 to nbradjacents-1 do begin if adjacents[j].highlight then pen.width:=3 else pen.width:=1; temp2:=TNode(objects[adjacents[j].tonodeIndex]); moveto(temp.x,temp.y); lineto(temp2.x,temp2.y); L.p2.x:=temp2.x; L.p2.y:=temp2.y; L2:=AngledLineFromLine(L, point((L.p1.x+L.P2.x) div 2,(L.p1.y+L.P2.y) div 2),8, Pi/2); with L2.p2 do textout(x-4,y7,inttostr(adjacents[j].weight)); end; end; end; pen.width:=1; for i :=0 to count-1 do begin temp:=TNode(objects[i]);

207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243.

with temp do begin ellipse(x-nodesize,ynodesize,x+nodesize,y+nodesize); textout(x-4,y-7,strings[i]); end; end; end; end; end; procedure TForm1.FormActivate(Sender: TObject); var i:integer; s:string; begin nodesize:=10; resetbtnclick(self); s:=extractfilepath(application.exename); opendialog1.initialdir:=s; savedialog1.initialdir:=s; if fileexists(s+'Default.gra') then with graphlist do begin setfilename(s+'Default.gra'); loadgraph(filename); for i:= 0 to count-1 do if succ(strings[i][1])>nextvertexnbr then nextvertexnbr:=succ(strings[i][1]); end else filename:=''; drawimage; modified:=false; setMemoMargins(memo1,10,10,10,10); reformatMemo(memo1); end; procedure TForm1.DeleteVertex1Click(Sender: TObject);

244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278.

begin with graphlist do deletenode(strings[vertex1.index]); drawimage; modified:=true; end; procedure TForm1.Delete1Click(Sender: TObject); begin graphlist.deleteedge(selectededge); drawimage; modified:=true; end; procedure TForm1.Changeweight1Click(Sender: TObject); var s:string; i:integer; begin with graphlist, selectededge do begin s:=InputBox('Edge weight', 'enter new weight for edge from ' +strings[fromnodeindex] +' to ' + strings[tonodeindex], inttostr(weight)); weight:=strtoint(s); with TNode(objects[fromnodeIndex]) do begin for i:=0 to nbradjacents-1 do with adjacents[i] do begin if tonodeindex=selectededge.tonodeindex then begin weight:=selectededge.weight; break; end; end; end; end;

279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313.

drawimage; modified:=true; end; procedure TForm1.EdgeStartClick(Sender: TObject); begin startvertex:=vertex1; makingedge:=true; lastdragpoint:=point(-1,-1); end; procedure TForm1.makeedgetohere; begin if startvertex<>vertex1 then begin graphlist.addedge(startvertex,vertex1,5); makingedge:=false; drawimage; modified:=true; end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if makingedge then with image1.canvas do begin if lastdragpoint.x>=0 then with lastdragpoint do begin pen.color:=clwhite; ellipse(x-nodesize,y-nodesize,x+nodesize,y+nodesize); end; pen.color:=cllime; if (abs(x-startvertex.x)>2*nodesize) or (abs(y-

314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349.

startvertex.y)>2*nodesize) then ellipse(x-nodesize,ynodesize,x+nodesize,y+nodesize); drawimage; end else if movingVertex then begin graphlist.movenode(graphlist[vertex1.index],point(x,y)); drawimage; end; lastdragpoint:=point(x,y); end; procedure TForm1.Load1Click(Sender: TObject); var i:integer; begin if checkmodified then If opendialog1.execute then with graphlist do begin nextvertexnbr:='A'; loadgraph(opendialog1.filename); for i:= 0 to count-1 do if succ(strings[i][1])>nextvertexnbr then nextvertexnbr:=succ(strings[i][1]); setfilename(opendialog1.filename); drawimage; modified:=false; end; end; procedure TForm1.SaveAs1Click(Sender: TObject); begin if saveDialog1.execute then begin graphlist.savegraph(savedialog1.filename); setfilename(savedialog1.filename); modified:=false;

350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383.

end; end; procedure TForm1.Save1Click(Sender: TObject); begin if filename<>'' then begin graphlist.savegraph(filename); modified:=false; end else saveas1click(sender); end; procedure TForm1.SetFileName(const newname:string); begin filename:=newname; if newname<>'' then statictext2.caption:='Current graph file: '+filename else statictext2.caption:='No graph file open'; end; type Tspantree=record dad:integer; v1,v2:integer; end; procedure TForm1.KruskalsBtnClick(Sender: TObject); var parent:array of integer ; nbrnodes:integer; list:TStringlist; totweight:integer; connected:array of boolean; i,j,k:integer; connectedcount:integer; newweight:integer; w:string;

384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417.

n1,n2:integer; weight:integer; function sametree(n1,n2:integer):boolean; var i,j:integer; begin i:=n1; while parent[i]>=0 do i:=parent[i]; j:=n2; while parent[j]>=0 do j:=parent[j]; if i<>j then parent[j]:=i; result:= i=j; end; procedure swap(var a,b:integer); var t:integer; begin t:=a; a:=b; b:=t; end; begin graphlist.resetallhighlight; highlights:=false; memo2.clear; list:=tstringlist.Create; totweight:=0; nbrnodes:=GRAPHLIST.COUNT; setlength(connected,nbrnodes); for k:=0 to nbrnodes-1 do connected[k]:=false; for i:=0 to graphlist.count-1 do with graphlist, Tnode(objects[i]) do begin if nbradjacents >0 then for j:=0 to nbradjacents-1 do

418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455.

with adjacents[j] do begin n1:=fromnodeindex; n2:=tonodeindex; if n2<n1 then swap(n1,n2); list.add(format('%3d%2d%2d',[weight,n1,n2])); inc(totweight,weight); end; end; list.sort; with memo2.lines do begin add(inttostr(Graphlist.count) +' vertices'); add(inttostr(list.count)+' edges'); add('Total weight: '+inttostr(totweight)); add('-------------------'); add('Minimal Spanning tree (Kruskal''s Algorithm):'); end; connectedcount:=1; newweight:=0; setlength(parent,nbrnodes); for i:=0 to nbrnodes-1 do parent[i]{.dad}:=-1; for i:= 0 to list.count-1 do begin w:=list[i]; n1:=strtoint(copy(w,4,2)); n2:=strtoint(copy(w,6,2)); if (not sametree(n1,n2)) then begin weight:=strtoint(copy(w,1,3)); inc(newweight,weight); with graphlist do begin memo2.lines.add(format('(Connect %2s to %2s, Weight %d)',[strings[n1],strings[n2],weight])); SetHighlight(strings[n1],strings[n2],true); drawimage;

456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. A 489. A 490. A

image1.update; sleep(1000); end; inc(connectedcount); end; if connectedcount>=nbrnodes then break; end; if connectedcount<nbrnodes-1 then memo2.lines.add('Graph is not connected, no spanning tree exists') else with memo2.lines do begin add(' Edges: '+inttostr(connectedcount-1)); add(' Weight: '+inttostr(newweight)); end; drawimage; highlights:=true; list.free; end; procedure TForm1.MoveVertex1Click(Sender: TObject); begin mouse.CursorPos:=ScreenMouseUpPoint; MovingVertex:=true; image1.cursor:=crhandpoint; end; procedure TForm1.StaticText1Click(Sender: TObject); begin ShellExecute(Handle, 'open', 'matematika2008', nil, nil, SW_SHOWNORMAL) ; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if checkmodified then canclose:=true else canclose:=false;

end; 491. A 492. A 493. A 494. A 495. A 496. end.

3.2. Penjelasan Program


Berdasarkan Hasil Keluaran

*Grafik mula-mula yang dibentuk pada awal pertama dibuat dan telah diberi bobot pada masingmasing garis

*AD dan CE merupakan 2 garis terpendek yang memiliki bobot 5. Maka AD terpilih terlebih dulu sesuai penamaanya.

*Grafik ini menunjukkan CE terpilih karena tidak membentuk siklus *DF merupakan terpendek dengan terpendek ketiga garis bobot

*garis terpendek selanjutnya adalah garis AB dan BE, namun sesuai denganpenamaan maka AB terebih dahulu. BD berubah warna karena membentuk putaran *DF merupakan garis terpendek dengan bobot terpendek ketiga. Garis yang tidak terpilih dan membentuk putaran berubah warna

*EG merupakan jarak terpendek terakhir dari proses minimumspanning tree dengan algoritma kruskal

Berdasarkan Lama Waktu yang Dibutuhkan Perkiraan total waktu yang dibutuhkan : TK(V,E) = E 2log E + 1 + E(1+1) + V(1+1) = E 2log E + 2V + 2E + 1 Sehingga kompleksitas algoritmanya: O(E log E + V), dengan E menyatakan banyaknya sisi dan V menyatakan banyaknya simpul. Sebenarnya, akan dilakukan percobaan dengan menghitung waktu eksekusi dari program yang dijalankan dengan memasukkan beberapa contoh masukkan yang berbeda beda Berdasarkan

BAB IV KESIMPULAN
Permasalahan yang berhubungan dengan graf, khusunya dalam kasus menentukan jarak terpendek, dapat diselesaikan dengan menggunakan algoritma kruskal. Algoritma kruskal adalah algoritma yang bekerja dengan cara, mengurutkan sisisisi graf berdasarkan bobotnya dari kecil ke besar. Sisi yang dimasukkan ke dalam himpunan T adalah sisi graf G sedemikian sehingga T adalah pohon. Pada keadaan awal, sisisisi sudah diurut berdasarkan bobot membentuk hutan, masing-masing pohon dihutan hanya berupa satu buah simpul, hutan tersebut dinamakan hutan merentang (spanning forest). Sisi dari graf G ditambahkan ke T jika ia tidak membentuk siklus di T. Algortma kruskal merupakan algoritma yang efisien dalam mencari MST pada graf yang diberikan memiliki banyak simpul dengan sisi yang sedikit.

Daftar Pustaka
Algorithms Design Manual. (1997), http://www2.toki.or.id/book/AlgDesignManual/ Tanggal akses: 2 Januari 2006 pukul 10:30. Brassard, Gilles. (1995). Fundamental of Algorithms. Prentice Hall, New Jersey. Boruvka's algorithm - Wikipedia, the free encyclopedia http://en.wikipedia.org/boruvkas_algorithm.htm . Tanggal akses: 28 Desember2006 pukul 13.32. English Wikipedia, Ensiklopedia Bebas. (1997), http://en.wikipedia.org/wiki/ Tanggal akses: 2 Januari 2006 pukul 11:00. Kruskal's algorithm - Wikipedia, the free encyclopedia http://en.wikipedia.org/kruskals_algorith m.htm . Tanggal akses: 28 Desember 2006 pukul 13.32. Morris, John. (1998). Data Structures and Algorithm .http://www.cs.auckland.ac.nz. Tanggal akses: 28 Desember 2006 pukul 13.32

Munir, Rinaldi. (2005). Bahan Kuliah IF2151 Matematika Diskrit. Sekolah Teknik Elektro dan Informatika, Institut Teknologi Bandung. Munir, Rinaldi. 2003. Matematika\ Diskrit. Bandung. Informatika Munir, Rinaldi. 2004. Handout Bahan Kuliah ke 1-4. Bandung. ITB Stony Brook Algorithm. (1997), http://www.cs.sunusb.edu/ Tanggal akses: 2 Januari 2006 pukul 11:30