4.1 Implementasi Program
4.1.1.4. Iterasi Algoritma Dijkstra
Pada tahap ini ada beberapa tahap yang harus dilakukan untuk mendapatkan jarak dan jalur terpendek dari pintu masuk sampai ke ruangan yang ingin di kunjungi oleh penguna program bantu ini, berikut ini adalah tahap-tahap iterasi algoritma dijkstra :
a. Menghitung jarak antara titik awal dengan semua titik-titik yang merupakan titik yang termasuk dalam ruang lingkup hasil dari langkah3. Setelah di dapatkan data jarak, maka semua data pada iterasi ini disimpan pada tabel bantuan yaitu tabel iterasi_jarak. Berikut listing store prosedur nya:
47
set titik_terpilih=kode_asal;
update titik set status1 = 0 where kode_titik=titik_terpilih;
select count(*) into jumlah from titik; set jumlah=jumlah+1;
while x<jumlah do
select kode_titik into in_kode_titik from titik where nomor=x;
select status1 into status_titik from titik where nomor=x;
if status_titik=1 then
CALL ambil_jarak (kode_asal, in_kode_titik, @jarak);
select @jarak into in_jarak;
insert into iterasi_jarak values(in_iterasiku,x, kode_asal,in_kode_titik,in_jarak);
set x=x+1; else
insert into iterasi_jarak values (in_iterasiku, x,kode_asal,in_kode_titik,999);
set x=x+1; end if;
end while;
set kode_asalku=kode_asal;
b. Pengecekan apakah titik tujuan telah masuk kedalam himpunan titik terpilih. Selama hasil pengecekan bernilai salah, berarti titik tujuan belum masuk ke dalam himpunan titik terpilih dalam jalur terpendek. Sehingga akan dilakukan 2 langkah yaitu :
b1. Pilih titik terpilih yang termasuk dalam dalam ruang lingkup ( iterasi terakhir ) dengan jarak terkecil. Berikut listing store prosedurnya :
if z>1 then
select kode_titik into kode_asalku from titik_terpilih where iterasi=in_iterasi;
end if;
call pilih_jaral_terpendek (in_iterasiku, @jarak, @titik);
select @jarak into in_jarak;
set jarak_sementara=in_jarak; select @titik into in_titik;
set titik_terpilih=in_titik;
insert into titik_terpilih values (in_iterasiku, in_titik,in_jarak);
set waktu_iterasi = timediff (waktu_akhir_iterasi, waktu_awal_iterasi);
insert into detail_waktu_iterasi values (kode_asalku, in_titik,waktu_awal_iterasi,waktu_akhir_iterasi); set waktu_awal_iterasi=curtime(); if in_iterasiku=1 then set total_waktu_iterasi=waktu_iterasi; else set total_waktu_iterasi1=waktu_iterasi;
set total_waktu_iterasi = addtime (total_waktu_iterasi, total_waktu_iterasi1);
end if;
insert into waktu_iterasi values (in_iterasiku, kode_asalku,in_titik,waktu_iterasi);
set in_iterasi=in_iterasiku; set in_iterasiku=in_iterasiku+1;
update titik set status1 = 0 where kode_titik = titik_terpilih;
b2. Ruang lingkup titik – titik yang harus di cek akan dikurangi dengan titik terpilih hasil dari langkah c1. Selanjutnya akan dilakukan lagi pengecekan jarak dari titik terpilih hasil dari langkah c1 dengan semua titik yang masih termasuk dalam ruang lingkup. Setelah di dapatkan data jarak, maka semua data pada iterasi ini disimpan pada tabel bantuan yaitu tabel iterasi_jarak. Berikut listing program pengecekan jarak tersebut :
declare cur1 cursor for select count(*) from titik; declare cur2 cursor for select kode_titik from titik; open cur1;
open cur2;
fetch cur1 into jumlah; set x=1;
set jumlah=jumlah+1; while x < jumlah
do
fetch cur2 into in_kode_titik;
select status1 into status_titik from titik where nomor=x;
if status_titik=1 then
call ambil_jarak2 (in_iterasi, kode_asalku,in_kode_titik,@jarak); select @jarak into in_jarak2; call ambil_jarak3 (titik_terpilih, in_kode_titik,jarak_sementara,@jarak); select @jarak into in_jarak;
49
if in_jarak2>in_jarak then
insert into iterasi_jarak values (in_iterasiku, x,titik_terpilih, in_kode_titik,in_jarak);
else
insert into iterasi_jarak values (in_iterasiku,x,titik_terpilih, in_kode_titik,in_jarak2);
end if;
set x =x+1; else
insert into iterasi_jarak values (in_iterasiku,x,titik_terpilih, in_kode_titik,999); set x =x+1; end if; end while; CLOSE cur1; CLOSE cur2;
Langkah c1 dan c2 akan terus dilakukan selama titik tujuan tidak sama dengan titik terpilih.
c. Jika iterasi telah dihentikan maka akan di telesuri jalur terpendek dari pintu masuk sampai dengan ke ruangan yang ingin dikunjungi oleh pengguna program bantu ini. Dalam penelusuran jalur terpendek ini digunakan listing program sebagai berikut :
select count(*) into jumlah_jalur from titik_terpilih; select jarak into jarak_akhir from titik_terpilih where iterasi=jumlah_jalur;
select kode_titik into jalur_tujuan from titik_terpilih where iterasi=jumlah_jalur;
set kode_awal_jalur=jalur_tujuan;
insert into sementara values(a,jalur_tujuan); set z=1; while jumlah_jalur>1 do set iterasi_sebelum=jumlah_jalur-1; if a=1 then set in_iterasi_sebelum=jumlah_jalur-2; select kode_titik into jalur_asal from
titik_terpilih where iterasi=in_iterasi_sebelum; else
set in_iterasi_sebelum=jumlah_jalur-2; select kode_titik into jalur_asal from
titik_terpilih where iterasi=in_iterasi_sebelum; end if;
select jarak into jarak_jalur from iterasi_jarak where iterasi=iterasi_sebelum and kode_ruangan_asal =
jalur_asal and kode_ruangan_tujuan=jalur_tujuan; set jumlah_jalur=jumlah_jalur-1;
if jarak_jalur <> jarak_akhir then
set waktu_akhir_jalur=curtime();
set waktu_jalur =timediff (waktu_akhir_jalur, waktu_awal_jalur);
set waktu_awal_jalur=curtime(); set a=a+1;
select iterasi into iterasi_titik from titik_terpilih where kode_titik=jalur_asal; set iterasi_titik=iterasi_titik+1;
select kode_titik into jalur_tujuan_sementara from titik_terpilih where iterasi=iterasi_titik; set kode_akhir_jalur=jalur_tujuan_sementara;
insert into sementara values (a,jalur_tujuan_sementara);
select jarak into jarak_jalur_sementara from titik_terpilih where kode_titik =
jalur_tujuan_sementara;
set jarak_akhir=jarak_jalur_sementara; set jalur_tujuan=jalur_tujuan_sementara;
if kode_akhir_jalur <> kode_tujuan then
insert into waktu_penentuan_jalur values (k,kode_awal_jalur,kode_akhir_jalur,waktu_ jalur);
insert into waktu_iterasi_titik
values(kode_awal_jalur,kode_akhir_jalur,wa ktu_awal_jalur,waktu_akhir_jalur); end if; if k=1 then set total_jalur=waktu_jalur; else set total_jalur1=waktu_jalur; set total_jalur = addtime (total_jalur, total_jalur1); end if; set k=k+1; set kode_awal_jalur=kode_akhir_jalur; end if; end while;
4.1.2 Implementasi Pembuatan Output
Pada program bantu ini terdapat 2 macam output yang di hasilkan yaitu output yang berupa informasi mengenai jarak terpendek ( dalam satuan meter ) dan jalur terpendek ( kode ruangan dan nama ruangan ) dari pintu masuk sampai
51
ke ruangan yang ingin di kunjungi oleh pengguna program bantu ini, yang di tampilkan dalam bentuk kalimat dan output visualisasi yang berupa gambar denah RS. Bethesda yang disertai dengan jalur terpendek dari pintu masuk sampai ke ruangan yang ingin di kunjungi oleh pengguna program bantu ini, yang merupakan hasil dari implementasi algoritma dijkstra.
4.1.2.1Output Berupa Kode Ruangan dan Nama Ruangan Jalur Terpendek
Untuk menampilkan kode ruangan dan nama ruangan dari jalur terpendek yang telah di hasilkan dari implementasi algoritma dijkstra maka digunakan function penentuan jalur() untuk memecah array jalur() yang penampung jalur terpendek hasil dari implementasi algoritma dijkstra. Berikut listing program function penentuan jalur():
Public Function penentu_jalur() c = 1
e = 1
Set rs = New ADODB.Recordset
rs.Open " select count(*) as jumlahku from sementara", conn If Not rs.EOF Then
jumlah = rs("jumlahku") b = jumlah End If Set rs = Nothing While jumlah > 0 If jumlah = b Then
Set rs = New ADODB.Recordset
rs.Open " select * from sementara where nomor='" & jumlah & "' ", conn
If Not rs.EOF Then
jalurterpilih = rs("kode_titik") jalur_awal = jalurterpilih
End If
Set rs = Nothing
Set rs = New ADODB.Recordset
rs.Open " select * from ruangan where kode_ruangan='" & jalurterpilih & "'", conn
If Not rs.EOF Then
ruang = rs("nama_ruangan")
jalurterpendek = c & ". " & jalurterpilih & " ( " & ruang & " )"
End If
Set rs = Nothing Else
Set rs = New ADODB.Recordset
rs.Open " select * from sementara where nomor='" & jumlah & "'", conn
If Not rs.EOF Then
jalurterpilih = rs("kode_titik") jalur_akhir = jalurterpilih End If
Set rs = Nothing
Set rs = New ADODB.Recordset
rs.Open " select * from ruangan where kode_ruangan='" & jalurterpilih & "'", conn
If Not rs.EOF Then
ruang = rs("nama_ruangan")
'jalur_terpilih1(c) = jalurterpilih
jalurterpendek = jalurterpendek & vbCrLf & c & ". " & jalurterpilih & " ( " & ruang & " )"
jumlah = jumlah - 1 'd = c - 1 End If Set rs3 = Nothing End If If c >= 2 Then If c = 2 Then jumlah1 = jumlah + 3 Else jumlah1 = jumlah + 2 End If
Set rs = New ADODB.Recordset
rs.Open " select * from sementara where nomor='" & jumlah1 & "'", conn
If Not rs.EOF Then
jalurterpilih = rs("kode_titik") jalur_awal = jalurterpilih
End If
Set rs = Nothing
conn.Execute "call spinjalur('" & e & "','" & jalur_awal & "', '" & jalur_akhir & "') "
e = e + 1 End If
c = c + 1 Wend
hasil_akhir = "Jalur yang terpendek yang bisa dilewati adalah " & vbCrLf & jalurterpendek
53
Keterangan :
a) Untuk memecah data titik terpilih pada tabel bantu sementara maka digunakan perulangan selama semua titik terpilih belum selesai di cek. Dalam perulangan ini, pada iterasi awal dibuat query untuk mengambil data dari tabel ruangan dengan kode_ruangannya adalah titik terpilih pada jalur terpendek yang sedang di cek dalam perulangan ini. Dan variabel jalur terpendek ( penampung hasil yang akan ditampilkan pada output ) akan di isi dengan jumlah titik yang telah di cek di ikuti kode ruangan dan nama ruangan dari titik yang sedang di cek dalam perulangan ini.
b) Kemudian dilanjutkan ke perulangan berikutnya untuk mengecek titik berikutnya, dimana pada perulangan ini dibuat juga query yang sama seperti pada query sebelumnya. Pada perulangan ini variabel jalur terpendek ( penampung hasil yang akan ditampilkan pada output ) akan di isi dengan isi dari variabel jalur terpendek hasil dari perulangan sebelumnya ditambah dengan jumlah titik yang telah di cek di ikuti kode ruangan dan nama ruangan dari titik yang sedang di cek dalam perulangan ini.
c) Dilakukan pemanggilan store prosedur spinjalur() untuk memasukan data jalur dari titik yang di cek pada perulangan sebelumnya ke titik yang sedang di cek pada perulangan saat ini ke dalam tabel bantu jalur yang akan digunakan untuk membuat output berupa gambar denah RS. Bethesda yang di sertai dengan jalur terpendeknya.
d) Perulangan akan dilanjutkan dengan melakukan langkah b dan d. Perulangan akan dihentikan jika titik yang di cek adalah titik awal.
Hasil dari langkah diatas adalah urutan data jalur terpendek ( kode ruangan dan nama ruangan) dari titik awal sampai dengan titik tujuan.
4.1.2.2Output Berupa Denah RS. Bethesda Disertai Jalur Terpendek
Untuk mengimplementasikan visualisasi jalur terpendek hasil dari implementasi algoritma dijkstra ke dalam bentuk gambar, dibutuhkan kontrol line yang akan menunjukan jalur dari pintu masuk sampai ke ruangan yang ingin dikunjungi oleh pengguna program bantu ini. untuk mengerakkan kontrol line tersebut maka dibutukan kontrol timer. Berikut adalah langkah-langkah pengimplementasian jalur terpendek ke bentuk gambar jalur terpendek pada denah RS. Bethesda :
• Memecah tabel jalur yang menyimpan urutan jalur dari titik awal ke titik tujuan. Data pada tabel jalur diambil per record untuk diambil data titik asal dan titik tujuan jalur pertama, kontrol line titik asal dan titik koordinat ke 2 titik tersebut.
• Setelah di peroleh data tersebut maka kontrol line ini digerakan dari koordinat titik asal sampai ke titik tujuan. Berikut listing program untuk menggerakkan kontrol line tersebut :
If nama_line = "L69" Then Line69.BorderColor = vbRed Line69.BorderStyle = 1 Line69.BorderWidth = 3 If y1 < y2 Then If Line69.y2 <> y2 Then If Line69.y2 < y2 Then Line69.y2 = Line69.y2 + 5 Else Line69.y2 = Line69.y2 - 5 End If End If
55 If Line69.y2 = y2 Then Line69.y2 = Line69.y2 If Line69.x2 > x2 Then Line69.x2 = Line69.x2 - 5 Else Line69.x2 = Line69.x2 + 5 End If If Line69.x2 = x2 Then Line69.x2 = Line69.x2 c = c + 1 End If End If Else If Line69.x2 <> x2 Then If Line69.x2 < x2 Then Line69.x2 = Line69.x2 + 5 Else Line69.x2 = Line69.x2 - 5 End If End If If Line69.x2 = x2 Then Line69.x2 = Line69.x2 If Line69.y2 > y2 Then Line69.y2 = Line69.y2 - 5 Else Line69.y2 = Line69.y2 + 5 End If If Line69.y2 = y2 Then Line69.y2 = Line69.y2 c = c + 1 End If End If End If Keterangan :
Kontrol line titik awal akan di beri warna merah dengan ketebelan 3 agar lebih mudah untuk dilihat. Kemudian akan dibandingkan apakah koordinat y2 titik asal lebih kecil dari koordinat y1 titik tujuan. Jika benar maka selama koordinat kontrol line ini belum sampai ke koordinat y1 titik tujuan maka akan dilakukan pengecekan apakah koordinat y2 kontrol line ini lebih besar dari dari y1 koordinat titik tujuan maka koordinat y2 kontrol line ini akan ditambah
5, akan tetapi jika tidak lebih besar maka koordinat y2 kontrol line ini akan di kurangi 5.
Kemudian jika koordinat y1 titik tujuan telah tercapai maka akan dilakukan pengecekan untuk menggerakkan koordianat x2 kontrol line ini. Sama seperti saat menggerakan koordinat y2 kontrol line untuk sampai ke koordinat x1 titik tujuan maka jika koordinat x1 titik tujuan lebih besar dari koordinat x2 kontrol line ini, koordinat x2 kontrol line ini akan ditambah 5 akan tetapi jika tidak lebih besar dari dari x1 koordinat titik tujuan maka koordinat x2 kontrol line ini akan ditambah 5.
Jika koordinat x2 kontrol line ini telah mencapai koordinat x1 titik tujuan maka perulangan untuk memecah tabel jalur yang menyimpan urutan jalur dari titik awal ke titik tujuan dilanjutkan lagi sampai sudah tidak ditemukan record lagi yang harus di cek.