Pencarian Rute Terpendek Transportasi Bus Trans Jakarta Indonesia Dengan Menggunakan Algoritma Iterative Deepening dan Algoritma Djikstra.
SEARCHING SIMULATION SHORTEST ROUTE OF BUS
TRANSPORTATION TRANS JAKARTA INDONESIA USING
ITERATIVE DEEPENING ALGORITHM AND DJIKSTRA ALGORITHM
Ditto Djesmedi ( 0222009 )
Jurusan Teknik Elektro, Fakultas Teknik, Universitas Kristen Maranatha
Jl. Prof. Drg. Surya Sumantri 65, Bandung 40164, Indonesia
Email : ditto_dj_maranatha@yahoo.com
ABSTRAK
Searching of shortest route is a problems that ussually at user supporting
facilities for transportation, because the user supporting facilities for
transportation in doing journey to require solution to get route or path go through
short. This is had a close relationship with the expence efficiency, a time and out
of power.
There are some Algorithm searching to find solution of distance is short,
between it is Breadth first search Algorithm and Deepth first search Algorithm.
At the last task done scheme and realization searching simulation of
shortest route with Iterative Deepening Algorithm and Djikstra Algorithm.
Iterative Deepening Algorithm is searching by way of opening all the possibilities
to all nodes from area of towards area purpose. Djikstra Algorithm is Algorithm
searching of solution value by considering distance wight gone through by
referring to shortest end result or smallest value.
For result in this last task is in the form realization simulation program
searching of shortest route from start until goal, and visualitation at style graph
referring to journey route that is actually.
Keyword : Shortest route, origin halting point ( node origin), halting point purpose
( node purpose), Iterative Deepening Algorithm, Djikstra Algorithm,
distance
value.
(2)
SIMULASI PENCARIAN RUTE TERPENDEK TRANSPORTASI BUS
TRANS JAKARTA INDONESIA
MENGGUNAKAN ALGORITMA ITERATIVE DEEPENING
DAN ALGORITMA DJIKSTRA
Ditto Djesmedi ( 0222009 )
Jurusan Teknik Elektro, Fakultas Teknik, Universitas Kristen Maranatha
Jl. Prof. Drg. Surya Sumantri 65, Bandung 40164, Indonesia
Email : ditto_dj_maranatha@yahoo.com
ABSTRAK
Pencarian rute terpendek merupakan suatu permasalahan yang sering
muncul pada pengguna sarana transportasi, karena para pengguna sarana
transportasi dalam melakukan perjalanan memerlukan solusi untuk mendapatkan
rute atau jalur tempuh terpendek. Hal ini erat kaitannya dengan efisiensi waktu,
biaya, serta tenaga yang dikeluarkan.
Terdapat beberapa Algoritma pencarian untuk menemukan solusi
pencarian jarak terpendek, diantaranya adalah Algoritma Breadth first search dan
Algoritma Deepth first search.
Pada Tugas Akhir ini dilakukan perancangan serta realisasi simulasi
pencarian rute terpendek dengan Algoritma Iterative Deepening dan Algoritma
Djikstra. Algoritma Iterative Deepening adalah Algoritma pencarian dengan jalan
membuka segala kemungkinan yang ada terhadap semua simpul dari daerah asal
menuju daerah tujuan. Algoritma Djikstra adalah Algoritma pencarian nilai solusi
dengan mempertimbangkan bobot jarak yang ditempuh dengan merujuk terhadap
hasil akhir yang paling pendek atau nilai terkecil.
Hasil yang dicapai dalam Tugas Akhir ini adalah berupa realisasi program
simulasi pencarian rute terpendek dari daerah asal ke daerah yang dituju, dan
divisualisasikan pada model graf yang mengacu pada rute perjalanan yang
sebenarnya.
(3)
Kata kunci : rute terpendek, halte asal (node asal), halte tujuan (node tujuan),
Algoritma
Iterative Deepening, Algoritma Djikstra, nilai jarak.
(4)
DAFTAR ISI
ABSTRAK ... i
ABSTRACT ... ii
KATA PENGANTAR ... iii
DAFTAR ISI ... v
DAFTAR TABEL ... viii
DAFTAR GAMBAR ... ix
BAB I PENDAHULUAN
1.1 Latar Belakang ... 1
1.2 Identifikasi Masalah ... 1
1.3 Tujuan ... 1
1.4 Pembatasan Masalah ... 2
1.5 Metodologi Pemecahan Masalah ... 2
1.6 Sistematika Penulisan ... 3
BAB II LANDASAN TEORI
2.1 Graf ( Graph )
[10]... 4
2.1.1 Sejarah Graf
[10]... 4
2.1.2 Jenis-jenis Graf
[10]... 5
2.1.3 Terminologi Graf
[10]... 7
2.2 Metode Pencarian Pada Graf ... 10
2.2.1 Breadth-First Search ( BFS )
[1,2,5]... 10
2.2.2 Depth-First Search ( DFS )
[1,2,5]... 11
2.3 Algoritma Iterative Deepening ( ID )
[1,2,5]... 13
2.4 Algoritma Djikstra
[2,3,5]... 14
(5)
BAB III PERANCANGAN PROGRAM SIMULASI
3.1 Deskripsi Masalah ... 20
3.2 Penelusuran Lintasan
[2]... 20
3.3 Diagram Alir Program Utama ... 21
3.3.1 Diagram Alir Proses Pencarian (Searching) ... 23
3.3.2 Diagram Alir Perhitungan Jarak... 25
3.4 Perancangan Antarmuka Program ... 26
3.4.1 Desain Tampilan Input Data ... 28
3.4.2 Desain Tampilan Output ... 29
3.4.3 Perancangan Tampilan Tombol Pencarian
(Searching) ... 30
3.4.4 Perancangan Informasi Transfer Koridor ... 30
3.4.5 Desain Tombol Reset ... 32
3.4.6 Perancangan Gambar Rute Trans Jakarta
Indonesia ... 32
BAB IV REALISASI DAN PENGUJIAN PROGRAM
4.1 Realisasi ... 33
4.2 Antarmuka Program ... 34
4.2.1 Tampilan Awal Program ... 34
4.2.2 Tampilan Input dan Output Simulasi Program ... 35
4.2.3 Tombol Searching ... 37
4.2.4 Tombol Clear ... 37
4.2.5 Pemodelan Koridor Trans Jakarta Indonesia ... 38
4.2.6 Peta Perjalanan Trans Jakarta Indonesia ... 39
4.2.7 Matrik Node 9 x 9 ... 41
4.3 Pengujian Program ... 42
4.4 Hasil Analisis Pengujian Program ... 50
(6)
BAB V KESIMPULAN DAN SARAN
5.1 Kesimpulan ... 60
5.2 Saran ... 60
DAFTAR PUSTAKA ... 61
LAMPIRAN A
(7)
DAFTAR GAMBAR
Gambar 2.1
Graf yang dibuat L.Euler
[10]... ..5
Gambar 2.2.a Graf Sederhana
[10]... ..6
Gambar 2.2.b Graf Tak Sederhana
[10]... ..6
Gambar 2.3.a Graf Berarah ... ..7
Gambar 2.3.b Graf Tak Berarah ... ..7
Gambar 2.4
Graf untuk mmengilustrasikan adjacent
[10]dan incident
[20]... ..8
Gambar 2.5 Sirkuit Graph
[10]... ..8
Gambar 2.6.a Graf Terhubung
[10]... ..9
Gambar 2.6.b Graf Tak Terhubung
[10]... ..9
Gambar 2.7 Graf Berbobot ( Weighted Graph )
[10]... ..9
Gambar 2.8 Graf Lengkap
[10]... 10
Gambar 2.9 Pencarian dengan langkah BFS ... 11
Gambar 2.10 Pencarian dengan langkah DFS... 12
Gambar 2.11 Pencarian dengan langkah ID sampai level 3 ... 13
Gambar 2.12 Rute perjalanan dari kota A ke kota H
[3,5,6]... 14
Gambar 2.13 Pencarian dengan langkah Djikstra
[3,5,6]... 16
Gambar 2.14 Tampilan Awal Project Ms Visual C++
[4]... 16
Gambar 2.15 Tampilan memulai projek
[4]... 17
Gambar 2.16 Tampilan pilihan projek
[4]... 17
Gambar 2.17 Penjelasan tampilan Visual C++
[4]... 18
Gambar 2.18 Pesan Error pada Ms Visual C++
[4]... 19
Gambar 3.1 Rute awal dan akhir yang berbeda
[2]... 20
Gambar 3.2 Rute awal dan akhir sama[2] ... 21
Gambar 3.3 Diagram alir program utama ... 22
Gambar 3.4 Proses pencarian ( Searching ) ... 23
Gambar 3.5 Perhitungan Jarak ... 25
Gambar 3.6 Perancangan antarmuka program ... 27
(8)
Gambar 3.8 Desain perancangan tampilan output program ... 29
Gambar 3.9 Desain Perancangan Tombol Pencarian ... 30
Gambar 3.10 Peancangan desain tombol reset ... 32
Gambar 4.1 Tampilan awal program ... 34
Gambar 4.2 Realisasi Tampilan Input Data ... 35
Gambar 4.3 Realisasi form Output Data ... 36
Gambar 4.4 Realisasi tombol akses Searching ... 37
Gambar 4.5 Realisasi tombol Akses Clear ... 37
Gambar 4.6 Pemodelan tujuh koridor Busway ... 38
Gambar 4.7 Peta Trans Jakarta... 39
Gambar 4.8 Tampilan Matrix 9x9 ... 41
Gambar 4.9 Rute pencarian simulasi program ... 42
Gambar 4.10 Rute pencarian manual ... 43
Gambar 4.11 Rute pencarian simulasi program ... 44
Gambar 4.12 Rute pencarian manual ... 45
Gambar 4.13 Pencarian simulasi program ... 46
Gambar 4.14 Rute pencarian manual ... 47
Gambar 4.15 Rute pencarian simulasi program ... 48
Gambar 4.16 Rute pencarian manual ... 49
(9)
DAFTAR TABEL
Tabel 2.1 Keterangan Graf
[10]... ..7
Tabel 3.1 Tabel Keterangan Pada Perancangan Antarmuka Program ... 28
Tabel 3.2 Perancangan Desain Matrik Node 9x9 Untuk Data Simulasi ... 31
(10)
(11)
// BUSWAYView.cpp : implementation of the CBUSWAYView class //
#include "stdafx.h" #include "BUSWAY.h"
#include "BUSWAYSet.h" #include "BUSWAYDoc.h" #include "BUSWAYView.h"
#include "LibDraw.h" #include "Algorithm.h" #include "BUSWAYThread.h"
#ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#define INFINITY 1000000000
int TPrice[2] = {2000,3500};
//typedef unsigned int uint; using namespace std;
///////////////////////////////////////////////////////////////////////////// // CBUSWAYView
(12)
BEGIN_MESSAGE_MAP(CBUSWAYView, CRecordView) //{{AFX_MSG_MAP(CBUSWAYView)
ON_BN_CLICKED(IDC_BTN_GREEDY, OnBtnGreedy)
ON_BN_CLICKED(IDC_BTN_CLEAR, OnBtnClear)
ON_BN_CLICKED(IDC_BTN_ADJ, OnBtnAdj)
ON_BN_CLICKED(IDC_BTN_DIST, OnBtnDist)
ON_BN_CLICKED(IDC_BTN_TRANSHAL, OnBtnTranshal)
ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CBUSWAYView construction/destruction
CBUSWAYView::CBUSWAYView()
: CRecordView(CBUSWAYView::IDD)
{
//{{AFX_DATA_INIT(CBUSWAYView) m_pSet = NULL;
m_HKorDstOut = _T(""); m_HKorSrcOut = _T(""); m_HNodeDstOut = _T(""); m_HNodeSrcOut = _T(""); m_HNameDstOut = _T(""); m_HNameSrcOut = _T(""); m_TotalCost = _T(""); m_Info = _T(""); m_Path12 = _T(""); m_Path14 = _T(""); m_Path23 = _T(""); m_Path24 = _T("");
(13)
m_Path25 = _T(""); m_Path45 = _T(""); m_Path46 = _T(""); m_Path57 = _T("");
m_HNameDstIn = _T(""); m_HNameSrcIn = _T(""); m_PictureInfo = _T("");
m_MatrixOut = _T(""); m_MatrixOutName = _T(""); m_MatrixOutLabel = _T(""); m_GeneralFac = _T(""); m_StSysTime = _T("");
m_pBuswayThread = NULL; m_InfoPrice = _T(""); //}}AFX_DATA_INIT
// TODO: add construction code here }
CBUSWAYView::~CBUSWAYView() {
}
void CBUSWAYView::DoDataExchange(CDataExchange* pDX) {
CRecordView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBUSWAYView)
DDX_Control(pDX, IDC_EDT_TIME, m_EdtSysTime);
DDX_Control(pDX, IDC_FRAME_KORIDOR, m_FrameKoridor);
DDX_Text(pDX, IDC_STAT_HKDST_OUT, m_HKorDstOut);
DDX_Text(pDX, IDC_STAT_HKSRC_OUT, m_HKorSrcOut);
(14)
DDX_Text(pDX, IDC_STAT_HNDSRC_OUT, m_HNodeSrcOut);
DDX_Text(pDX, IDC_STAT_HNDST_OUT, m_HNameDstOut);
DDX_Text(pDX, IDC_STAT_HNSRC_OUT, m_HNameSrcOut);
DDX_Text(pDX, IDC_STAT_TOTAL_COST, m_TotalCost);
DDX_Text(pDX, IDC_STAT_INFO, m_Info);
DDX_Text(pDX, IDC_STAT_P12, m_Path12);
DDX_Text(pDX, IDC_STAT_P14, m_Path14);
DDX_Text(pDX, IDC_STAT_P23, m_Path23);
DDX_Text(pDX, IDC_STAT_P24, m_Path24);
DDX_Text(pDX, IDC_STAT_P25, m_Path25);
DDX_Text(pDX, IDC_STAT_P45, m_Path45);
DDX_Text(pDX, IDC_STAT_P46, m_Path46);
DDX_Text(pDX, IDC_STAT_P57, m_Path57);
DDX_CBString(pDX, IDC_COMBO_HNDST_IN, m_HNameDstIn);
DDX_CBString(pDX, IDC_COMBO_HNSRC_IN, m_HNameSrcIn);
DDX_Text(pDX, IDC_STAT_INFO_PIC, m_PictureInfo);
DDX_Text(pDX, IDC_STAT_MADJ, m_MatrixOut);
DDX_Text(pDX, IDC_STAT_MATRIX_NAME, m_MatrixOutName);
DDX_Text(pDX, IDC_STAT_MATRICES, m_MatrixOutLabel);
DDX_Text(pDX, IDC_STAT_GENERAL, m_GeneralFac);
DDX_FieldText(pDX, IDC_EDT_SIM_HID, m_pSet->m_ID, m_pSet);
DDX_FieldText(pDX, IDC_EDT_SIM_HNAME, m_pSet->m_halte_name, m_pSet); DDX_FieldText(pDX, IDC_EDT_SIM_KORIDOR, m_pSet->m_koridor, m_pSet); DDX_FieldText(pDX, IDC_EDT_SIM_NODE, m_pSet->m_node_num, m_pSet);
DDX_Text(pDX, IDC_STAT_PRICE, m_InfoPrice);
//}}AFX_DATA_MAP }
BOOL CBUSWAYView::PreCreateWindow(CREATESTRUCT& cs) {
(15)
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs);
}
void CBUSWAYView::OnInitialUpdate() {
m_pSet = &GetDocument()->m_bUSWAYSet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit();
m_pDC = m_FrameKoridor.GetWindowDC(); Init();
CreateKoridorNodeArray(); CreateKoridorMatrix(); CreateGreedyNodeArray(); InitLookUpTblDist(); CalcHTransDistance();
PrintNullMatrix();
m_pBuswayThread = new CBUSWAYThread; SetTimer(1,1000,NULL);
}
///////////////////////////////////////////////////////////////////////////// // CBUSWAYView diagnostics
#ifdef _DEBUG
(16)
{
CRecordView::AssertValid(); }
void CBUSWAYView::Dump(CDumpContext& dc) const {
CRecordView::Dump(dc); }
CBUSWAYDoc* CBUSWAYView::GetDocument() // non-debug version is inline {
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBUSWAYDoc)));
return (CBUSWAYDoc*)m_pDocument;
}
#endif //_DEBUG
///////////////////////////////////////////////////////////////////////////// // CBUSWAYView database support
CRecordset* CBUSWAYView::OnGetRecordset() {
return m_pSet;
}
void CBUSWAYView::OnTimer(UINT nIDEvent) {
if(nIDEvent == 1) {
if(m_pBuswayThread != NULL)
{
CString sTime = "";
(17)
m_EdtSysTime.SetSel(0,-1); m_EdtSysTime.Clear();
m_EdtSysTime.ReplaceSel(sTime); m_EdtSysTime.UpdateData(false);
} }
CRecordView::OnTimer(nIDEvent); }
///////////////////////////////////////////////////////////////////////////// // CBUSWAYView message handlers
void CBUSWAYView::OnBtnGreedy() {
// TODO: Add your control notification handler code here //int i, j;
int error = 3;
UpdateData(TRUE);
ResetLabel(); ResetGreedyPath(); ResetCost(); ResetCloseHalte(); OnDraw(m_pDC);
// validasi masukan nama halte asal & halte tujuan
if((GetFilterStatus("halte_name", m_HNameSrcIn) == -1) &&
(GetFilterStatus("halte_name", m_HNameDstIn) == -1)) // masukan halte asal & tujuan {
error = 3;
(18)
}
else if(GetFilterStatus("halte_name", m_HNameDstIn) == -1) // masukan halte tujuan {
error = 2;
ReFilterDB(); }
else if(GetFilterStatus("halte_name", m_HNameSrcIn) == -1) // masukan halte asal {
error = 1;
ReFilterDB(); }
else {
error = 0;
ReFilterDB(); }
m_Info = "";
switch(error) {
case 0:
{
int i, j, calculate;
if(ValidasiName() == -1)
{
ProcessInfo(); }
// Cost Information
calculate = CalcDistance();
(19)
if(m_HKorSrcOut == m_HKorDstOut) {
i = atoi(m_HKorDstOut);
i = i == 6 ? i+1 : (i == 7 ? i-1 : i);
m_Info = "Perjalanan akan berlangsung pada Koridor yang Sama";
m_NodeArray[i].SetAsSource(m_pDC);
} else {
// Solution with greedy algorithm using djikstra metode
i = atoi(m_HKorSrcOut);
j = atoi(m_HKorDstOut);
i = i == 6 ? i+1 : (i == 7 ? i-1 : i); j = j == 6 ? j+1 : (j == 7 ? j-1 : j);
m_NodeArray[i].SetAsSource(m_pDC);
m_NodeArray[j].SetAsDestination(m_pDC);
}
PrintTicketPrice(atoi(m_HKorSrcOut));
break;
}
case 1:
{
MessageBox("Record Halte Asal tidak ditemukan!");
break;
}
case 2:
(20)
MessageBox("Record Halte Tujuan tidak ditemukan!");
break;
}
case 3:
{
MessageBox("Record Halte Asal & Tujuan tidak ditemukan!");
break;
} default:
MessageBox("Internal Error!");
break; }
ReFilterDB();
UpdateData(false); }
void CBUSWAYView::OnBtnClear() {
// TODO: Add your control notification handler code here OnDraw(m_pDC);
Init();
PrintNullMatrix(); }
void CBUSWAYView::Init() {
m_HNameDstIn = _T(""); m_HNameSrcIn = _T("");
(21)
m_HKorSrcOut = "-"; m_HNodeDstOut = "-"; m_HNodeSrcOut = "-"; m_HNameDstOut = "-"; m_HNameSrcOut = "-"; m_Path12 = "-"; m_Path14 = "-"; m_Path23 = "-"; m_Path24 = "-"; m_Path25 = "-"; m_Path45 = "-"; m_Path46 = "-"; m_Path57 = "-"; m_TotalCost = "-";
m_Info = "Silahkan Memasukkan Halte Asal dan Tujuan Anda"; m_GeneralFac = "-";
m_InfoPrice = "-"; PrintPictureInfo();
UpdateData(false); }
int CBUSWAYView::GetFilterStatus(CString sFilterRec, CString sRec) {
int retVal = -1;
int recCount;
CString sFilter;
(22)
m_pSet->Close(); m_pSet->m_strFilter = sFilter; m_pSet->Open();
recCount = m_pSet->GetRecordCount();
if(recCount == 0)
{
return retVal;
} return (retVal = 0); }
void CBUSWAYView::OnDraw(CDC* pDC) {
// TODO: Add your specialized code here and/or call the base class m_pDC = m_FrameKoridor.GetWindowDC();
RECT rect;
int nCircle;
GetWindowRect(&rect);
m_NodeArray.SetSize(1,-1); m_PathArray.SetSize(1,-1);
for(nCircle=0; nCircle<7; nCircle++) {
unsigned int x = 30 + (nCircle%3* 80); unsigned int y = 30 + (nCircle/3* 100); unsigned int r = 10;
(23)
m_NodeArray.Add(newCircle); newCircle.SetBorderWidth(3);
newCircle.SetBorderColor(RGB(255,255,255)); newCircle.SetBorder(true);
newCircle.SetFillColor(RGB(0,0,0));
newCircle.SetFill(true);
newCircle.Draw(m_pDC);
}
m_NodeArray[1].SetPathTo(m_NodeArray[2].GetX(),m_NodeArray[2].GetY(), m_pDC); m_NodeArray[1].SetPathTo(m_NodeArray[4].GetX(),m_NodeArray[4].GetY(), m_pDC); m_NodeArray[2].SetPathTo(m_NodeArray[3].GetX(),m_NodeArray[3].GetY(), m_pDC); m_NodeArray[2].SetPathTo(m_NodeArray[4].GetX(),m_NodeArray[4].GetY(), m_pDC); m_NodeArray[2].SetPathTo(m_NodeArray[5].GetX(),m_NodeArray[5].GetY(), m_pDC); m_NodeArray[4].SetPathTo(m_NodeArray[5].GetX(),m_NodeArray[5].GetY(), m_pDC); m_NodeArray[4].SetPathTo(m_NodeArray[7].GetX(),m_NodeArray[7].GetY(), m_pDC); m_NodeArray[5].SetPathTo(m_NodeArray[6].GetX(),m_NodeArray[6].GetY(), m_pDC);
}
void CBUSWAYView::ReFilterDB() {
m_pSet->Close(); m_pSet->m_strFilter = ""; m_pSet->Open(); }
void CBUSWAYView::ProcessInfo() {
// Source Information
(24)
m_HNameSrcOut.Format("%s",m_pSet->m_halte_name); m_HKorSrcOut.Format("%d",m_pSet->m_koridor);
m_HNodeSrcOut.Format("%d",m_pSet->m_node_num);
// Destination Information
GetFilterStatus("halte_name", m_HNameDstIn);
m_HNameDstOut.Format("%s",m_pSet->m_halte_name); m_HKorDstOut.Format("%d",m_pSet->m_koridor); m_HNodeDstOut.Format("%d",m_pSet->m_node_num); }
int CBUSWAYView::ValidasiName() {
int retVal = -1;
int nodeDstNum, nodeSrcNum, i,j, k; int korDstNum = -1;
// destination and source can be in one corridor, so.. for(i=0; i<NUM_KORIDOR; i++)
{
for(j=0; j<m_HalteArray[i].GetSize(); j++)
{
if(!strcmp(m_HNameDstIn, m_HalteArray[i][j].GetHalteName()))
{
korDstNum = m_HalteArray[i][j].GetKoridor();
m_HKorDstOut.Format("%d", korDstNum);
m_HNameDstOut = m_HNameDstIn;
(25)
nodeDstNum = GetHalteNode(korDstNum, m_HNameDstIn); m_HNodeDstOut.Format("%d",nodeDstNum);
for(k=0; k<m_HalteArray[korDstNum].GetSize(); k++)
{
if(!strcmp(m_HNameSrcIn, m_HalteArray[korDstNum][k].GetHalteName()))
{
m_HNameSrcOut.Format("%s",m_HNameSrcIn);
//Source halte name
m_HKorSrcOut.Format("%d", korDstNum);
//Source koridor number
nodeSrcNum = GetHalteNode(korDstNum,
m_HNameSrcIn);
m_HNodeSrcOut.Format("%d", nodeSrcNum);
//Source node number
return 0; }
} }
} }
return retVal;
}
void CBUSWAYView::CreateKoridorNodeArray() {
int i;
for(i=1; i<=8; i++) {
m_HalteArray[i].SetSize(1,-1);
CreateNodeMatrix(i, m_HalteArray[i]);
(26)
CString a = m_HalteArray[7][13].GetHalteName(); }
void CBUSWAYView::CreateGreedyNodeArray() {
int i;
m_HalteGrdArray.SetSize(1,-1);
for(i=1; i<=NUM_TRANSHAL; i++) {
CHalte newHalteGrd(i,_T(""),0,i,3,INFINITY); m_HalteGrdArray.Add(newHalteGrd); }
}
void CBUSWAYView::CreateNodeMatrix(int koridor, CHalteArray &halteArray) {
ReFilterDB(); m_pSet->MoveFirst();
while(!m_pSet->IsEOF()) {
if(m_pSet->m_koridor == koridor)
{
CHalte newHalte(m_pSet->m_ID,
m_pSet->m_halte_name, m_pSet->m_koridor, m_pSet->m_node_num, m_pSet->m_node_code, m_pSet->m_node_dist);
(27)
halteArray.Add(newHalte); }
m_pSet->MoveNext(); };
}
int CBUSWAYView::CalcDistance() {
int retVal = 0; float dstKm = 0;
int korSrc = atoi(m_HKorSrcOut); int korDst = atoi(m_HKorDstOut); int nodeSrc = atoi(m_HNodeSrcOut); int nodeDst = atoi(m_HNodeDstOut);
CString HSrcName = m_HalteArray[korSrc][nodeSrc].GetHalteName(); CString HDstName = m_HalteArray[korDst][nodeDst].GetHalteName();
retVal = DoGreedyAlg(); dstKm = (float)retVal / 1000.000;
m_TotalCost.Format("%d\tMeter(s)\n%.3f\tKm",retVal,dstKm); PrintGeneralFacility(korDst,nodeDst);
return retVal;
}
int CBUSWAYView::GetTransHalte(int kor) {
int retVal =0;
int k=0;
(28)
{
int a = m_HalteArray[kor][j].GetNodeCode();
if(a == 3)
{
k= k + 1;
} }
retVal = retVal + k;
return retVal;
}
int CBUSWAYView::CalcDistInKoridor(int koridor, int nodeSrc, int nodeDst) {
int retVal = 0; int dst = 0;
if(nodeSrc < nodeDst) {
for(int i=nodeSrc; i<nodeDst; i++) {
CString a = m_HalteArray[koridor][i].GetHalteName();
dst = m_HalteArray[koridor][i+1].GetDistance();
retVal = retVal + dst; }
} else {
for(int i=nodeSrc; i>nodeDst; i--) {
(29)
retVal = retVal + dst; }
}
return retVal;
}
char *NameTbl1[] = {"Harmoni","Dukuh Atas","Pecenongan","Juanda","Matraman","Senen","Terminal Pulo Gadung","Kp. Melayu","Dukuh Atas 2"};
void CBUSWAYView::CreateKoridorMatrix() {
bool LookUpTblPath[NUM_TRANSHAL][NUM_TRANSHAL] = { {0,1,1,1,0,1,1,0,0},
{1,0,0,0,1,0,1,0,1}, {1,0,0,1,0,0,0,0,0}, {1,0,1,0,0,0,0,0,0}, {0,1,0,0,0,1,1,1,0}, {1,0,1,1,1,0,1,1,0}, {1,1,1,0,1,1,0,0,0}, {0,0,0,0,1,1,0,0,0}, {0,1,0,0,0,0,0,0,0} };
int LookUpTblKoridor[NUM_TRANSHAL][NUM_TRANSHAL] = { {0,1,3,3,0,2,2,0,1},
{1,0,0,0,4,0,4,0,1}, {3,0,0,2,0,0,0,0,0}, {3,0,3,0,0,0,0,0,0}, {0,4,0,0,0,5,4,5,0}, {2,0,2,2,2,0,2,5,0}, {2,4,2,2,4,2,0,0,0}, {0,0,0,0,5,5,0,0,0},
(30)
{1,6,0,0,0,0,0,0,0} };
/*bool LookUpTblPath[NUM_TRANSHAL][NUM_TRANSHAL] = { {0,1,1,1,0,1,1,0,0},
{1,0,0,0,1,0,1,0,1}, {1,0,0,1,0,1,1,0,0}, {1,0,1,0,0,1,1,0,0}, {0,1,0,0,0,1,1,1,0}, {1,0,1,1,1,0,1,1,0}, {1,1,1,0,1,1,0,0,0}, {0,0,0,0,1,1,0,0,0}, {0,1,0,0,0,0,0,0,0} };
int LookUpTblKoridor[NUM_TRANSHAL][NUM_TRANSHAL] = { {0,1,3,3,0,2,2,0,1},
{1,0,0,0,4,0,4,0,1}, {3,0,0,2,0,2,2,0,0}, {3,0,3,0,0,2,2,0,0}, {0,4,0,0,0,5,4,5,0}, {2,0,2,2,2,0,2,5,0}, {2,4,2,2,4,2,0,0,0}, {0,0,0,0,5,5,0,0,0}, {1,6,0,0,0,0,0,0,0} };
bool LookUpTblPath[NUM_TRANSHAL][NUM_TRANSHAL] = { {0,1,1,1,0,1,1,0,0,0},
{1,0,0,0,1,0,1,0,1,0}, {1,0,0,1,0,1,1,0,0,0},
(31)
{1,0,1,0,0,1,1,0,0,0}, {0,1,0,0,0,1,1,1,0,1}, {1,0,1,1,0,0,1,0,0,1}, {1,1,1,0,1,1,0,0,0,0}, {0,0,0,0,1,1,0,0,0,1}, {0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,1,1,0,1,0,0} };
int LookUpTblKoridor[NUM_TRANSHAL][NUM_TRANSHAL] = { {0,1,3,3,0,2,2,0,1,0},
{1,0,0,0,4,0,4,0,1,0}, {3,0,0,3,0,2,2,0,0,0}, {3,0,3,0,0,2,2,0,0,0}, {0,4,0,0,0,5,4,5,0,5}, {2,0,2,2,0,0,2,0,0,2}, {2,4,2,2,4,2,0,0,0,0}, {0,0,0,0,5,5,0,0,0,5}, {1,6,0,0,0,0,0,0,0,0}, {0,0,0,0,5,2,0,5,0,0} };*/
for(int i=0;i<NUM_TRANSHAL;i++)
{
for(int j=0; j<NUM_TRANSHAL; j++) {
m_LookUpTblPath[i][j] = LookUpTblPath[i][j];
bool test = m_LookUpTblPath[i][j];
m_LookUpTblKoridor[i][j] = LookUpTblKoridor[i][j]; }
(32)
}
void CBUSWAYView::InitLookUpTblDist() {
int i,j;
for(i=0;i<NUM_TRANSHAL;i++) {
for(j=0; j<NUM_TRANSHAL; j++)
{
m_LookUpTblDistance[i][j] = 0;
} } }
void CBUSWAYView::CalcHTransDistance() {
int i,j;
for(i=0; i<NUM_TRANSHAL; i++) {
int halteKoridor;
int nodeSrc;
int nodeDst;
CString halteSrcName = NameTbl1[i];
for(j=0; j<NUM_TRANSHAL; j++)
{
CString halteDstName = NameTbl1[j];
if(j != i)
{
(33)
if(halteKoridor != 0) {
nodeSrc = GetHalteNode(halteKoridor,halteSrcName);
nodeDst = GetHalteNode(halteKoridor,halteDstName);
m_LookUpTblDistance[i][j] =
CalcDistInKoridor(halteKoridor,nodeSrc,nodeDst);
} }
}
int newKoridor = m_HalteGrdArray[i].GetKoridor();
m_HalteGrdArray[i].Set(i+1,halteSrcName,newKoridor,i,3,INFINITY); }
}
int CBUSWAYView::GetHalteNode(int koridor, CString name) {
int retVal = -1;
for(int i=0; i<m_HalteArray[koridor].GetSize(); i++) {
if(!strcmp(m_HalteArray[koridor][i].GetHalteName(), name))
{
retVal = m_HalteArray[koridor][i].GetNode();
} }
return retVal;
}
void CBUSWAYView::ResetLabel() {
int i,j;
for(i=0; i<NUM_TRANSHAL; i++) {
(34)
m_HalteGrdArray[i].SetLabel(tentative); m_HalteGrdArray[i].SetLength(INFINITY); m_HalteGrdArray[i].SetPredecessor(-1); }
for(i=0; i<NUM_KORIDOR; i++) {
m_Path[i] = -1;
m_GreedyPath[i] = -1;
for(j=0; j<m_HalteArray[i].GetSize(); j++)
{
m_HalteArray[i][j].SetLabel(tentative); m_HalteArray[i][j].SetLength(INFINITY); m_HalteArray[i][j].SetPredecessor(-1);
} } }
int CBUSWAYView::DoGreedyAlg() {
int retVal = 0;
int KorSrc = atoi(m_HKorSrcOut); int KorDst = atoi(m_HKorDstOut); int NodeSrc = atoi(m_HNodeSrcOut); int NodeDst = atoi(m_HNodeDstOut);
if(KorDst == KorSrc) {
// source and destination node in same corridor
retVal = CalcDistInKoridor(KorDst, atoi(m_HNodeSrcOut), atoi(m_HNodeDstOut)); }
(35)
else {
if(m_HalteArray[KorSrc][NodeSrc].GetNodeCode() != 3)
{
// source node is not transfer halte
int i,j;
int SrcCloserHalte[NUM_TRANSHAL];
int value[NUM_TRANSHAL];
int path[NUM_TRANSHAL][NUM_TRANSHAL];
int realSrcToCloseTransNode = -1;
int realSrcNode = -1;
int realDstNode = -1;
m_GreedyPath2[NUM_TRANSHAL] = -1;
int NumCloserHToSource = GetCloserHalteInKor(KorSrc, NodeSrc);
if(NumCloserHToSource != -1)
{
// the real source halte node
realSrcNode = GetHalteNode(KorSrc, m_HNameSrcIn);
// copy closer halte array to another array so we can use for closer
destination halte
for(i=0; i<NUM_TRANSHAL; i++)
{
for(j=0; j<NUM_TRANSHAL; j++)
{
path[i][j] = -1;
// init path
}
value[i] = 0; // initial for greedy results
(36)
SrcCloserHalte[i] = -1; // initial for src closer halte
SrcCloserHalte[i] = m_ClosHalte[i]; // copy
}
int tempPathCode[NUM_TRANSHAL] = {-1};
int tempCount = -1;
for(i=0; i<NumCloserHToSource; i++)
{
int distHalteToCloseSrc = -1;
ResetCloseHalte(); ResetLabel();
realSrcToCloseTransNode = GetHalteNode(KorSrc,
NameTbl1[SrcCloserHalte[i]]);
distHalteToCloseSrc = CalcDistInKoridor(KorSrc, NodeSrc,
realSrcToCloseTransNode);
int NumCloserHToDest = GetCloserHalteInKor(KorDst,
NodeDst);
value[i] = CalcWithGreedy(NumCloserHToDest,
SrcCloserHalte[i],KorDst,NodeDst,distHalteToCloseSrc);
//copy path and reverse to get last node of greedy path
int temp=0;
for(j=NUM_TRANSHAL-1; j>=0; j--)
{
if(m_GreedyPath2[j] >= 0)
{
path[i][j] = m_GreedyPath2[j];
tempCount = m_GreedyPath2[j];
(37)
}
}
tempPathCode[i] = tempCount;
}
int min = INFINITY; int select = -1;
int TheDist = 0;
for(i=0; i<NumCloserHToSource; i++)
{
//if(path[i][0] > -1)
if(tempPathCode[i] > -1)
{
//int code = path[i][0];
int code = tempPathCode[i];
realDstNode = GetHalteNode(KorSrc,
NameTbl1[SrcCloserHalte[i]]); // source to close halte distance
TheDist = CalcDistInKoridor(KorSrc, realSrcNode,
realDstNode);
//if(value[i] + TheDist < min)
if(value[i] < min)
{
//TheDist = TheDist + value[i];
//min = value[i];
for(j=0; j<NUM_TRANSHAL; j++)
{
m_Path[j] = path[i][j];
}
//min = TheDist + value[i];
min = value[i]; select = i;
(38)
} }
}
retVal = min; }
} else {
// source node is transfer halte, so this is done with distance matrix
int initDestToSrc = 0;
int Src = HalteToInt(KorSrc, NodeSrc);
ResetCloseHalte();
// Get the transfer halte who closer to destination halte int NumCloserHalte = GetCloserHalteInKor(KorDst, NodeDst);
retVal = CalcWithGreedy(NumCloserHalte, Src, KorDst, NodeDst, initDestToSrc);
}
//Print Path
PrintPath(m_HNameSrcIn, m_HNameDstIn);
}
return retVal;
}
int CBUSWAYView::CalcWithGreedy(int closerHalte, int srcHalte, int korDst, int nodeDst, int distSrcToTrans) {
int retVal = 0; int i,j, select;
int minCost;
(39)
int realNode = -1;
for(i=0; i<closerHalte; i++) {
ResetLabel(); // reset all changed
at CArray
ResetGreedyPath();
m_Cost[i] = SearchPath(srcHalte, m_ClosHalte[i]);
if(m_Cost[i] > -1)
{
for(j=0; j<NUM_TRANSHAL; j++)
{
m_Path2[i][j] = m_GreedyPath[j];
} }
}
select = 0;
minCost = INFINITY; for(i=0; i<closerHalte; i++) {
//if(m_Path2[i][0] > -1 && m_Cost[i] < minCost) if(m_Path2[i][0] > -1 && m_Cost[i] < minCost) {
// From the greedy path get the real node code transfer halte
int code = m_Path2[i][0];
realNode = GetHalteNode(korDst, NameTbl1[code]);
distance = CalcDistInKoridor(korDst, realNode, nodeDst); // from closer trans halte to destination
distance = distSrcToTrans + distance + m_Cost[i]; // from source to destination
minCost = m_Cost[i] + distSrcToTrans;
(40)
//get the path
for(int k=0; k<NUM_TRANSHAL; k++)
{
m_GreedyPath2[k] = m_Path2[i][k];
} }
}
for(i=0; i<closerHalte; i++) {
if(i>0)
m_Path[i] = m_GreedyPath2[i-1];
}
retVal = distance;
return retVal;
}
int CBUSWAYView::SearchPath(int nodeSrc, int nodeDst) {
int retVal = -1; int k, i;
// init source node
m_HalteGrdArray[nodeSrc].SetLabel(permanent); m_HalteGrdArray[nodeSrc].SetLength(0);
if(nodeSrc == nodeDst) {
(41)
} else {
k = nodeSrc;
do {
for(i=0; i<NUM_TRANSHAL; i++)
{
if(m_LookUpTblDistance[k][i] != 0 && m_HalteGrdArray[i].GetLabel() == tentative)
{
if((m_HalteGrdArray[k].GetLength() +
m_LookUpTblDistance[k][i]) < m_HalteGrdArray[i].GetLength()) {
m_HalteGrdArray[i].SetPredecessor(k);
m_HalteGrdArray[i].SetLength((m_HalteGrdArray[k].GetLength() + m_LookUpTblDistance[k][i])); }
} }
int min = INFINITY;
k = 0;
for(i=0; i<NUM_TRANSHAL; i++)
{
if((m_HalteGrdArray[i].GetLabel()) == tentative &&
(m_HalteGrdArray[i].GetLength() < min)) {
min = m_HalteGrdArray[i].GetLength();
k = i; }
}
(42)
}while(k != nodeDst);
// Get the greedy path
k = nodeDst;
i=0; do
{
m_GreedyPath[i++] = k;
k = m_HalteGrdArray[k].GetPredecessor();
}while(k >= 0);
int cost = 0;
for(i=0; i<NUM_TRANSHAL; i++)
{
if(m_GreedyPath[i] >= 0 && m_GreedyPath[i+1] != -1 && m_LookUpTblDistance[m_GreedyPath[i]][m_GreedyPath[i + 1]] >0)
{
cost = cost +
m_LookUpTblDistance[m_GreedyPath[i]][m_GreedyPath[i + 1]]; }
}
retVal = cost;
}
return retVal;
}
int CBUSWAYView::HalteToInt(int koridor, int node) {
int retVal = -1;
int i;
(43)
for(i=0; i<NUM_TRANSHAL; i++) {
if(!strcmp(HalteName, NameTbl1[i]))
{
retVal = i; break;
} }
return retVal;
}
int CBUSWAYView::GetCloserHalteInKor(int koridor, int node) {
int retVal = -1;
int i;
int count = 0; int nNode = -1;
for(i=0; i<m_HalteArray[koridor].GetSize(); i++) {
if(m_HalteArray[koridor][i].GetNodeCode() == 3)
{
nNode = m_HalteArray[koridor][i].GetNode();
m_ClosHalte[count] = HalteToInt(koridor, nNode);
if(m_ClosHalte[count] >= 0)
count++; }
} retVal = count;
(44)
}
void CBUSWAYView::ResetGreedyPath() {
for(int i=0; i<NUM_TRANSHAL; i++) {
m_GreedyPath[i] = -1;
} }
void CBUSWAYView::ResetCost() {
for(int i=0; i<NUM_TRANSHAL; i++) {
m_Cost[i] = -1;
} }
void CBUSWAYView::ResetCloseHalte() {
for(int i=0; i<NUM_TRANSHAL; i++) {
m_ClosHalte[i] = -1;
} }
void CBUSWAYView::PrintPictureInfo() {
CString text,text1,text2,text3,text4,text5,text6,text7;
(45)
text2 = "\nTransfer Koridor:\n";
text3 = "1 : Harmoni (K-I)\t\t5 : Matraman (K-IV)\n"; text4 = "2 : Dukuh Atas (K-I)\t6 : Senen (K-V)\n"; text5 = "3 : Pecenongan (K-III)\t7 : P. Gadung (K-IV)\n"; text6 = "4 : Juanda (K-III)\t\t8 : Kp. Melayu (K-VII)\n"; text7 = "\t9 : Dukuh Atas 2 (K-VI)";
text = text1 + text2 + text3 + text4 + text5 + text6+ text7; //m_PictureInfo.Format("%s",text);
m_PictureInfo = text; }
void CBUSWAYView::PrintPath(CString sourceName, CString dstName) {
int i;
CString pathName = _T(""); for(i=NUM_KORIDOR; i>=0; i--) {
if(m_Path[i] > -1)
{
pathName = pathName + " - " + NameTbl1[m_Path[i]]; }
}
sourceName = "Jalur yang ditempuh :\n" + sourceName + pathName + " - " + dstName; m_Info = sourceName;
//m_Info.Format("%s",sourceName); //UpdateData(false);
}
void CBUSWAYView::PrintCost(int lenFromSrc, int lenFromDst) {
(46)
int i; int cost = 0; int cost1 = 0; int cost2 = 0; int count = 0;
int distance[NUM_KORIDOR] = {0}; for(i=0; i<NUM_KORIDOR; i++) {
if(m_Path[i] > -1 && m_Path[i+1] > -1) {
distance[i] = m_LookUpTblDistance[m_Path[i]][m_Path[i+1]];
count++; }
}
for(i=0; i<count; i++)
cost = cost + distance[i];
cost1 = lenFromSrc + cost - lenFromDst; cost2 = cost - lenFromSrc + lenFromDst; cost = (cost1 <= cost2) ? cost2 : cost1; //cost = lenFromSrc + cost - lenFromDst; cost = (cost<0) ? -cost : cost;
m_TotalCost.Format("%d", cost); //UpdateData(false);
}
void CBUSWAYView::PrintMatrixAdj() {
CString tempString = "";
(47)
{
for(int j=0; j<NUM_TRANSHAL; j++) {
tempString.Format("%d",m_LookUpTblPath[i][j]);
m_MatrixOut += tempString + "\t";
}
//tempString.Format("%d",i+1);
m_MatrixOut += "\n";
tempString.Format("%d",i+1); m_MatrixOutLabel += tempString + "\t"; }
m_MatrixOutName = "Adjacency Matrices"; }
void CBUSWAYView::PrintMatrixDist() {
CString tempString = "";
for(int i=0; i<NUM_TRANSHAL; i++) {
for(int j=0; j<NUM_TRANSHAL; j++) {
tempString.Format("%d",m_LookUpTblDistance[i][j]);
m_MatrixOut += tempString + "\t";
}
//tempString.Format("%d",i+1);
m_MatrixOut += "\n";
tempString.Format("%d",i+1); m_MatrixOutLabel += tempString + "\t"; }
(48)
m_MatrixOutName = "Distance Matrices (Meter(s))"; }
void CBUSWAYView::PrintMatrixTransHal() {
CString tempString = "";
for(int i=0; i<NUM_TRANSHAL; i++) {
for(int j=0; j<NUM_TRANSHAL; j++) {
tempString.Format("%d",m_LookUpTblKoridor[i][j]);
m_MatrixOut += tempString + "\t";
}
//tempString.Format("%d",i+1);
m_MatrixOut += "\n";
tempString.Format("%d",i+1); m_MatrixOutLabel += tempString + "\t"; }
m_MatrixOutName = "Transfer Halte Matrices (Transfer Koridor Number)"; }
void CBUSWAYView::PrintNullMatrix() {
CString tempString = ""; m_MatrixOutLabel = ""; m_MatrixOut = "";
for(int i=0; i<NUM_TRANSHAL; i++) {
for(int j=0; j<NUM_TRANSHAL; j++) {
(49)
tempString.Format("%d",0);
m_MatrixOut += tempString + "\t";
}
//tempString.Format("%d",i+1);
m_MatrixOut += "\n";
tempString.Format("%d",i+1); m_MatrixOutLabel += tempString + "\t"; }
m_MatrixOutName = "9x9 Null Matrices"; UpdateData(false);
}
void CBUSWAYView::OnBtnAdj() {
// TODO: Add your control notification handler code here m_MatrixOutLabel = "";
m_MatrixOut = ""; PrintMatrixAdj(); UpdateData(false); }
void CBUSWAYView::OnBtnDist() {
// TODO: Add your control notification handler code here m_MatrixOutLabel = "";
m_MatrixOut = ""; PrintMatrixDist(); UpdateData(false); }
(50)
void CBUSWAYView::OnBtnTranshal() {
// TODO: Add your control notification handler code here m_MatrixOutLabel = "";
m_MatrixOut = "";
PrintMatrixTransHal(); UpdateData(false); }
void CBUSWAYView::PrintGeneralFacility(int koridor, int node) {
int idx = 0;
CString textToPrint = "";
idx = GetDBIndex(koridor, node);
ReFilterDB(); m_pSet->MoveFirst(); while(!m_pSet->IsEOF()) {
if(m_pSet->m_ID == idx)
{
textToPrint = m_pSet->m_general;
}
m_pSet->MoveNext(); };
m_GeneralFac = textToPrint; }
int CBUSWAYView::GetDBIndex(int koridor, int node) {
(51)
int retVal = 0; ReFilterDB(); m_pSet->MoveFirst();
while(!m_pSet->IsEOF()) {
if(m_pSet->m_koridor == koridor)
{
if(m_pSet->m_node_num == node)
{
retVal = m_pSet->m_ID;
} }
m_pSet->MoveNext(); };
return retVal;
}
void CBUSWAYView::PrintTicketPrice(int koridor) {
time_t osBinaryTime;
time(&osBinaryTime);
int minutes;
int hours;
CTime theTime(osBinaryTime);
hours = theTime.GetHour(); minutes = theTime.GetMinute();
if(hours >= 5 && hours <=7) {
(52)
m_InfoPrice.Format("Rp. %d",TPrice[0]); }
else if(hours >7 && hours <= 22) {
m_InfoPrice.Format("Rp. %d",TPrice[1]);
} else {
m_InfoPrice = "Halte is Currently CLOSED"; }
(53)
(54)
2/28/2009
jkt_busway
Page
1
ID
koridor
halte_name
node_num
node_code
node_dist
1
1 Terminal
Blok
M
1
2
0
2
1 Mesjid
Agung
2
2
645
3
1 Gelora
Bung
Karno
3
2
735
5
1 Polda
Metro
Jaya
4
2
650
6
1 Bendungan
Hilir
5
2
650
7
1 Karet
6
2
735
8
1 Setia
Budi
7
2
600
9
1 Dukuh
Atas
8
3
735
10
1 Dukuh
Atas
2
9
3
0
11
1 Tosari
10
2
900
12
1 Bunderan
HI
11
2
735
13
1 Sarinah
12
2
735
14
1 Bank
Indonesia
13
2
735
15
1 Monumen
Nasional
14
2
735
16
1 Harmoni
15
3
900
17
1 Sawah
Besar
16
2
600
18
1 Mangga
Besar
17
2
735
19
1 Olimo
18
2
600
20
1 Glodok
19
2
650
21
1 Stasiun
Kota
Jakarta
20
2
735
22
2 Terminal
Pulo
Gadung
1
3
0
23
2 Bermis
2
2
850
24
2 Pulomas
3
2
700
25
2 ASMI
4
2
600
26
2 Pedongkelan
5
2
700
27
2 Cempaka
Timur
6
2
700
28
2 RS
Islam
7
2
750
29
2 Cempaka
Tengah
8
2
600
30
2 Pasar
Cempaka
Putih
9
2
600
31
2 Rawa
Selatan
10
2
600
32
2 Galur
11
2
600
33
2 Senen
12
3
850
34
2 Atrium
13
2
458
35
2 RSPAD
14
2
458
36
2 Deplu
15
2
458
37
2 Gambir
1
16
2
458
38
2 Istiqlal
17
2
458
39
2 Juanda
18
3
458
40
2 Pecenongan
19
3
458
41
2 Harmoni
20
3
850
42
2 Gambir
2
21
2
1100
(55)
2/28/2009
jkt_busway
Page
2
general_fac
general1
general2
Blok
M
Plaza,Blok
M
Mall
Mesjid
Agung
Al
‐
Azhar,S
Sudirman
Place,Stadion
Bursa
Efek
Jakarta,SCBD,
Pasar
Benhil,RS.
Jakarta,
Sudirman
Square
Office
T
Hotel
Sahid
Jaya
Wisma
BNI
46,Hotel
Sang
‐
Hotel
The
Westin
Plaza
Indonesia,Grand
Hy
Sarinah,Graha
Mataram,
Gedung
Bank
Indonesia
Tugu
Monas,Taman
Silan
Duta
Merlin
Plaza
Gajah
Mada
Gajah
Mada
Square,Plaza
SMUN
2,Hotel
Mercure,Jl
Pasar
Glodok,Harco
Glod
Stasiun
KA
JakartaKota,
Terminal
Bus
Pulogadung
‐
Korean
World
Center
Pul
‐
‐
Mega
Mall
ITC
Cempaka
Pasar
Sumur
Batu
‐
Pasar
Cempaka
Putih
Pasar
Gembrong,Pasar
G
‐
Stasiun
KA
Senen,Termin
Plaza
Atrium
‐
‐
Stasiun
KA
Gambir,Tugu
Mesjid
Istiqlal,Gereja
Kha
‐
‐
Duta
Merlin,Plaza
Harmo
‐
(56)
2/28/2009
jkt_busway
Page
3
ID
koridor
halte_name
node_num
node_code
node_dist
44
2 Kwitang
23
2
450
45
2 Senen
24
3
450
46
3 Terminal
Kali
Deres
1
2
0
47
3 Pesakih
2
2
1100
48
3 Sumur
Bor
3
2
800
49
3 Rawa
Buaya
4
2
900
50
3 Jembatan
Baru
5
2
700
51
3 Dispenda
6
2
900
52
3 Jembatan
Gantung
7
2
1100
53
3 Taman
Kota
8
2
900
54
3 Indosiar
9
2
3700
55
3 Jelambar
10
2
1400
56
3 Harmoni
11
3
5000
57
3 Pecenongan
12
3
850
58
3 Juanda
13
3
700
59
3 Pasar
Baru
14
2
650
60
4 Terminal
Pulo
Gadung
1
3
0
61
4 Pasar
Pulo
Gadung
2
2
850
62
4 TU
Gas
3
2
750
63
4 Layur
4
2
800
64
4 Pemuda
Rawamangun
5
2
800
65
4 Velodrome
6
2
650
66
4 Sunan
Giri
7
2
650
67
4 UNJ
8
2
650
68
4 Pramuka
BPKP
9
2
650
69
4 Pramuka
Lia
10
2
650
70
4 Utan
Kayu
11
2
550
71
4 Pasar
Genjing
12
2
650
72
4 Matraman
13
3
850
73
4 Manggarai
14
2
950
74
4 Pasar
Rumput
15
2
600
75
4 Halimun
16
2
700
76
4 Dukuh
Atas
17
3
750
77
4 Dukuh
Atas
2
18
3
0
78
5 Ancol
1
2
0
79
5 Pademangan
2
2
900
80
5 Gunung
Sahari
Mangga
3
2
600
81
5 Jembatan
Merah
4
2
1100
82
5 Pasar
Baru
Timur
5
2
1500
83
5 Budi
Utomo
6
2
650
84
5 Senen
7
3
1200
(57)
2/28/2009
jkt_busway
Page
4
general_fac
general1
general2
Museum
Kebangkitan
Na
‐
Terminal
Bus
Kalideres
Daan
Mogot
Plaza
‐
Plaza
Cengkareng
‐
‐
‐
‐
‐
‐
Duta
Merlin,Plaza
Harmo
‐
‐
Pasar
Baru,Gedung
Kese
Terminal
Bus
Pulogadung
Pasar
Pulogadung
‐
‐
‐
Stadion
Velodrome
Rawa
Pasar
Sunan
Giri
‐
‐
‐
‐
‐
‐
Pasar
Pramuka,Pasar
Bur
Pasaraya
Manggarai,Pasa
Museum
Sasmita
Loka
‐
‐
Taman
Impian
Jaya
Ancol
Pasar
Marina
Mangga
Du
‐
Pasar
Pangeran
Jayakart
Golden
Truly
Super
Store
‐
Stasiun
KA
Senen,Termin
(58)
2/28/2009
jkt_busway
Page
5
ID
koridor
halte_name
node_num
node_code
node_dist
86
5 Kramat
Sention
NU
9
2
600
87
5 Salemba
UI
10
2
850
88
5 Salemba
Carolus
11
2
600
89
5 Matraman
12
3
800
90
5 Tegalan
13
2
800
91
5 Slamet
Riyadi
14
2
850
92
5 Kebon
Pala
15
2
700
93
5 Pasar
Jatinegara
16
2
800
94
5 Kp.
Melayu
17
3
850
95
6 Ragunan
1
2
0
96
6 Dep
Pertanian
2
2
800
97
6 SMK
57
3
2
600
98
6 Jati
Padang
4
2
650
99
6 Pejaten
5
2
650
100
6 Buncit
Indah
6
2
600
101
6 Warung
Jati
7
2
800
102
6 Imigrasi
8
2
650
103
6 Duren
Tiga
9
2
650
104
6 Mampang
Prapatan
10
2
700
105
6 Kuningan
Timur
11
2
650
106
6 Patra
Kuningan
12
2
600
107
6 Depkes
13
2
650
108
6 GOR
Sumantri
14
2
750
109
6 Karet
Kuningan
15
2
600
110
6 Kuningan
Madya
AINI
16
2
700
111
6 Setia
Budi
AINI
17
2
650
112
6 Dukuh
Atas
2
18
3
0
113
6 Dukuh
Atas
19
3
1
114
6 Latuharhary
20
2
650
115
6 Seta
Budi
Utara
21
2
1100
116
6 Kuningan
Madya
AINI
22
2
900
117
7 Terminal
Kampung
Ram
1
2
0
118
7 Tanah
Merdeka
2
2
950
119
7 Fly
Over
Raya
Bogor
3
2
950
120
7 RS
Harapan
Bunda
4
2
950
121
7 Ps
Induk
Kramat
Jati
5
2
1000
122
7 Ps
Kramat
Jati
6
2
2700
123
7 PGC
(Cililitan)
7
2
900
124
7 BKN
8
2
950
125
7 Cawang
UKI
9
2
800
126
7 BNN
10
2
750
(59)
2/28/2009
jkt_busway
Page
6
general_fac
general1
general2
‐
Pasar
Kenari
Baru,Pasar
‐
‐
Mall
Graha
Matraman
‐
‐
Plaza
Jatinegara,Pasar
Jat
Terminal
Bus
Kampung
Kebon
Binatang
Ragunan
Bumi
Perkemahan
Ragun
SMK
Negeri
57
Jakarta,ST
Mall
Pejaten,Kantor
Lura
SMK
Negeri
47
Jakarta,A
RS.
JMC,Wisma
Bakrie
Bu
STIE
Dharma
Bumi
Puter
SMU
Negeri
60
Jakarta,K
Kantor
Lurah
Duren
Tiga,
Kantor
Lurah
Mampang
Gedung
Infome
Kantor
Lurah
Kuningan
Ti Kedutaan
Besar Gedung
RNI,Bal
‐
Apartemen
Puri
Casablan Kedutaan
Besar Gedung
Bina
M
‐
‐
Kantor
Lurah
Karet
Kunin Gedung
Graha
Apartemen
Setiabudi,Ap Gedung
Menar
‐
‐
Plaza
Menteng,Aparteme Museum
Peru
‐
‐
Terminal
Bus
Kampung
R
Makro
Pasar
Rebo
SMU
Teladan,Gedung
AK
SMU
Kuntum
Wijaya
Kus
Pasar
Induk
Kramat
Jati,S
Kramat
Jati
Indah
Plaza,P
Pusat
Grosir
Cililitan,SMK
SMU
Negeri
14
Jakarta,S
SMK
Bhakti
2,Universitas
Pegadaian,Gedung
Waski
(60)
2/28/2009
jkt_busway
Page
7
ID
koridor
halte_name
node_num
node_code
node_dist
128
7 Gelanggang
Remaja
12
2
800
129
7 Bidara
Cina
13
2
800
(61)
2/28/2009
jkt_busway
Page
8
general_fac
general1
general2
SMP
Vincentius,Hotel
Fid
Kantor
Lurah
Tebet
Timu
(62)
Bab 1 Pendahuluan
Universitas Kristen Maranatha
2
BAB I
PENDAHULUAN
Bab ini menjelaskan latar belakang Tugas Akhir, identifikasi masalah yang
akan diselesaikan, tujuan Tugas Akhir, pembatasan masalah, metodologi
pemecahan masalah, dan sistematika penulisan Tugas Akhir ini.
1.1
Latar Belakang
Kemacetan yang terjadi selama melakukan perjalanan, sering menggangu
aktifitas sehari-hari. Oleh karena itu, dibutuhkan suatu cara untuk menanggulangi
gangguan tesebut, agar mencapai suatu tempat dengan waktu yang lebih cepat,
dengan cara mencari lintasan terpendek dari tempat asal ke tempat tujuan. Maka
pada penulisan Tugas Akhir ini akan di berikan suatu solusi pencarian lintasan
terpendek dengan perhitungan jarak, dengan menggunakan Algoritma Iterative
Deepening dan Algoritma Djikstra. Sehingga didapatkan suatu solusi dengan jarak
tempuh terpendek dari asal ke tujuan.
Pada Tugas Akhir ini dilakukan pengembangan dan realisasi simulasi
pencarian rute terpendek transportasi Trans Jakarta Indonesia (Bus Way) dengan
menggunakan perhitungan Algoritma Iterative Deepening dan Djikstra.
1.2 Identifikasi Masalah
Bagaimana membuat suatu simulasi pencarian rute terpendek transportasi
Bus Trans Jakarta Indonesia dengan menggunakan metode Algoritma Iterative
Deepening dan Algoritma Djikstra?
1.3 Tujuan
Tujuan dari Tugas Akhir dengan topik ini adalah :
1.
Membuat suatu program simulasi pencarian rute terpendek, dengan
Algoritma Iterative Deepening dan Algoritma Djikstra.
(63)
Bab 1 Pendahuluan
Universitas Kristen Maranatha
3
2.
Memberikan suatu kepastian tentang jalur transportasi yang akan dipilih
untuk mencapai suatu tujuan dengan jalur terpendek, untuk kasus
transportasi Trans Jakarta Indonesia (Bus Way).
1.4 Pembatasan Masalah
Pembatasan masalah dari Tugas Akhir ini adalah :
1.
Dalam pengerjaan Tugas Akhir tidak dibahas waktu dan kecepatan
transportasi dari tempat asal ke tempat tujuan.
2.
Data yang digunakan berasal dari informasi yang merujuk ke kondisi
sebenarnya.
3.
Jumlah node atau halte persinggahan pada pencarian Algoritma Iterative
Deepening adalah jumlah transfer halte.
4.
Jumlah kedalaman pencarian Algoritma Iterative Deepening dibatasi pada
level 4.
5.
Menggunakan Bahasa Pemograman C/C++.
1.5 Metodologi Pemecahan Masalah
Metodologi yang digunakan dalam pengerjaan tugas akhir ini adalah :
1.
Mempelajari literatur yang ada dan relevan.
2.
Analisis kebutuhan sistem, yaitu penentuan kebutuhan sistem, batasan
sistem, pengumpulan data, serta menentukan perangkat lunak yang akan
digunakan.
3.
Rancangan, yaitu tahap penuangan hasil analisis yang dihasilkan pada
tahap sebelumnya kedalam bentuk kerangka aplikasi.
4.
Implementasi, yaitu tahap penuangan rancangan kedalam bahasa
pemrograman sehingga menjadi suatu yang fungsional.
5.
Pengujian aplikasi, yaitu dengan melihat apakah Algoritma Iterative
Deepening dan Algoritma Djikstra dapat digunakan untuk mengoptimasi
jalur terdekat untuk sarana transportasi dari tempat asal ke tempat tujuan,
melakukan analisis terhadap hasil tersebut, dan membuat suatu
kesimpulan.
(64)
Bab 1 Pendahuluan
Universitas Kristen Maranatha
4
1.6 Sistematika Penulisan
Laporan Tugas Akhir ini dibagi menjadi lima bab utama yang akan disusun
dengan sistematik sebagai berikut :
BAB I PENDAHULUAN
Berisi latar belakang Tugas Akhir, identifikasi masalah, tujuan dari Tugas Akhir,
pembatasan masalah, metodologi pemecahan masalah, dan sistematika penulisan
laporan Tugas Akhir ini.
BAB II LANDASAN TEORI
Bab ini memberikan pembahasan singkat mengenai teori graf, metode pencarian
pada suatu graf, Algoritma Iterative Deepening dan Algoritma Djikstra serta
bahasa program C / C++.
BAB III ANALISIS DAN PERANCANGAN
Pada bab ini akan dibahas mengenai perancangan perngkat lunak (software)
simulasi pencarian rute terpendek.
BAB IV PENGUJIAN DAN DATA PENGAMATAN
Pada bab ini akan menampilkan dan menganalisa hasil pengujian terhadap
perangkat lunak (software) yang dibuat.
BAB V KESIMPULAN DAN SARAN
Bab ini memaparkan kesimpulan dari perangkat lunak yang telah dibuat dan
memberikan saran mengenai hal-hal yang mungkin harus di perbaiki pada
perangkat lunak tersebut untuk mendapatkan hasil yang lebih baik.
(65)
Bab V Kesimpulan dan Saran
60
Universitas Kristen Maranatha
BAB V
KESIMPULAN DAN SARAN
5.1 Kesimpulan
Berdasarkan pengujian dan analisis terhadap program simulasi yang telah
dibuat, maka dapat disimpulkan beberapa hal :
•
Program simulasi pencarian rute terpendek dengan menggunakan
Algoritma Iterartive Deepening dan Dijkstra telah selesai dirancang
dan direalisasikan.
•
Program simulasi ini dapat memberikan solusi untuk pencarian rute
terpendek dengan perhitungan jarak.
•
Dari pengujian keseluruhan program dimana diwakili 15 sampel
yang telah dilakukan dengan berbagai variasi perjalanan, seperti
pada tabel uji, solusi pencarian rute terpendek adalah benar.
•
Pengujian simulasi program dengan perhitungan mendapatkan
hasil yang sama dan benar.
5.2 Saran
Ada beberapa saran yang perlu diketengahkan sebagai bahan perbaikan
dari masalah ini :
•
Pengembangan dari rute perjalanan Trans Jakarta dapat
ditambahkan lagi.
•
Program simulasi ini diimplementasikan dengan graf animasi
perjalanan yang sesuai dengan keadaan sebenarnya.
•
Dilakukan pembenahan dengan lebih jelas pada pengelompokan
Halte Transfer yang dilengkapi fasilitas Skywalk nya.
(66)
Universitas Kristen Maranatha
DAFTAR PUSTAKA
1. Darmawan, Aan dan Theresia, Novie. Diktat Pengantar Sistem Cerdas.
Teknik Elektro. UKM. 2006.
2. Munir, Rinaldi, “Diktat Kuliah IF2251 Strategi Algoritmik “. Program Studi
Teknik Informatika, STEI ITB 2007.
3. Prijono, Agus dan Marcus, Teddy. Struktur Data. Informatika. Bandung
2006.
4. Raharjo, Budi. Pemograman C ++. Informatika Bandung 2007.
5. Russel, Stuart J and Norvig, Peter. Artificial Intelegence ( Teknik dan
Aplikasi ). Graha Ilmu. Yogyakarta 2003.
6. en. Wikipedia.org/wiki/Dijkstra_algorithm.htmC.Y, Tanggal akses : 22
September 2007, pukul 14.23Wib.
7.
http://www.rutebusway.com/
. Tanggal akses : 14 April 2007, pukul
10.23Wib.
8.
http://id.wikipedia.org/wiki/Busway
. Tanggal akses : 14 April 2007, pukul
10.11Wib.
9.
http://us.mc355.mail.yahoo.com/mc/welcome?.rand=8unb0nupehsq6
. Tanggal
akses 1 Agustus 2007.
10. www://google.com/teori graf.pdf. Tanggal akses 4 Agustus 2008,
pukul 21.15 Wib.
(1)
Kantor Lurah Tebet Timu
(2)
Bab 1 Pendahuluan 2
BAB I
PENDAHULUAN
Bab ini menjelaskan latar belakang Tugas Akhir, identifikasi masalah yang akan diselesaikan, tujuan Tugas Akhir, pembatasan masalah, metodologi pemecahan masalah, dan sistematika penulisan Tugas Akhir ini.
1.1
Latar Belakang
Kemacetan yang terjadi selama melakukan perjalanan, sering menggangu aktifitas sehari-hari. Oleh karena itu, dibutuhkan suatu cara untuk menanggulangi gangguan tesebut, agar mencapai suatu tempat dengan waktu yang lebih cepat, dengan cara mencari lintasan terpendek dari tempat asal ke tempat tujuan. Maka pada penulisan Tugas Akhir ini akan di berikan suatu solusi pencarian lintasan terpendek dengan perhitungan jarak, dengan menggunakan Algoritma Iterative Deepening dan Algoritma Djikstra. Sehingga didapatkan suatu solusi dengan jarak tempuh terpendek dari asal ke tujuan.
Pada Tugas Akhir ini dilakukan pengembangan dan realisasi simulasi pencarian rute terpendek transportasi Trans Jakarta Indonesia (Bus Way) dengan menggunakan perhitungan Algoritma Iterative Deepening dan Djikstra.
1.2 Identifikasi Masalah
Bagaimana membuat suatu simulasi pencarian rute terpendek transportasi Bus Trans Jakarta Indonesia dengan menggunakan metode Algoritma Iterative Deepening dan Algoritma Djikstra?
1.3 Tujuan
Tujuan dari Tugas Akhir dengan topik ini adalah :
1. Membuat suatu program simulasi pencarian rute terpendek, dengan Algoritma Iterative Deepening dan Algoritma Djikstra.
(3)
2. Memberikan suatu kepastian tentang jalur transportasi yang akan dipilih untuk mencapai suatu tujuan dengan jalur terpendek, untuk kasus transportasi Trans Jakarta Indonesia (Bus Way).
1.4 Pembatasan Masalah
Pembatasan masalah dari Tugas Akhir ini adalah :
1. Dalam pengerjaan Tugas Akhir tidak dibahas waktu dan kecepatan transportasi dari tempat asal ke tempat tujuan.
2. Data yang digunakan berasal dari informasi yang merujuk ke kondisi sebenarnya.
3. Jumlah node atau halte persinggahan pada pencarian Algoritma Iterative Deepening adalah jumlah transfer halte.
4. Jumlah kedalaman pencarian Algoritma Iterative Deepening dibatasi pada level 4.
5. Menggunakan Bahasa Pemograman C/C++.
1.5 Metodologi Pemecahan Masalah
Metodologi yang digunakan dalam pengerjaan tugas akhir ini adalah : 1. Mempelajari literatur yang ada dan relevan.
2. Analisis kebutuhan sistem, yaitu penentuan kebutuhan sistem, batasan sistem, pengumpulan data, serta menentukan perangkat lunak yang akan digunakan.
3. Rancangan, yaitu tahap penuangan hasil analisis yang dihasilkan pada tahap sebelumnya kedalam bentuk kerangka aplikasi.
4. Implementasi, yaitu tahap penuangan rancangan kedalam bahasa pemrograman sehingga menjadi suatu yang fungsional.
5. Pengujian aplikasi, yaitu dengan melihat apakah Algoritma Iterative Deepening dan Algoritma Djikstra dapat digunakan untuk mengoptimasi jalur terdekat untuk sarana transportasi dari tempat asal ke tempat tujuan, melakukan analisis terhadap hasil tersebut, dan membuat suatu
(4)
Bab 1 Pendahuluan 4
1.6 Sistematika Penulisan
Laporan Tugas Akhir ini dibagi menjadi lima bab utama yang akan disusun dengan sistematik sebagai berikut :
BAB I PENDAHULUAN
Berisi latar belakang Tugas Akhir, identifikasi masalah, tujuan dari Tugas Akhir, pembatasan masalah, metodologi pemecahan masalah, dan sistematika penulisan laporan Tugas Akhir ini.
BAB II LANDASAN TEORI
Bab ini memberikan pembahasan singkat mengenai teori graf, metode pencarian pada suatu graf, Algoritma Iterative Deepening dan Algoritma Djikstra serta bahasa program C / C++.
BAB III ANALISIS DAN PERANCANGAN
Pada bab ini akan dibahas mengenai perancangan perngkat lunak (software) simulasi pencarian rute terpendek.
BAB IV PENGUJIAN DAN DATA PENGAMATAN
Pada bab ini akan menampilkan dan menganalisa hasil pengujian terhadap perangkat lunak (software) yang dibuat.
BAB V KESIMPULAN DAN SARAN
Bab ini memaparkan kesimpulan dari perangkat lunak yang telah dibuat dan memberikan saran mengenai hal-hal yang mungkin harus di perbaiki pada perangkat lunak tersebut untuk mendapatkan hasil yang lebih baik.
(5)
BAB V
KESIMPULAN DAN SARAN
5.1 Kesimpulan
Berdasarkan pengujian dan analisis terhadap program simulasi yang telah dibuat, maka dapat disimpulkan beberapa hal :
• Program simulasi pencarian rute terpendek dengan menggunakan Algoritma Iterartive Deepening dan Dijkstra telah selesai dirancang dan direalisasikan.
• Program simulasi ini dapat memberikan solusi untuk pencarian rute terpendek dengan perhitungan jarak.
• Dari pengujian keseluruhan program dimana diwakili 15 sampel yang telah dilakukan dengan berbagai variasi perjalanan, seperti pada tabel uji, solusi pencarian rute terpendek adalah benar.
• Pengujian simulasi program dengan perhitungan mendapatkan hasil yang sama dan benar.
5.2 Saran
Ada beberapa saran yang perlu diketengahkan sebagai bahan perbaikan dari masalah ini :
• Pengembangan dari rute perjalanan Trans Jakarta dapat ditambahkan lagi.
• Program simulasi ini diimplementasikan dengan graf animasi perjalanan yang sesuai dengan keadaan sebenarnya.
• Dilakukan pembenahan dengan lebih jelas pada pengelompokan Halte Transfer yang dilengkapi fasilitas Skywalk nya.
(6)
DAFTAR PUSTAKA
1. Darmawan, Aan dan Theresia, Novie. Diktat Pengantar Sistem Cerdas. Teknik Elektro. UKM. 2006.
2. Munir, Rinaldi, “Diktat Kuliah IF2251 Strategi Algoritmik “. Program Studi Teknik Informatika, STEI ITB 2007.
3. Prijono, Agus dan Marcus, Teddy. Struktur Data. Informatika. Bandung 2006.
4. Raharjo, Budi. Pemograman C ++. Informatika Bandung 2007.
5. Russel, Stuart J and Norvig, Peter. Artificial Intelegence ( Teknik dan Aplikasi ). Graha Ilmu. Yogyakarta 2003.
6. en. Wikipedia.org/wiki/Dijkstra_algorithm.htmC.Y, Tanggal akses : 22 September 2007, pukul 14.23Wib.
7. http://www.rutebusway.com/. Tanggal akses : 14 April 2007, pukul 10.23Wib.
8. http://id.wikipedia.org/wiki/Busway. Tanggal akses : 14 April 2007, pukul 10.11Wib.
9. http://us.mc355.mail.yahoo.com/mc/welcome?.rand=8unb0nupehsq6. Tanggal akses 1 Agustus 2007.
10. www://google.com/teori graf.pdf. Tanggal akses 4 Agustus 2008, pukul 21.15 Wib.