SISTEM CERDAS
PENENTUAN RUTE TERPENDEK PEMETAAN KRPAI PADA KARPET BIRU
MENGGUNAKAN METODE DIJKSTRA BERBASIS VISUAL C++
Oleh:
Kelompok 2
Hanis Bachrodin
120534431416
Hidayatul Kharomah
120534400678
120534400703
PTE D 2012
BAB I
PENDAHULUAN
1.1 LATAR BELAKANG
Kontes Robot Pemadam Api Indonesia (KRPAI) 2015 yang mengusung tema
Kolaborasi Robot Pemadam Api di mana akan dipertandingkan 2 divisi, yaitu: 1)
Divisi Beroda, dan 2) Divisi Berkaki. Pada dasarnya, Tim robot yang memberikan
kontribusi terbanyak dalam memadamkan api akan menjadi pemenang. Oleh Karena itu
dalam kompetisi tersebut dibuat sebuah lapangan pertandingan dengan ukuran 486 cm x
244 cm. Desain lapangan tersebut terdiri dari gabungan dari dua lapangan pemadam api
type Trinity College yang berbentuk simetris (cermin) antara daerah Merah dan daerah
Biru. Lapangan terbuat dari papan multipleks dengan tebal 2 cm. Bentuk dan ukuran
Lapangan ditunjukkan pada Gambar 1. Di mana warna lantai untuk sisi merah maupun
biru sama, yaitu hitam. Pada beberapa tempat dilapisi karpet berwarna merah di sisi
merah dan biru di sisi biru yang lokasinya ditunjukkan pada Gambar 1. sedangkan
dinding berwarna putih.
Berdasarkan latar belakang yang sudah dipaparkan, laporan tugas akhir ini
memiliki rumusan masalah yaitu Bagaimana menentukan rute terpendek yang harus
ditempuh robot agar sampai pada goal dengan waktu tersingkat menggunakan metode
dijkstra pada karpet biru?
1.3 TUJUAN
Berdasarkan rumusan masalah yang telah dipaparkan, laporan tugas akhir ini
memiliki tujuan Untuk menentukan rute terpendek dengan waktu tersingkat
menggunakan metode dijkstra pada karpet biru.
BAB II
LANDASAN TEORI
Pertama-tama tentukan titik mana yang akan menjadi node awal, lalu beri bobot
jarak pada node pertama ke node terdekat satu per satu, Dijkstra akan melakukan
pengembangan pencarian dari satu titik ke titik lain dan ke titik selanjutnya tahap demi
tahap. Inilah urutan logika dari algoritma Dijkstra:
1.
Beri nilai bobot (jarak) untuk setiap titik ke titik lainnya, lalu set nilai 0 pada node
awal dan nilai tak hingga terhadap node lain (belum terisi)
2.
Set semua node Belum terjamah dan set node awal sebagai Node keberangkatan
3.
Dari node keberangkatan, pertimbangkan node tetangga yang belum terjamah dan
hitung jaraknya dari titik keberangkatan. Sebagai contoh, jika titik keberangkatan A
ke B memiliki bobot jarak 6 dan dari B ke node C berjarak 2, maka jarak ke C
melewati B menjadi 6+2=8. Jika jarak ini lebih kecil dari jarak sebelumnya (yang
telah terekam sebelumnya) hapus data lama, simpan ulang data jarak dengan jarak
yang baru.
4.
Saat kita selesai mempertimbangkan setiap jarak terhadap node tetangga, tandai
node yang telah terjamah sebagai Node terjamah. Node terjamah tidak akan
pernah di cek kembali, jarak yang disimpan adalah jarak terakhir dan yang paling
minimal bobotnya.
5.
Set Node belum terjamah dengan jarak terkecil (dari node keberangkatan) sebagai
Node Keberangkatan selanjutnya dan lanjutkan dengan kembali ke step 3.
BAB III
METODOLOGI
3.1 PERANCANGAN PROGRAM
Dalam hal ini hasil tugas akhir yang dibuat ialah berbentuk softfile program untuk
mempresentasikan algoritma dijkstra pada penentuan rute terpendek pemetaan KRPAI di
karpet biru sehingga perancangan yang dibutuhkan berupa:
1. Pemetaan KRPAI
2. Matriks:
a. Matriks koneksi
b. Matriks bobot
c. Matriks jarak
3. Compiler Visual C++
3.2 LANGKAH PEMBUATAN PERANCANGAN
1. Pemetaan KRPAI
Pemetaan KRPAI memiliki kandidat letak lilin yang ditunjukkan pada Gambar
2. posisi start berada di lorong.
sudah dilalui maka node tersebut akan menjadi node start untuk node goal
selanjutnya.
5.
2. Matriks
Matriks yang dipakai ialah matriks 18x18
a. Matriks koneksi
Menyatakan koneksi node. Jika node tersebut berhubungan akan bernilai 1 dan
jika node tidak berhubungan atau node itu sendiri akan bernilai 0.
b. Matriks bobot
Menyatakan bobot dari tiap node yang berhubungan namun jika node yang
bersangkutan tidak berhubungan maka akan bernilai .
c. Matriks jarak
Menyatakan jarak yang harus ditempuh oleh sebuah node untuk sampai ke
node yang dituju atau node yang bersangkutan.
3. Compiler C++
Dengan menggunakan compiler C++ script program dijkstra ialah sebagai
berikut:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
//file header untuk melibatkan obyek printf dan scanf
//pendeklarasian variabel bertipe int
int rumus,v,data_sebelumnya=99999,baris=99999;
int titik_dilewati[18],titik_awal,titik_akhir,iterasi=0;
//pendeklarasian array dari matriks
int koneksi[18][18]=
{
{0,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
{1,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
1,
{0,
0,
1,
0,
0,
0,
0,
0,
1,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
1,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0},
1,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0},
0,
1,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
1,
0,
1,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
1,
0,
1,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
1,
0,
1,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
1,
0,
1,
{0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
1,
0,
{0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
1,
{0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
1,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
1,
0,
0,
0,
1,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
1,
0,
0,
0,
1,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
1},
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0}
},
int bobot[18][18]=
{
{0,
72,
164,
0,
0,
0,
0,
0,
0,
0,
0,
0,
{72,
0,
0,
0,
0,
0,
46,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
0,
{164, 0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
141,
{0,
0,
46,
0,
0,
0,
0,
0,
87,
0,
0,
0},
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
{0,
0,
0,
87,
0,
46,
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
46,
0,
0,
0},
143,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
143,
0},
0,
118,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
118,
0,
97,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
97,
0,
24,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
24,
0,
97,
0,
{0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
97,
0,
92,
{0,
0,
0,
0,
141,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
92,
0,
{0,
103, 0,
0,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
103,
{0,
0,
0,
46,
0,
0,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
46,
0,
0,
0,
91,
0,
0,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
91,
0,
0,
0,
70,
0,
0,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
70,
0,
0,
0,
91,
0,
0},
0,
0,
0,
0,
0,
0,
{0,
0,
0,
0,
0,
0,
0,
91,
0,
0,
0,
118},
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
118,
0}
205,
251,
348,
466,
518,
494,
454,
545,
46, 133,
615,
179,
706,
322,
824},
440,
537,
561,
617,
369,
687,
415,
778,
558,
896},
451, 354,
330,
381,
87,
451,
660},
276,
394,
491,
942},
307,
404,
};
int jarak[18][18]=
{
{0
,
72 ,
{72
397,
305,
,
0 ,
164,
408,
236,
118,
469,
{164, 236,
377,
0,
480,
233,
{118, 46 ,
141,
282,
244,
0,
290,
515,
{205, 133,
515,
369,
423,
87,
526,
87,
572,
428,
{251, 179,
525,
415,
510,
613,
133, 46,
659,
479,
556,
{348, 322,
659,
558,
705,
796,
276, 189,
866,
143,
957,
0,
1075},
118,
336,
{466, 440,
428,
451,
531,
577,
394, 307,
668,
261,
738,
118,
829,
0,
947},
97,
218,
{518, 537,
310,
354,
413,
459,
491, 404,
550,
358,
620,
215,
711,
97,
829},
0,
24,
121,
213,
{494, 561,
316,
362,
453,
330, 515, 428,
523,
614,
382, 239,
732},
121,
24,
0,
429,
590,
708},
189,
292,
526,
282,
338,
542,
133,
663,
46,
733,
824,
189,
750,
820,
143,
0,
499,
911,
261,
1029},
358,
382,
215,
239,
121,
97,
{397, 469,
233,
515, 525,
479,
336,
218,
121,
97,
92,
195,
{305, 377,
141,
241,
332,
423, 510,
402,
556,
493,
428,
611},
310,
213,
189,
92,
0,
103,
{408, 480,
244,
149,
240,
526, 613,
310,
659,
401,
531,
528},
413,
316,
292,
195,
137,
577,
0,
103,
{454, 526,
0,
290,
46,
572, 659,
705,
207,
459,
298,
362,
416},
338,
241,
149,
{545, 617,
46,
381,
0,
91,
663, 750,
796,
161,
668,
550,
252,
453,
370},
429,
332,
240,
{615, 687,
137,
451,
91,
0,
70,
733, 820,
866,
738,
161,
523,
279},
499,
402,
310,
{706, 778,
207,
542,
161,
70,
824, 911,
957,
401,
{824, 896,
298,
660,
252,
942,
161,
1029,
91,
1075,
947,
118},
829,
732,
528,
416,
370,
279,
209,
118,
0}
0,
620,
91,
711,
829,
0,
209},
590,
614,
708,
493,
611,
};
// deklarasi fungsi main yang akan dieksekusi pertamakali
int main() {
printf("
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+\n");
printf("
+\n");
printf("
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+\n\n");
char pil;
cout<<endl;
cout<<"\t ============ MENU UTAMA ============ : \n";
cout<<endl;
cout<<"\t 1. Rute Bebas\n";
cout<<"\t 2. Rute Tertentu\n";
cout<<"\t 3. Rute Tertentu (Reverse) \n";
cout<<"\t 0. EXIT \n";
cout<<"\n";
cout<<"\tMasukkan Pilihan Anda : ";
cin>>pil;
cout<<"\n\n";
//Rute Bebas
if (pil == '1')
{
printf("===========================\n");
printf("Masukan node awal robot :");
scanf ("%d",&titik_awal);
printf("Masukan target robot:");
scanf ("%d",&titik_akhir);
printf("===========================\n");
while(baris!=titik_akhir)// ketika baris tidak sama dengan
titik_akhir
{
for(v=0;v<18;v++){
if(koneksi[titik_awal][v]==1){//jika titik awal dan titik
baris terkoneksi maka akan menjalankan rumus dibwahnya
rumus=bobot[titik_awal][v]+jarak[v][titik_akhir];//rumus = niali
bobot titik awal + nilai jarak baris titik akhir
if(data_sebelumnya>rumus){
data_sebelumnya=rumus;
baris=v;
titik_dilewati[iterasi]=baris;}
}
}
titik_awal=baris;
data_sebelumnya=99999;
iterasi++;
}
printf(" \n");
printf("----------------------------------------- \n");
printf("Jumlah titik yang dilewati
: %d titik\n",iterasi);
printf("Titik yang dilewati
:");
for(v=0;v<iterasi;v++){
printf("%d ",titik_dilewati[v]);
}
printf("\n-----------------------------------------");
printf("\n");
return 0;
}
//Rute tertentu
else
if (pil == '2')
{
char lanjutan;
titik_akhir=5;
titik_awal=0;
printf ("\n");
printf("++++++++++++++++++++++++++++++++++++++++++++++ \n");
printf("++++ Karena Rute Ruang 3 harus dilewati ++++++ \n");
printf("++++
maka, Node 5 harus didahulukan
++++++ \n");
printf("++++++++++++++++++++++++++++++++++++++++++++++ \n");
printf ("\n");
printf("============================\n");
printf("== Node awal robot
:0 == \n",titik_awal);
printf("== Target awal robot
:5 == \n",titik_akhir);
printf("============================\n");
while(baris!=titik_akhir)// ketika baris tidak sama dengan
titik_akhir
{
for(v=0;v<18;v++){
if(koneksi[titik_awal][v]==1){//jika titik awal dan titik
baris terkoneksi maka akan menjalankan rumus dibwahnya
rumus=bobot[titik_awal][v]+jarak[v][titik_akhir];//rumus = niali
bobot titik awal + nilai jarak baris titik akhir
if(data_sebelumnya>rumus){
data_sebelumnya=rumus;
baris=v;
titik_dilewati[iterasi]=baris;}
}
}
titik_awal=baris;
data_sebelumnya=99999;
iterasi++;
}
printf(" \n");
printf("----------------------------------------- \n");
printf ("\n");
printf("++++++++++++++++++++++++++++++++++++++++++++++ \n");
printf("++++ Karena Rute Ruang 4 harus dilewati ++++++ \n");
printf("++++
maka, Node 8 harus didahulukan
++++++ \n");
printf("++++++++++++++++++++++++++++++++++++++++++++++ \n");
printf ("\n");
printf("============================\n");
printf("== Node awal robot
:17 == \n",titik_awal);
printf("== Target awal robot
: 8 == \n",titik_akhir);
printf("============================\n");
while(baris!=titik_akhir)// ketika baris tidak sama dengan
titik_akhir
{
for(v=0;v<18;v++){
if(koneksi[titik_awal][v]==1){//jika titik awal dan titik
baris terkoneksi maka akan menjalankan rumus dibwahnya
rumus=bobot[titik_awal][v]+jarak[v][titik_akhir];//rumus = niali
bobot titik awal + nilai jarak baris titik akhir
if(data_sebelumnya>rumus){
data_sebelumnya=rumus;
baris=v;
titik_dilewati[iterasi]=baris;}
}
}
titik_awal=baris;
data_sebelumnya=99999;
iterasi++;
}
printf(" \n");
printf("----------------------------------------- \n");
printf("Jumlah titik yang dilewati
: %d titik\n",iterasi);
printf("Titik yang dilewati
:");
for(v=0;v<iterasi;v++){
printf("%d ",titik_dilewati[v]);
}
printf("\n-----------------------------------------");
printf("\n");
cout << "\n Apakah anda ingin melanjutkan Rute Selanjutnya? [Y/N] : ";
cin >> lanjutan;
//Lanjutan
if (lanjutan == 'Y'||lanjutan=='y')
{
int titik_awal=8;
printf ("\n");
printf("++++++++++++++++++++++++++++++++++++++++++++++ \n");
printf("++++Karena Rute dilanjutkan dariRuang 4 ++++++ \n");
printf("++++
maka, Node awal dari node 8
++++++ \n");
printf("++++++++++++++++++++++++++++++++++++++++++++++ \n");
printf ("\n");
printf("============================\n");
printf(" Node awal robot
:8
\n",titik_awal);
printf(" Masukan Node target selanjutnya :
\n");
scanf ("%d",&titik_akhir);
printf("============================\n");
while(baris!=titik_akhir)// ketika baris tidak sama dengan
titik_akhir
{
for(v=0;v<18;v++){
if(koneksi[titik_awal][v]==1){//jika titik awal dan titik
baris terkoneksi maka akan menjalankan rumus dibwahnya
rumus=bobot[titik_awal][v]+jarak[v][titik_akhir];//rumus = niali
bobot titik awal + nilai jarak baris titik akhir
if(data_sebelumnya>rumus){
data_sebelumnya=rumus;
baris=v;
titik_dilewati[iterasi]=baris;}
}
}
titik_awal=baris;
data_sebelumnya=99999;
iterasi++;
}
printf(" \n");
printf("----------------------------------------- \n");
printf("Jumlah titik yang dilewati
: %d titik\n",iterasi);
printf("Titik yang dilewati
:");
for(v=8;v<iterasi;v++){
printf("%d ",titik_dilewati[v]);
}
printf("\n-----------------------------------------");
printf("\n");
}
else
return 0;
}
else
if (pil == '0')
{
cout<<" TERIMA KASIH " <<endl;
getch();
return 0;
}
else if (pil != '1' || pil!='2' || pil!='3' || pil!='4' || pil !=
'x')
{
cout<<endl;o
cout<<"Pastikan yang anda Input bener Guys!!! "<<endl;
}
getch();
}
3.3 FLOWCHART
BAB IV
PEMBAHASAN
4.1 ANALISA DATA
2. Menu Kedua
BAB V
PENUTUP
5.1 KESIMPULAN
Pada tugas akhir yang telah dibuat dapat diambil kesimpulan sebagai berikut:
1.
2. Metode dijkstra digunakan untuk menentukan rute terpendek dari pemetaan KRPAI
dimulai dari node start yaitu node 0 hingga goal node yaitu node 4, node 5, node 8,
node 9, node 12, node 15 dan node 17. Di mana penyelesaian dijkstra dilakukan
dengan menyelesaikan goal node per ruangan, jika node di ruangan yang
bersangkutan sudah dilalui maka node tersebut akan menjadi node start untuk goal
node selanjutnya.
3. Dalam hal ini program dijkstra dan perhitungannya sudah sesuai seperti yang
diharapkan.
5.2 SARAN
Untuk pengembangan tugas akhir yang telah dibuat, penulis memberi saran
sebagai berikut:
1. Dalam pengimplementasian penentuan rute terpendek menggunakan dijkstra perlu
diperhatikan pembuatan rutenya. Di mana dalam pembuatan rute ditentukan mana
yang menjadi node awal dan node akhir.
2. Untuk mengimplementasikan program metode dijkstra disarankan agar memperbaiki
kelemahan algoritma yang ada.
3. Pada program penentuan rute terpendek sebaiknya diberi pemetaan rute agar lebih
pmudah dipahami bagi pembaca.
DAFTAR RUJUKAN