Professional Documents
Culture Documents
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
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
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.
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:
Graf berarah adalah graf yang setiap sisinya diberi orientasi arah. Dalam hal ini sisi yang ditulis (v1,v2) berbeda dengan sisi (v2,v1)
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.
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 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
Lintasan yang berawal dan berakhir pada simpul yang sama disebut siklus atau sirkuit.
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:
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.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.
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.
start
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
Hapus node
Hapus node
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
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;
*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