Perbandingan Algoritma Brute-Force dan Algoritma A Untuk Mencari Rute Terpendek Antar Klinik Kecantikan di Kota Medan
LAMPIRAN
LISTING PROGRAM
Kode Program Algoritma Brute-Force:
public class Bruteforce
{
List semuaNode;
Node nodeTujuan, nodeAsal;
public float jarakMinimum;
public List hasil;
public TimeSpan runningTime;
public Bruteforce(List semuaNode)
{
this.semuaNode = semuaNode;
this.jarakMinimum = float.PositiveInfinity;
this.hasil = new List();
}
private void rekursif_bruteforce(List sampel, List populasi){
if(sampel.Count > 0){
float jarakTemp = nodeAsal.cariJarakKe(sampel[0].getId());
for(int i = 0; i < sampel.Count - 1; i++){
jarakTemp += sampel[i].cariJarakKe(sampel[i+1].getId());
}
if(jarakTemp == float.PositiveInfinity){
return;
}
Universitas Sumatera Utara
if(sampel[sampel.Count-1].getId() ==
nodeTujuan.getId() && jarakTemp < jarakMinimum){
jarakMinimum = jarakTemp;
hasil = new List(sampel);
hasil.Insert(0, nodeAsal);
}
}
List temp = new List(sampel);
foreach(Node node in populasi){
if(sampel.IndexOf(node) == -1){
sampel = new List(temp);
sampel.Add(node);
rekursif_bruteforce(sampel, populasi);
}
}
}
public bool cariRuteTerpendek(Node asal, Node tujuan){
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
this.nodeTujuan = tujuan;
this.nodeAsal = asal;
List populasi = new List(semuaNode);
populasi.Remove(asal);
rekursif_bruteforce(new List(), populasi);
stopwatch.Stop();
runningTime = stopwatch.Elapsed;
Universitas Sumatera Utara
if(jarakMinimum == float.PositiveInfinity) return false;
return true;
}
}
}
Kode Program Algoritma A*:
public class AStar
{
class Elemen {
public Node node;
public Elemen dari;
public float g, h;
public Elemen(Node node, Node nodeTujuan){
this.node = node;
this.g = 0;
this.h = hitungJarakHeuristik(node, nodeTujuan);
this.dari = null;
}
public float getF(){
return g + h;
}
float deg2rad(float deg){
return (float) (deg * (Math.PI / 180));
}
float hitungJarakHeuristik(Node node_a, Node node_b){
var R = 6371;
var dLat = deg2rad(node_b.getLat()-node_a.getLat());
var dLon = deg2rad(node_b.getLng()-node_a.getLng());
var a =
Math.Sin(dLat/2) * Math.Sin(dLat/2) +
Math.Cos(deg2rad(node_a.getLat())) * Math.Cos(deg2rad(node_b.getLat
Universitas Sumatera Utara
())) *
Math.Sin(dLon/2) * Math.Sin(dLon/2)
;
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1-a));
var d = R * c;
return (float) d;
}
}
public List hasil;
public TimeSpan runningTime;
public float totalJarak;
public AStar()
{
hasil = new List();
runningTime = new TimeSpan();
totalJarak = float.PositiveInfinity;
}
private Elemen cariElemenDenganNilaiTerkecil(List open){
float nilaiFTerkecil = float.PositiveInfinity;
Elemen result = null;
foreach(Elemen elemen in open){
if(elemen.getF() < nilaiFTerkecil){
nilaiFTerkecil = elemen.getF();
result = elemen;
}
}
return result;
}
public bool cariRuteTerpendek(Node asal, Node tujuan){
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
List open = new List();
List closed = new List();
Elemen elemen_mulai = new Elemen(asal, tujuan);
open.Add(elemen_mulai);
Universitas Sumatera Utara
while(open.Count > 0){
Elemen curr = cariElemenDenganNilaiTerkecil(open);
if(curr.node.getId() == tujuan.getId()){
totalJarak = curr.g;
while(curr != null){
hasil.Add(curr.node);
curr = curr.dari;
}
stopwatch.Stop();
runningTime = stopwatch.Elapsed;
return true;
}
open.Remove(curr);
closed.Add(curr);
foreach(Hubungan hub in curr.node.getHubungan()){
Elemen tetangga = new Elemen(hub.getNode(), tujuan);
tetangga.g = curr.g + hub.getJarak();
tetangga.dari = curr;
bool adaDalamOpen = false, adaDalamClosed = false;
foreach(Elemen elemen in closed){
if(elemen.node.getId() == tetangga.node.getId()){
adaDalamClosed = true;
break;
}
}
if(adaDalamClosed) continue;
int posisiDiOpen = 0;
foreach(Elemen elemen in open){
if(elemen.node.getId() == tetangga.node.getId()){
adaDalamOpen = true;
break;
Universitas Sumatera Utara
posisiDiOpen++;
}
if(adaDalamOpen){
if(open[posisiDiOpen].g > tetangga.g){
Elemen update = open[posisiDiOpen];
update.g = tetangga.g;
update.h = tetangga.h;
update.dari = curr;
}
} else {
open.Add(tetangga);
}
}
}
return false;
}
}
}
Universitas Sumatera Utara
CURRICULUM VITAE
Data Diri
Nama
: Syindy Wulandari
Tempat/Tanggal Lahir
: Medan/ 24 Maret 1994
Alamat Sekarang
: Jl.Polonia Gg.Mushollah Medan
Alamat Orang Tua
: Jl. Polonia Gg.Mushollah Medan Polonia
Agama
: Islam
Jenis Kelamin
: Perempuan
Nomor Hp
: 082299982962
Email
: wulandari.syindy@yahoo.com
Riwayat Pendidikan
2000 – 2006
: SD Angkasa Lanud Medan
2006 – 2009
: SMP Angkasa Lanud Medan
2009 – 2012
: SMA Negeri 2 Medan
2012 – Sekarang
: S1 Ilmu Komputer Universitas Sumatera Utara, Medan
Keahlian
Bahasa
: Indonesia, Inggris
Universitas Sumatera Utara
Bahasa Pemrograman : C#,
DBMS
: MySQL
Multimedia
: Adobe Flash
Design
: Photoshop
Perkantoran
: Microsoft Office, Microsoft Excel
Pengalaman Bekerja
2015
: Praktik Kerja Lapangan di PTPN III (Persero)
Seminar
2016
: Seminar Nasional “ OPEN SOURCE BASE TRANSCEIVER
STATION”
2014
: Seminar Open BTS “ICONS”
Universitas Sumatera Utara
LISTING PROGRAM
Kode Program Algoritma Brute-Force:
public class Bruteforce
{
List semuaNode;
Node nodeTujuan, nodeAsal;
public float jarakMinimum;
public List hasil;
public TimeSpan runningTime;
public Bruteforce(List semuaNode)
{
this.semuaNode = semuaNode;
this.jarakMinimum = float.PositiveInfinity;
this.hasil = new List();
}
private void rekursif_bruteforce(List sampel, List populasi){
if(sampel.Count > 0){
float jarakTemp = nodeAsal.cariJarakKe(sampel[0].getId());
for(int i = 0; i < sampel.Count - 1; i++){
jarakTemp += sampel[i].cariJarakKe(sampel[i+1].getId());
}
if(jarakTemp == float.PositiveInfinity){
return;
}
Universitas Sumatera Utara
if(sampel[sampel.Count-1].getId() ==
nodeTujuan.getId() && jarakTemp < jarakMinimum){
jarakMinimum = jarakTemp;
hasil = new List(sampel);
hasil.Insert(0, nodeAsal);
}
}
List temp = new List(sampel);
foreach(Node node in populasi){
if(sampel.IndexOf(node) == -1){
sampel = new List(temp);
sampel.Add(node);
rekursif_bruteforce(sampel, populasi);
}
}
}
public bool cariRuteTerpendek(Node asal, Node tujuan){
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
this.nodeTujuan = tujuan;
this.nodeAsal = asal;
List populasi = new List(semuaNode);
populasi.Remove(asal);
rekursif_bruteforce(new List(), populasi);
stopwatch.Stop();
runningTime = stopwatch.Elapsed;
Universitas Sumatera Utara
if(jarakMinimum == float.PositiveInfinity) return false;
return true;
}
}
}
Kode Program Algoritma A*:
public class AStar
{
class Elemen {
public Node node;
public Elemen dari;
public float g, h;
public Elemen(Node node, Node nodeTujuan){
this.node = node;
this.g = 0;
this.h = hitungJarakHeuristik(node, nodeTujuan);
this.dari = null;
}
public float getF(){
return g + h;
}
float deg2rad(float deg){
return (float) (deg * (Math.PI / 180));
}
float hitungJarakHeuristik(Node node_a, Node node_b){
var R = 6371;
var dLat = deg2rad(node_b.getLat()-node_a.getLat());
var dLon = deg2rad(node_b.getLng()-node_a.getLng());
var a =
Math.Sin(dLat/2) * Math.Sin(dLat/2) +
Math.Cos(deg2rad(node_a.getLat())) * Math.Cos(deg2rad(node_b.getLat
Universitas Sumatera Utara
())) *
Math.Sin(dLon/2) * Math.Sin(dLon/2)
;
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1-a));
var d = R * c;
return (float) d;
}
}
public List hasil;
public TimeSpan runningTime;
public float totalJarak;
public AStar()
{
hasil = new List();
runningTime = new TimeSpan();
totalJarak = float.PositiveInfinity;
}
private Elemen cariElemenDenganNilaiTerkecil(List open){
float nilaiFTerkecil = float.PositiveInfinity;
Elemen result = null;
foreach(Elemen elemen in open){
if(elemen.getF() < nilaiFTerkecil){
nilaiFTerkecil = elemen.getF();
result = elemen;
}
}
return result;
}
public bool cariRuteTerpendek(Node asal, Node tujuan){
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
List open = new List();
List closed = new List();
Elemen elemen_mulai = new Elemen(asal, tujuan);
open.Add(elemen_mulai);
Universitas Sumatera Utara
while(open.Count > 0){
Elemen curr = cariElemenDenganNilaiTerkecil(open);
if(curr.node.getId() == tujuan.getId()){
totalJarak = curr.g;
while(curr != null){
hasil.Add(curr.node);
curr = curr.dari;
}
stopwatch.Stop();
runningTime = stopwatch.Elapsed;
return true;
}
open.Remove(curr);
closed.Add(curr);
foreach(Hubungan hub in curr.node.getHubungan()){
Elemen tetangga = new Elemen(hub.getNode(), tujuan);
tetangga.g = curr.g + hub.getJarak();
tetangga.dari = curr;
bool adaDalamOpen = false, adaDalamClosed = false;
foreach(Elemen elemen in closed){
if(elemen.node.getId() == tetangga.node.getId()){
adaDalamClosed = true;
break;
}
}
if(adaDalamClosed) continue;
int posisiDiOpen = 0;
foreach(Elemen elemen in open){
if(elemen.node.getId() == tetangga.node.getId()){
adaDalamOpen = true;
break;
Universitas Sumatera Utara
posisiDiOpen++;
}
if(adaDalamOpen){
if(open[posisiDiOpen].g > tetangga.g){
Elemen update = open[posisiDiOpen];
update.g = tetangga.g;
update.h = tetangga.h;
update.dari = curr;
}
} else {
open.Add(tetangga);
}
}
}
return false;
}
}
}
Universitas Sumatera Utara
CURRICULUM VITAE
Data Diri
Nama
: Syindy Wulandari
Tempat/Tanggal Lahir
: Medan/ 24 Maret 1994
Alamat Sekarang
: Jl.Polonia Gg.Mushollah Medan
Alamat Orang Tua
: Jl. Polonia Gg.Mushollah Medan Polonia
Agama
: Islam
Jenis Kelamin
: Perempuan
Nomor Hp
: 082299982962
: wulandari.syindy@yahoo.com
Riwayat Pendidikan
2000 – 2006
: SD Angkasa Lanud Medan
2006 – 2009
: SMP Angkasa Lanud Medan
2009 – 2012
: SMA Negeri 2 Medan
2012 – Sekarang
: S1 Ilmu Komputer Universitas Sumatera Utara, Medan
Keahlian
Bahasa
: Indonesia, Inggris
Universitas Sumatera Utara
Bahasa Pemrograman : C#,
DBMS
: MySQL
Multimedia
: Adobe Flash
Design
: Photoshop
Perkantoran
: Microsoft Office, Microsoft Excel
Pengalaman Bekerja
2015
: Praktik Kerja Lapangan di PTPN III (Persero)
Seminar
2016
: Seminar Nasional “ OPEN SOURCE BASE TRANSCEIVER
STATION”
2014
: Seminar Open BTS “ICONS”
Universitas Sumatera Utara