Implementasi Algoritma Greedy Dan Algoritma Floyd – Warshall Untuk Menentukan Jarak Terpendek (Studi Kasus : Beberapa Apotek Terkenal Di Kota Medan)
A-1
LISTING PROGRAM
1.
MainActivity.Java
package com.example.codetorium.projekulfa.View;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.example.codetorium.projekulfa.ActionHandler.GeneralHandler;
import com.example.codetorium.projekulfa.R;
import com.example.codetorium.projekulfa.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding =
DataBindingUtil.setContentView(MainActivity.this,
R.layout.activity_main);
GeneralHandler handler = new GeneralHandler(MainActivity.this);
binding.setHandler(handler);
}
}
2.
LokasiActivity.Java
package com.example.codetorium.projekulfa.View;
import
import
import
import
import
import
import
import
import
import
import
import
android.Manifest;
android.content.Intent;
android.content.pm.PackageManager;
android.location.Location;
android.location.LocationManager;
android.os.Bundle;
android.support.v4.app.ActivityCompat;
android.support.v7.app.AppCompatActivity;
android.util.Log;
android.view.View;
android.widget.Button;
android.widget.Toast;
import
import
import
import
import
import
import
import
com.example.codetorium.projekulfa.R;
com.google.android.gms.maps.CameraUpdateFactory;
com.google.android.gms.maps.GoogleMap;
com.google.android.gms.maps.MapFragment;
com.google.android.gms.maps.OnMapReadyCallback;
com.google.android.gms.maps.model.CameraPosition;
com.google.android.gms.maps.model.LatLng;
com.google.android.gms.maps.model.MarkerOptions;
import java.util.List;
public class LokasiActivity extends AppCompatActivity {
final int GPS_PERMISSION = 1;
MapFragment mapFragment;
GoogleMap map;
Location mLastLocation;
LocationManager mLocationManager;
Button btnSetLokasi;
Double lat, lng;
@Override
Universitas Sumatera Utara
A-2
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lokasi);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
btnSetLokasi = (Button) findViewById(R.id.btn_set_lokasi);
btnSetLokasi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (lat != null && lng != null) {
Intent resultIntent = new Intent();
resultIntent.putExtra("lat", lat);
resultIntent.putExtra("lng", lng);
setResult(RESULT_OK, resultIntent);
finish();
} else {
Toast.makeText(LokasiActivity.this, "Lokasi belum
diset", Toast.LENGTH_SHORT).show();
}
}
});
mapFragment = (MapFragment)
getFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
map.getUiSettings().setMyLocationButtonEnabled(true);
map.getUiSettings().setZoomControlsEnabled(true);
if
(ActivityCompat.checkSelfPermission(LokasiActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(LokasiActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(LokasiActivity.this, new
String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, GPS_PERMISSION);
}
map.setMyLocationEnabled(true);
mLastLocation = getLastKnownLocation();
map.setOnMapClickListener(new
GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
map.clear();
map.addMarker(new MarkerOptions()
.draggable(true)
.position(latLng)
.title("Posisi Anda"));
moveCamera(latLng);
lat = latLng.latitude;
lng = latLng.longitude;
}
});
if (mLastLocation != null) {
lat = mLastLocation.getLatitude();
Universitas Sumatera Utara
A-3
lng = mLastLocation.getLongitude();
map.addMarker(new MarkerOptions()
.draggable(true)
.position(new
LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()))
.title("Posisi Anda"));
moveCamera(new LatLng(mLastLocation.getLatitude(),
mLastLocation.getLongitude()));
moveCamera(new LatLng(mLastLocation.getLatitude(),
mLastLocation.getLongitude()));
Log.d("LATLNG", "LAT" + mLastLocation.getLatitude());
} else {
Log.d("LATLNG", "LAT NULL MDFK !!");
}
}
});
}
private void moveCamera(LatLng latlng) {
CameraPosition position = CameraPosition.builder()
.target(latlng)
.zoom(14f)
.bearing(0.0f)
.tilt(0.0f)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(position), null);
}
private Location getLastKnownLocation() {
mLocationManager = (LocationManager)
getApplicationContext().getSystemService(LOCATION_SERVICE);
List providers = mLocationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission Problem",
Toast.LENGTH_SHORT).show();
return null;
}
Location l = mLocationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() <
bestLocation.getAccuracy()) {
bestLocation = l;
}
}
return bestLocation;
}
}
3.
Hasil Activity.Java
package com.example.codetorium.projekulfa.View;
import
import
import
import
android.content.Intent;
android.os.AsyncTask;
android.os.Bundle;
android.support.design.widget.TabLayout;
Universitas Sumatera Utara
A-4
import
import
import
import
android.support.v4.app.Fragment;
android.support.v4.view.ViewPager;
android.support.v7.app.AppCompatActivity;
android.util.Log;
import
import
import
import
import
import
import
import
import
import
import
com.example.codetorium.projekulfa.Adapter.ViewPagerAdapter;
com.example.codetorium.projekulfa.Algorithm.Floydwarshall;
com.example.codetorium.projekulfa.Algorithm.Greedy;
com.example.codetorium.projekulfa.Fragment.ListRouteFragment;
com.example.codetorium.projekulfa.Fragment.RouteFragment;
com.example.codetorium.projekulfa.Helper.DatabaseHelper;
com.example.codetorium.projekulfa.Model.Connection;
com.example.codetorium.projekulfa.Model.Node;
com.example.codetorium.projekulfa.Model.Rute;
com.example.codetorium.projekulfa.R;
com.google.android.gms.maps.model.LatLng;
import
import
import
import
java.util.ArrayList;
java.util.Collections;
java.util.Comparator;
java.util.List;
public class HasilActivity extends AppCompatActivity {
List allNode;
List allConnection;
Rute rute;
/*
* Limit titik bertujuan untuk menentukan berapa titik terdekat
* yang akan dianggap sebagai tetangga dari sebuah node
*/
final int limitTitik = 3;
/*
* Semua data ini dikirim dari activity sebelumnya
*/
private final int ALGORITMA_GREEDY = 0;
private final int ALGORITMA_FLOYD = 1;
private
private
private
private
int idTujuan;
int algo;
double lat, lng;
LatLng latLng;
private Node awal, tujuan;
RouteFragment routeFragment;
ListRouteFragment listRouteFragment;
Double jarak = 0.0;
long waktu = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hasil);
Intent inputan = getIntent();
algo = inputan.getIntExtra("algo", ALGORITMA_GREEDY);
lat = inputan.getDoubleExtra("lat", 0);
lng = inputan.getDoubleExtra("lng", 0);
idTujuan = inputan.getIntExtra("id", 0);
latLng = new LatLng(lat, lng);
rute = new Rute();
String stringAlgo = (algo == ALGORITMA_GREEDY) ? "Algoritma
Greedy" : "Algoritma Floyd-Warshall";
Universitas Sumatera Utara
A-5
getSupportActionBar().setTitle("Hasil " + stringAlgo);
new dataLoader().execute();
}
private class dataLoader extends AsyncTask {
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Rute semuaNode = new Rute();
semuaNode.setRute(allNode);
//Membuat Bundle untuk pengiriman paket ke fragment
Bundle args = new Bundle();
args.putSerializable("rute", rute);
args.putSerializable("allNode", semuaNode);
args.putDouble("jarak", jarak);
args.putLong("waktu", waktu);
//Generate View
TabLayout tab;
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
routeFragment = new RouteFragment();
routeFragment.setArguments(args);
listRouteFragment = new ListRouteFragment();
listRouteFragment.setArguments(args);
List fragmentList = new ArrayList();
fragmentList.add(routeFragment);
fragmentList.add(listRouteFragment);
List pageTitle = new ArrayList();
pageTitle.add("Rute Map");
pageTitle.add("List Rute");
viewPagerAdapter = new
ViewPagerAdapter(getSupportFragmentManager(), fragmentList, pageTitle);
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(viewPagerAdapter);
tab = (TabLayout) findViewById(R.id.tabs);
tab.setupWithViewPager(viewPager);
}
@Override
protected Object doInBackground(Object[] params) {
DatabaseHelper dbHelper = new
DatabaseHelper(HasilActivity.this);
allNode = dbHelper.getAllNode();
allConnection = dbHelper.getAllConnection();
Node posisiAwalUser = new Node();
posisiAwalUser.setId(0);
posisiAwalUser.setKet("Posisi Awal");
posisiAwalUser.setNama("Posisi Anda");
posisiAwalUser.setLat(lat);
posisiAwalUser.setLng(lng);
allNode.add(0, posisiAwalUser);
Universitas Sumatera Utara
A-6
//Proses generate tetangga dari masing-masing Node
//Untuk mempermudah program maka didefinisikan aturan
//Bahwa 5 titik terdekat merupakan tetangga
//Dengan demikian maka program dapat melakukan proses input
dengan baik
//Atau didefinisikan connection antar titik
for (final Node node : allNode) {
if (node.getId() == idTujuan) tujuan = node;
for (Node tetangga : allNode) {
if (node.getId() == tetangga.getId()) continue;
node.getTetangga().add(tetangga);
}
Collections.sort(node.getTetangga(), new
Comparator() {
@Override
public int compare(Node o1, Node o2) {
return
o1.getJarak(node).compareTo(o2.getJarak(node));
}
});
}
for (Node node : allNode) {
List temp = new ArrayList(node.getTetangga());
node.getTetangga().clear();
node.getTetangga().addAll(temp.subList(0, limitTitik));
}
//End of Proses generate
awal = posisiAwalUser;
//TODO:End of pencarian node terdekat dari LatLng
if (algo == ALGORITMA_FLOYD) {
//Proses pencarian algoritma floyd
Floydwarshall floydwarshall = new Floydwarshall(allNode);
rute.setRute(floydwarshall.cariRute(awal, tujuan));
jarak = floydwarshall.getTotalJarak();
waktu = floydwarshall.getTotalWaktu();
} else
if (algo == ALGORITMA_GREEDY) {
//Proses pencarian algoritma Greedy
Greedy Greedy = new Greedy();
rute.setRute(Greedy.cariRute(awal, tujuan));
jarak = Greedy.getTotalJarak();
waktu = Greedy.getTotalWaktu();
}
return null;
}
}
}
4.
HalamanPencarian.Java
package com.example.codetorium.projekulfa.View;
import
import
import
import
import
import
import
import
import
android.content.Intent;
android.os.AsyncTask;
android.os.Bundle;
android.support.v7.app.AppCompatActivity;
android.support.v7.widget.CardView;
android.util.Log;
android.view.View;
android.widget.AdapterView;
android.widget.ArrayAdapter;
Universitas Sumatera Utara
A-7
import
import
import
import
android.widget.Button;
android.widget.Spinner;
android.widget.TextView;
android.widget.Toast;
import
import
import
import
import
com.example.codetorium.projekulfa.Adapter.SpinnerAdapter;
com.example.codetorium.projekulfa.Helper.DatabaseHelper;
com.example.codetorium.projekulfa.Model.Connection;
com.example.codetorium.projekulfa.Model.Node;
com.example.codetorium.projekulfa.R;
import java.util.List;
public class HalamanPencarian extends AppCompatActivity {
private final int ALGORITMA_GREEDY = 0;
private final int ALGORITMA_FLOYD = 1;
private Integer idTujuan, algo;
List allNode;
List allConnection;
Button btnSearch;
CardView cvLokasi;
Double latitude, longitude;
Spinner spinnerAlgo, spinnerTujuan;
final String[] algoritma = new String[]{"Greedy", "Floyd-Warshall"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
setContentView(R.layout.activity_halaman_pencarian);
btnSearch = (Button) findViewById(R.id.btn_search);
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (latitude == null || longitude == null) {
Toast.makeText(HalamanPencarian.this, "Lokasi belum
ditentukan", Toast.LENGTH_SHORT).show();
return;
}
Intent halamanHasil = new Intent(HalamanPencarian.this,
HasilActivity.class);
halamanHasil.putExtra("id", idTujuan);
halamanHasil.putExtra("algo", algo);
halamanHasil.putExtra("lat", latitude);
halamanHasil.putExtra("lng", longitude);
startActivity(halamanHasil);
}
});
cvLokasi = (CardView) findViewById(R.id.cardview_lokasi);
cvLokasi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent lokasi = new Intent(HalamanPencarian.this,
LokasiActivity.class);
startActivityForResult(lokasi, 101);
}
});
Universitas Sumatera Utara
A-8
spinnerAlgo = (Spinner) findViewById(R.id.spinner_algoritma);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_dropdown_item, algoritma);
spinnerAlgo.setAdapter(adapter);
spinnerAlgo.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
algo = new Integer(position);
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
spinnerTujuan = (Spinner)
findViewById(R.id.spinner_apotek_tujuan);
spinnerTujuan.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
idTujuan = new Integer(allNode.get(position).getId());
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
new dataLoader().execute();
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 101 && resultCode == RESULT_OK) {
Log.d("RESULT_OK", "Latitude : " + data.getDoubleExtra("lat",
0) + " Longitude : " + data.getDoubleExtra("lng", 0));
TextView textView = (TextView)
findViewById(R.id.tv_position);
latitude = data.getDoubleExtra("lat", 0);
longitude = data.getDoubleExtra("lng", 0);
String teks = "Lat : " + String.format("%.2f", latitude) + "
Long : " + String.format("%.2f", longitude);
textView.setText(teks);
}
}
private class dataLoader extends AsyncTask {
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
SpinnerAdapter spinnerAdapter = new
SpinnerAdapter(HalamanPencarian.this, allNode);
spinnerTujuan.setAdapter(spinnerAdapter);
}
@Override
Universitas Sumatera Utara
A-9
protected Object doInBackground(Object[] params) {
DatabaseHelper dbHelper = new
DatabaseHelper(HalamanPencarian.this);
allNode = dbHelper.getAllNode();
allConnection = dbHelper.getAllConnection();
return null;
}
}
}
5.
Rute.Java
package com.example.codetorium.projekulfa.Model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* Created by codetorium on 13/05/17.
*/
public class Rute implements Serializable {
List rute;
public Rute() {
this.rute = new ArrayList();
}
public List getRute() {
return rute;
}
public void setRute(List rute) {
this.rute = rute;
}
}
6.
Node.Java
package com.example.codetorium.projekulfa.Model;
import com.google.android.gms.maps.model.LatLng;
import
import
import
import
import
java.io.Serializable;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
/**
* Created by codetorium on 28/04/17.
*/
public class Node {
private int id;
private String nama, ket;
private boolean apotik;
private double lat, lng;
private List tetangga;
public Map jarak;
public Node(){
tetangga = new ArrayList();
id = 0;
Universitas Sumatera Utara
A-10
nama = "";
ket = "";
lat = 0;
lng = 0;
jarak = new HashMap();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getKet() {
return ket;
}
public void setKet(String ket) {
this.ket = ket;
}
public boolean isApotik() {
return apotik;
}
public void setApotik(boolean apotik) {
this.apotik = apotik;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
public double getLng() {
return lng;
}
public void setLng(double lng) {
this.lng = lng;
}
public List getTetangga() {
return tetangga;
}
public void setTetangga(List tetangga) {
this.tetangga = tetangga;
}
public double euclidean(Node a, Node b){
double derajatKeKM = 111.319;
return (Math.sqrt(Math.pow(a.getLat() - b.getLat(), 2) +
Math.pow(a.getLng() - b.getLng(), 2))) * derajatKeKM;
Universitas Sumatera Utara
A-11
}
public double euclidean(LatLng latLng){
double derajatKeKM = 111.319;
return (Math.sqrt(Math.pow(this.getLat() - latLng.latitude, 2) +
Math.pow(this.getLng() - latLng.longitude, 2))) * derajatKeKM;
}
public Double getJarak(Node node){
if(node.getId() == this.getId()) return 0.;
if(this.getTetangga().indexOf(node) == -1 &&
node.getTetangga().indexOf(this) == -1) return Double.POSITIVE_INFINITY;
return euclidean(this, node);
}
}
7.
Connection.Java
package com.example.codetorium.projekulfa.Model;
/**
* Created by codetorium on 28/04/17.
*/
public class Connection {
private int id, idAwal, idTujuan;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getIdAwal() {
return idAwal;
}
public void setIdAwal(int idAwal) {
this.idAwal = idAwal;
}
public int getIdTujuan() {
return idTujuan;
}
public void setIdTujuan(int idTujuan) {
this.idTujuan = idTujuan;
}
}
8.
DatabaseHelper.Java
package com.example.codetorium.projekulfa.Helper;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.codetorium.projekulfa.Model.Connection;
import com.example.codetorium.projekulfa.Model.Node;
import java.util.ArrayList;
import java.util.List;
Universitas Sumatera Utara
A-12
/**
* Created by codetorium on 08/05/17.
*/
public class DatabaseHelper {
private AssetHelper assetHelper;
private SQLiteDatabase db;
public DatabaseHelper(Context context){
assetHelper = new AssetHelper(context);
db = assetHelper.getReadableDatabase();
}
public List getAllNode(){
List result = new ArrayList();
Cursor cursor = db.rawQuery("SELECT * FROM Tempat", null);
if(cursor.moveToFirst()){
do {
Node node = new Node();
node.setId(cursor.getInt(0));
node.setNama(cursor.getString(1));
node.setLat(cursor.getDouble(2));
node.setLng(cursor.getDouble(3));
node.setKet(cursor.getString(4));
node.setApotik(cursor.getInt(5) != 0 ? true : false);
result.add(node);
} while (cursor.moveToNext());
}
return result;
}
public List getAllConnection(){
List result = new ArrayList();
Cursor cursor = db.rawQuery("SELECT * FROM hubungan", null);
if(cursor.moveToFirst()){
do {
Connection connection = new Connection();
connection.setId(cursor.getInt(0));
connection.setIdAwal(cursor.getInt(1));
connection.setIdTujuan(cursor.getInt(2));
result.add(connection);
} while (cursor.moveToNext());
}
return result;
}
}
9.
AssetsHelper.Java
package com.example.codetorium.projekulfa.Helper;
import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
/**
* Created by codetorium on 08/05/17.
*/
public class AssetHelper extends SQLiteAssetHelper {
private static final String DB_NAME = "apotek.sqlite";
private static final int DB_VERSION = 1;
Universitas Sumatera Utara
A-13
public AssetHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
}
10. RouteFragment.Java
package com.example.codetorium.projekulfa.Helper;
import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
/**
* Created by codetorium on 08/05/17.
*/
public class AssetHelper extends SQLiteAssetHelper {
private static final String DB_NAME = "apotek.sqlite";
private static final int DB_VERSION = 1;
public AssetHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
}
11. ListRouteFragment.Java
package com.example.codetorium.projekulfa.Fragment;
import
import
import
import
import
import
import
android.os.Bundle;
android.support.v4.app.Fragment;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.ListView;
android.widget.TextView;
import
import
import
import
com.example.codetorium.projekulfa.Adapter.RouteAdapter;
com.example.codetorium.projekulfa.Model.Node;
com.example.codetorium.projekulfa.Model.Rute;
com.example.codetorium.projekulfa.R;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class ListRouteFragment extends Fragment {
Rute rute;
public ListRouteFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_list_route,
Universitas Sumatera Utara
A-14
container, false);
rute = (Rute) getArguments().getSerializable("rute");
RouteAdapter routeAdapter = new RouteAdapter(getActivity(),
rute.getRute());
ListView lvRute = (ListView)
view.findViewById(R.id.listview_rute);
lvRute.setAdapter(routeAdapter);
return view;
}
}
12. Greedy.Java
package com.example.codetorium.projekulfa.Algorithm;
import android.util.Log;
import com.example.codetorium.projekulfa.Model.Node;
import java.util.ArrayList;
import java.util.List;
/**
* Created by codetorium on 28/04/17.
*/
public class Greedy {
List open, closed;
double totalJarak;
long totalWaktu;
public Greedy() {
this.open = new ArrayList();
this.closed = new ArrayList();
this.totalWaktu = 0;
this.totalJarak = 0;
}
public double getTotalJarak() {
return totalJarak;
}
public void setTotalJarak(double totalJarak) {
this.totalJarak = totalJarak;
}
public long getTotalWaktu() {
return totalWaktu;
}
public void setTotalWaktu(long totalWaktu) {
this.totalWaktu = totalWaktu;
}
public List cariRute(Node awal, Node tujuan) {
long start = System.currentTimeMillis();
double jarakMinimum;
Node aktifNode = awal, minNode = null;
List rute = new ArrayList();
totalJarak = 0;
Universitas Sumatera Utara
A-15
boolean adaTetangga = true;
while (adaTetangga) {
rute.add(aktifNode);
adaTetangga = false;
jarakMinimum = Double.POSITIVE_INFINITY;
for (Node node : aktifNode.getTetangga()) {
if (closed.indexOf(node) == -1) {
if (aktifNode.getJarak(node) < jarakMinimum) {
jarakMinimum = aktifNode.getJarak(node);
minNode = node;
}
adaTetangga = true;
}
}
closed.add(aktifNode);
aktifNode = minNode;
if(jarakMinimum != Double.POSITIVE_INFINITY)
totalJarak += jarakMinimum;
if(aktifNode.getId() == tujuan.getId()){
break;
}
}
long end = System.currentTimeMillis();
totalWaktu = end - start;
return rute;
}
}
13. Floyd-warshall.java
package com.example.codetorium.projekulfa.Algorithm;
import android.util.Log;
import com.example.codetorium.projekulfa.Model.Node;
import java.util.ArrayList;
import java.util.List;
/**
* Created by codetorium on 28/04/17.
*/
//TODO:Floyd - Warshall Diatur lagi
//TODO:Hasilnya masih berantakan
public class Floydwarshall {
private class FloydObject {
Node node;
List rute;
Double jarak;
public FloydObject(){
this.node = new Node();
this.rute = new ArrayList();
this.jarak = 0.0;
}
}
List allNode;
Universitas Sumatera Utara
A-16
double totalJarak;
long totalWaktu;
public Floydwarshall(List allNode){
this.allNode = allNode;
}
public double getTotalJarak() {
return totalJarak;
}
public void setTotalJarak(double totalJarak) {
this.totalJarak = totalJarak;
}
public long getTotalWaktu() {
return totalWaktu;
}
public void setTotalWaktu(long totalWaktu) {
this.totalWaktu = totalWaktu;
}
public List cariRute(Node awal, Node tujuan){
List result = new ArrayList();
long start = System.currentTimeMillis();
//Bagian Inisialisasi jarak awal
FloydObject[][] floydObjects = new
FloydObject[allNode.size()][allNode.size()];
for(int k = 0; k < allNode.size(); k++){
for(int i = 0; i < allNode.size(); i++) {
floydObjects[k][i] = new FloydObject();
floydObjects[k][i].node = allNode.get(k);
floydObjects[k][i].jarak =
allNode.get(k).getJarak(allNode.get(i));
if(floydObjects[k][i].jarak > 0 &&
floydObjects[k][i].jarak != Double.POSITIVE_INFINITY) {
floydObjects[k][i].rute.add(allNode.get(k));
floydObjects[k][i].rute.add(allNode.get(i));
}
}
}
//Debug Result
int nNode = allNode.size();
String hasilLog = "";
for(int i = 0; i < nNode; i++){
for(int j = 0; j < nNode; j++){
String tempHasil = String.format("%.2f",
floydObjects[i][j].jarak);
hasilLog += ((tempHasil.length() > 4) ?
tempHasil.substring(0, 3) : tempHasil) + " ";
}
hasilLog += "\n";
}
Log.d("TABEL_SEBELUM", hasilLog);
for(int k = 0; k < nNode; k++){
for(int i = 0; i < nNode; i++){
for(int j = 0; j < nNode; j++){
double ij, ik, kj;
ij = floydObjects[i][j].jarak;
ik = floydObjects[i][k].jarak;
Universitas Sumatera Utara
A-17
kj = floydObjects[k][j].jarak;
if(ij > ik + kj){
floydObjects[i][j].rute.clear();
floydObjects[i][j].rute.addAll(floydObjects[i][k].rute);
floydObjects[i][j].rute.addAll(floydObjects[k][j].rute);
floydObjects[i][j].jarak = ik + kj;
}
}
}
}
int indexFrom, indexTo;
indexFrom = allNode.indexOf(awal);
indexTo = allNode.indexOf(tujuan);
if(indexFrom == -1 || indexTo == -1){
Log.d("ERROR_INDEX", "NODE TIDAK DITEMUKAN DALAM ALL NODE");
}
List rute = floydObjects[indexFrom][indexTo].rute;
totalJarak = floydObjects[indexFrom][indexTo].jarak;
Node prevNode = new Node();
prevNode.setId(-1);
for(Node node : rute){
if(prevNode.getId() == node.getId()) continue;
result.add(node);
prevNode = node;
}
long end = System.currentTimeMillis();
this.totalWaktu = end - start;
for(Node node : result){
Log.d("FLOYD", node.getNama());
}
return result;
}
}
14. RouteAdapter.java
package com.example.codetorium.projekulfa.Adapter;
import
import
import
import
import
import
android.content.Context;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.TextView;
import com.example.codetorium.projekulfa.Model.Node;
import com.example.codetorium.projekulfa.R;
import java.util.ArrayList;
import java.util.List;
/**
Universitas Sumatera Utara
A-18
* Created by codetorium on 11/05/17.
*/
public class RouteAdapter extends BaseAdapter {
List rute;
Context context;
LayoutInflater inflater;
public RouteAdapter(Context context, List rute){
this.rute = new ArrayList(rute);
this.context = context;
this.inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return rute.size();
}
@Override
public Object getItem(int position) {
return rute.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = inflater.inflate(R.layout.route_item_layout, null);
TextView tvJalan = (TextView) view.findViewById(R.id.tv_rute);
tvJalan.setText(rute.get(position).getKet());
TextView tvKet = (TextView)
view.findViewById(R.id.tv_keterangan);
String newKeterangan = "";
if(position == 0){
newKeterangan = "Melangkah dari posisi anda skrg";
} else
if(position == this.rute.size()-1){
newKeterangan = "Anda sudah sampai di tujuan " +
rute.get(position).getNama();
} else
if(position != 0 && position != this.rute.size()-1) {
newKeterangan = "Pastikan anda sudah melewati : " +
rute.get(position).getNama();
}
tvKet.setText(newKeterangan);
return view;
}
}
15. SpinnerAdapter
package com.example.codetorium.projekulfa.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
Universitas Sumatera Utara
A-19
import
import
import
import
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.TextView;
import com.example.codetorium.projekulfa.Model.Node;
import com.example.codetorium.projekulfa.R;
import java.util.List;
import java.util.Locale;
/**
* Created by codetorium on 09/05/17.
*/
public class SpinnerAdapter extends BaseAdapter {
List allNode;
Context context;
LayoutInflater inflater;
public SpinnerAdapter(Context context, List allNode){
this.context = context;
this.allNode = allNode;
this.inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return allNode.size();
}
@Override
public Object getItem(int position) {
return allNode.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = inflater.inflate(R.layout.spinner_item_layout, null);
TextView tvNama, tvLatLng, tvKet;
tvNama = (TextView) view.findViewById(R.id.tv_nama);
tvLatLng = (TextView) view.findViewById(R.id.tv_latlng);
tvKet = (TextView) view.findViewById(R.id.tv_ket);
tvNama.setText(allNode.get(position).getNama());
String latLng = "Latitude : " + String.format(Locale.UK, "%.2f",
allNode.get(position).getLat()) +
" Longitude : " + String.format(Locale.UK,
"%.2f", allNode.get(position).getLng());
tvLatLng.setText(latLng);
tvKet.setText(allNode.get(position).getKet());
return view;
}
}
Universitas Sumatera Utara
A-20
16. ViewPageAdapter.Java
package com.example.codetorium.projekulfa.Adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* Created by codetorium on 11/05/17.
*/
public class ViewPagerAdapter extends FragmentPagerAdapter {
List fragmentList;
List pageTitle;
public ViewPagerAdapter(FragmentManager fm, List
fragmentList, List pageTitle) {
super(fm);
this.fragmentList = fragmentList;
this.pageTitle = pageTitle;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return pageTitle.get(position);
}
}
17. GeralAdapter.Java
package com.example.codetorium.projekulfa.ActionHandler;
import android.content.Context;
import android.content.Intent;
import com.example.codetorium.projekulfa.View.HalamanPencarian;
import com.example.codetorium.projekulfa.View.LokasiActivity;
/**
* Created by codetorium on 28/04/17.
*/
public class GeneralHandler {
Context context;
public GeneralHandler(Context context){
this.context = context;
}
public void pengujianOnClick(){
Intent halamanPencarian = new Intent(context,
HalamanPencarian.class);
Universitas Sumatera Utara
A-21
context.startActivity(halamanPencarian);
}
public void cariLokasi(){
Intent halamanLokasi = new Intent(context, LokasiActivity.class);
context.startActivity(halamanLokasi);
}
}
Universitas Sumatera Utara
A-22
DAFTAR RIWAYAT HIDUP
DATA PRIBADI
Nama
Tempat /Tgl Lahir
Jenis Kelamin
Agama
Tinggi Badan
Berat Badan
Status
Warga Negara
Alamat
:
:
:
:
:
:
:
:
:
Khairina Ulfa Nst
Medan, 15 Oktober 1993
Perempuan
Islam
156 cm
57 Kg
Belum Menikah
Indonesia
Jl. HM Yamin, Medan
Kode Pos : 20233
Telepon
E-mail
:
:
0813 6135 3279
[email protected]
PENDIDIKAN FORMAL
1999 – 2005
:
SD 060852 Medan
(Berijazah)
2005 – 2008
:
MTsN 2 Medan
(Berijazah)
2008 – 2011
:
MAN 1 Medan
(Berijazah)
2011 – 2014
:
Politeknik Negeri Medan
(Berijazah)
2014 – Sekarang
:
Universitas Sumatera Utara
(Mahasiswa)
Universitas Sumatera Utara
LISTING PROGRAM
1.
MainActivity.Java
package com.example.codetorium.projekulfa.View;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.example.codetorium.projekulfa.ActionHandler.GeneralHandler;
import com.example.codetorium.projekulfa.R;
import com.example.codetorium.projekulfa.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding =
DataBindingUtil.setContentView(MainActivity.this,
R.layout.activity_main);
GeneralHandler handler = new GeneralHandler(MainActivity.this);
binding.setHandler(handler);
}
}
2.
LokasiActivity.Java
package com.example.codetorium.projekulfa.View;
import
import
import
import
import
import
import
import
import
import
import
import
android.Manifest;
android.content.Intent;
android.content.pm.PackageManager;
android.location.Location;
android.location.LocationManager;
android.os.Bundle;
android.support.v4.app.ActivityCompat;
android.support.v7.app.AppCompatActivity;
android.util.Log;
android.view.View;
android.widget.Button;
android.widget.Toast;
import
import
import
import
import
import
import
import
com.example.codetorium.projekulfa.R;
com.google.android.gms.maps.CameraUpdateFactory;
com.google.android.gms.maps.GoogleMap;
com.google.android.gms.maps.MapFragment;
com.google.android.gms.maps.OnMapReadyCallback;
com.google.android.gms.maps.model.CameraPosition;
com.google.android.gms.maps.model.LatLng;
com.google.android.gms.maps.model.MarkerOptions;
import java.util.List;
public class LokasiActivity extends AppCompatActivity {
final int GPS_PERMISSION = 1;
MapFragment mapFragment;
GoogleMap map;
Location mLastLocation;
LocationManager mLocationManager;
Button btnSetLokasi;
Double lat, lng;
@Override
Universitas Sumatera Utara
A-2
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lokasi);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
btnSetLokasi = (Button) findViewById(R.id.btn_set_lokasi);
btnSetLokasi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (lat != null && lng != null) {
Intent resultIntent = new Intent();
resultIntent.putExtra("lat", lat);
resultIntent.putExtra("lng", lng);
setResult(RESULT_OK, resultIntent);
finish();
} else {
Toast.makeText(LokasiActivity.this, "Lokasi belum
diset", Toast.LENGTH_SHORT).show();
}
}
});
mapFragment = (MapFragment)
getFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
map.getUiSettings().setMyLocationButtonEnabled(true);
map.getUiSettings().setZoomControlsEnabled(true);
if
(ActivityCompat.checkSelfPermission(LokasiActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(LokasiActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(LokasiActivity.this, new
String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION}, GPS_PERMISSION);
}
map.setMyLocationEnabled(true);
mLastLocation = getLastKnownLocation();
map.setOnMapClickListener(new
GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
map.clear();
map.addMarker(new MarkerOptions()
.draggable(true)
.position(latLng)
.title("Posisi Anda"));
moveCamera(latLng);
lat = latLng.latitude;
lng = latLng.longitude;
}
});
if (mLastLocation != null) {
lat = mLastLocation.getLatitude();
Universitas Sumatera Utara
A-3
lng = mLastLocation.getLongitude();
map.addMarker(new MarkerOptions()
.draggable(true)
.position(new
LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()))
.title("Posisi Anda"));
moveCamera(new LatLng(mLastLocation.getLatitude(),
mLastLocation.getLongitude()));
moveCamera(new LatLng(mLastLocation.getLatitude(),
mLastLocation.getLongitude()));
Log.d("LATLNG", "LAT" + mLastLocation.getLatitude());
} else {
Log.d("LATLNG", "LAT NULL MDFK !!");
}
}
});
}
private void moveCamera(LatLng latlng) {
CameraPosition position = CameraPosition.builder()
.target(latlng)
.zoom(14f)
.bearing(0.0f)
.tilt(0.0f)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(position), null);
}
private Location getLastKnownLocation() {
mLocationManager = (LocationManager)
getApplicationContext().getSystemService(LOCATION_SERVICE);
List providers = mLocationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission Problem",
Toast.LENGTH_SHORT).show();
return null;
}
Location l = mLocationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() <
bestLocation.getAccuracy()) {
bestLocation = l;
}
}
return bestLocation;
}
}
3.
Hasil Activity.Java
package com.example.codetorium.projekulfa.View;
import
import
import
import
android.content.Intent;
android.os.AsyncTask;
android.os.Bundle;
android.support.design.widget.TabLayout;
Universitas Sumatera Utara
A-4
import
import
import
import
android.support.v4.app.Fragment;
android.support.v4.view.ViewPager;
android.support.v7.app.AppCompatActivity;
android.util.Log;
import
import
import
import
import
import
import
import
import
import
import
com.example.codetorium.projekulfa.Adapter.ViewPagerAdapter;
com.example.codetorium.projekulfa.Algorithm.Floydwarshall;
com.example.codetorium.projekulfa.Algorithm.Greedy;
com.example.codetorium.projekulfa.Fragment.ListRouteFragment;
com.example.codetorium.projekulfa.Fragment.RouteFragment;
com.example.codetorium.projekulfa.Helper.DatabaseHelper;
com.example.codetorium.projekulfa.Model.Connection;
com.example.codetorium.projekulfa.Model.Node;
com.example.codetorium.projekulfa.Model.Rute;
com.example.codetorium.projekulfa.R;
com.google.android.gms.maps.model.LatLng;
import
import
import
import
java.util.ArrayList;
java.util.Collections;
java.util.Comparator;
java.util.List;
public class HasilActivity extends AppCompatActivity {
List allNode;
List allConnection;
Rute rute;
/*
* Limit titik bertujuan untuk menentukan berapa titik terdekat
* yang akan dianggap sebagai tetangga dari sebuah node
*/
final int limitTitik = 3;
/*
* Semua data ini dikirim dari activity sebelumnya
*/
private final int ALGORITMA_GREEDY = 0;
private final int ALGORITMA_FLOYD = 1;
private
private
private
private
int idTujuan;
int algo;
double lat, lng;
LatLng latLng;
private Node awal, tujuan;
RouteFragment routeFragment;
ListRouteFragment listRouteFragment;
Double jarak = 0.0;
long waktu = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hasil);
Intent inputan = getIntent();
algo = inputan.getIntExtra("algo", ALGORITMA_GREEDY);
lat = inputan.getDoubleExtra("lat", 0);
lng = inputan.getDoubleExtra("lng", 0);
idTujuan = inputan.getIntExtra("id", 0);
latLng = new LatLng(lat, lng);
rute = new Rute();
String stringAlgo = (algo == ALGORITMA_GREEDY) ? "Algoritma
Greedy" : "Algoritma Floyd-Warshall";
Universitas Sumatera Utara
A-5
getSupportActionBar().setTitle("Hasil " + stringAlgo);
new dataLoader().execute();
}
private class dataLoader extends AsyncTask {
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Rute semuaNode = new Rute();
semuaNode.setRute(allNode);
//Membuat Bundle untuk pengiriman paket ke fragment
Bundle args = new Bundle();
args.putSerializable("rute", rute);
args.putSerializable("allNode", semuaNode);
args.putDouble("jarak", jarak);
args.putLong("waktu", waktu);
//Generate View
TabLayout tab;
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
routeFragment = new RouteFragment();
routeFragment.setArguments(args);
listRouteFragment = new ListRouteFragment();
listRouteFragment.setArguments(args);
List fragmentList = new ArrayList();
fragmentList.add(routeFragment);
fragmentList.add(listRouteFragment);
List pageTitle = new ArrayList();
pageTitle.add("Rute Map");
pageTitle.add("List Rute");
viewPagerAdapter = new
ViewPagerAdapter(getSupportFragmentManager(), fragmentList, pageTitle);
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(viewPagerAdapter);
tab = (TabLayout) findViewById(R.id.tabs);
tab.setupWithViewPager(viewPager);
}
@Override
protected Object doInBackground(Object[] params) {
DatabaseHelper dbHelper = new
DatabaseHelper(HasilActivity.this);
allNode = dbHelper.getAllNode();
allConnection = dbHelper.getAllConnection();
Node posisiAwalUser = new Node();
posisiAwalUser.setId(0);
posisiAwalUser.setKet("Posisi Awal");
posisiAwalUser.setNama("Posisi Anda");
posisiAwalUser.setLat(lat);
posisiAwalUser.setLng(lng);
allNode.add(0, posisiAwalUser);
Universitas Sumatera Utara
A-6
//Proses generate tetangga dari masing-masing Node
//Untuk mempermudah program maka didefinisikan aturan
//Bahwa 5 titik terdekat merupakan tetangga
//Dengan demikian maka program dapat melakukan proses input
dengan baik
//Atau didefinisikan connection antar titik
for (final Node node : allNode) {
if (node.getId() == idTujuan) tujuan = node;
for (Node tetangga : allNode) {
if (node.getId() == tetangga.getId()) continue;
node.getTetangga().add(tetangga);
}
Collections.sort(node.getTetangga(), new
Comparator() {
@Override
public int compare(Node o1, Node o2) {
return
o1.getJarak(node).compareTo(o2.getJarak(node));
}
});
}
for (Node node : allNode) {
List temp = new ArrayList(node.getTetangga());
node.getTetangga().clear();
node.getTetangga().addAll(temp.subList(0, limitTitik));
}
//End of Proses generate
awal = posisiAwalUser;
//TODO:End of pencarian node terdekat dari LatLng
if (algo == ALGORITMA_FLOYD) {
//Proses pencarian algoritma floyd
Floydwarshall floydwarshall = new Floydwarshall(allNode);
rute.setRute(floydwarshall.cariRute(awal, tujuan));
jarak = floydwarshall.getTotalJarak();
waktu = floydwarshall.getTotalWaktu();
} else
if (algo == ALGORITMA_GREEDY) {
//Proses pencarian algoritma Greedy
Greedy Greedy = new Greedy();
rute.setRute(Greedy.cariRute(awal, tujuan));
jarak = Greedy.getTotalJarak();
waktu = Greedy.getTotalWaktu();
}
return null;
}
}
}
4.
HalamanPencarian.Java
package com.example.codetorium.projekulfa.View;
import
import
import
import
import
import
import
import
import
android.content.Intent;
android.os.AsyncTask;
android.os.Bundle;
android.support.v7.app.AppCompatActivity;
android.support.v7.widget.CardView;
android.util.Log;
android.view.View;
android.widget.AdapterView;
android.widget.ArrayAdapter;
Universitas Sumatera Utara
A-7
import
import
import
import
android.widget.Button;
android.widget.Spinner;
android.widget.TextView;
android.widget.Toast;
import
import
import
import
import
com.example.codetorium.projekulfa.Adapter.SpinnerAdapter;
com.example.codetorium.projekulfa.Helper.DatabaseHelper;
com.example.codetorium.projekulfa.Model.Connection;
com.example.codetorium.projekulfa.Model.Node;
com.example.codetorium.projekulfa.R;
import java.util.List;
public class HalamanPencarian extends AppCompatActivity {
private final int ALGORITMA_GREEDY = 0;
private final int ALGORITMA_FLOYD = 1;
private Integer idTujuan, algo;
List allNode;
List allConnection;
Button btnSearch;
CardView cvLokasi;
Double latitude, longitude;
Spinner spinnerAlgo, spinnerTujuan;
final String[] algoritma = new String[]{"Greedy", "Floyd-Warshall"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
setContentView(R.layout.activity_halaman_pencarian);
btnSearch = (Button) findViewById(R.id.btn_search);
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (latitude == null || longitude == null) {
Toast.makeText(HalamanPencarian.this, "Lokasi belum
ditentukan", Toast.LENGTH_SHORT).show();
return;
}
Intent halamanHasil = new Intent(HalamanPencarian.this,
HasilActivity.class);
halamanHasil.putExtra("id", idTujuan);
halamanHasil.putExtra("algo", algo);
halamanHasil.putExtra("lat", latitude);
halamanHasil.putExtra("lng", longitude);
startActivity(halamanHasil);
}
});
cvLokasi = (CardView) findViewById(R.id.cardview_lokasi);
cvLokasi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent lokasi = new Intent(HalamanPencarian.this,
LokasiActivity.class);
startActivityForResult(lokasi, 101);
}
});
Universitas Sumatera Utara
A-8
spinnerAlgo = (Spinner) findViewById(R.id.spinner_algoritma);
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_dropdown_item, algoritma);
spinnerAlgo.setAdapter(adapter);
spinnerAlgo.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
algo = new Integer(position);
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
spinnerTujuan = (Spinner)
findViewById(R.id.spinner_apotek_tujuan);
spinnerTujuan.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
idTujuan = new Integer(allNode.get(position).getId());
}
@Override
public void onNothingSelected(AdapterView parent) {
}
});
new dataLoader().execute();
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 101 && resultCode == RESULT_OK) {
Log.d("RESULT_OK", "Latitude : " + data.getDoubleExtra("lat",
0) + " Longitude : " + data.getDoubleExtra("lng", 0));
TextView textView = (TextView)
findViewById(R.id.tv_position);
latitude = data.getDoubleExtra("lat", 0);
longitude = data.getDoubleExtra("lng", 0);
String teks = "Lat : " + String.format("%.2f", latitude) + "
Long : " + String.format("%.2f", longitude);
textView.setText(teks);
}
}
private class dataLoader extends AsyncTask {
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
SpinnerAdapter spinnerAdapter = new
SpinnerAdapter(HalamanPencarian.this, allNode);
spinnerTujuan.setAdapter(spinnerAdapter);
}
@Override
Universitas Sumatera Utara
A-9
protected Object doInBackground(Object[] params) {
DatabaseHelper dbHelper = new
DatabaseHelper(HalamanPencarian.this);
allNode = dbHelper.getAllNode();
allConnection = dbHelper.getAllConnection();
return null;
}
}
}
5.
Rute.Java
package com.example.codetorium.projekulfa.Model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* Created by codetorium on 13/05/17.
*/
public class Rute implements Serializable {
List rute;
public Rute() {
this.rute = new ArrayList();
}
public List getRute() {
return rute;
}
public void setRute(List rute) {
this.rute = rute;
}
}
6.
Node.Java
package com.example.codetorium.projekulfa.Model;
import com.google.android.gms.maps.model.LatLng;
import
import
import
import
import
java.io.Serializable;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
/**
* Created by codetorium on 28/04/17.
*/
public class Node {
private int id;
private String nama, ket;
private boolean apotik;
private double lat, lng;
private List tetangga;
public Map jarak;
public Node(){
tetangga = new ArrayList();
id = 0;
Universitas Sumatera Utara
A-10
nama = "";
ket = "";
lat = 0;
lng = 0;
jarak = new HashMap();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getKet() {
return ket;
}
public void setKet(String ket) {
this.ket = ket;
}
public boolean isApotik() {
return apotik;
}
public void setApotik(boolean apotik) {
this.apotik = apotik;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
public double getLng() {
return lng;
}
public void setLng(double lng) {
this.lng = lng;
}
public List getTetangga() {
return tetangga;
}
public void setTetangga(List tetangga) {
this.tetangga = tetangga;
}
public double euclidean(Node a, Node b){
double derajatKeKM = 111.319;
return (Math.sqrt(Math.pow(a.getLat() - b.getLat(), 2) +
Math.pow(a.getLng() - b.getLng(), 2))) * derajatKeKM;
Universitas Sumatera Utara
A-11
}
public double euclidean(LatLng latLng){
double derajatKeKM = 111.319;
return (Math.sqrt(Math.pow(this.getLat() - latLng.latitude, 2) +
Math.pow(this.getLng() - latLng.longitude, 2))) * derajatKeKM;
}
public Double getJarak(Node node){
if(node.getId() == this.getId()) return 0.;
if(this.getTetangga().indexOf(node) == -1 &&
node.getTetangga().indexOf(this) == -1) return Double.POSITIVE_INFINITY;
return euclidean(this, node);
}
}
7.
Connection.Java
package com.example.codetorium.projekulfa.Model;
/**
* Created by codetorium on 28/04/17.
*/
public class Connection {
private int id, idAwal, idTujuan;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getIdAwal() {
return idAwal;
}
public void setIdAwal(int idAwal) {
this.idAwal = idAwal;
}
public int getIdTujuan() {
return idTujuan;
}
public void setIdTujuan(int idTujuan) {
this.idTujuan = idTujuan;
}
}
8.
DatabaseHelper.Java
package com.example.codetorium.projekulfa.Helper;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.codetorium.projekulfa.Model.Connection;
import com.example.codetorium.projekulfa.Model.Node;
import java.util.ArrayList;
import java.util.List;
Universitas Sumatera Utara
A-12
/**
* Created by codetorium on 08/05/17.
*/
public class DatabaseHelper {
private AssetHelper assetHelper;
private SQLiteDatabase db;
public DatabaseHelper(Context context){
assetHelper = new AssetHelper(context);
db = assetHelper.getReadableDatabase();
}
public List getAllNode(){
List result = new ArrayList();
Cursor cursor = db.rawQuery("SELECT * FROM Tempat", null);
if(cursor.moveToFirst()){
do {
Node node = new Node();
node.setId(cursor.getInt(0));
node.setNama(cursor.getString(1));
node.setLat(cursor.getDouble(2));
node.setLng(cursor.getDouble(3));
node.setKet(cursor.getString(4));
node.setApotik(cursor.getInt(5) != 0 ? true : false);
result.add(node);
} while (cursor.moveToNext());
}
return result;
}
public List getAllConnection(){
List result = new ArrayList();
Cursor cursor = db.rawQuery("SELECT * FROM hubungan", null);
if(cursor.moveToFirst()){
do {
Connection connection = new Connection();
connection.setId(cursor.getInt(0));
connection.setIdAwal(cursor.getInt(1));
connection.setIdTujuan(cursor.getInt(2));
result.add(connection);
} while (cursor.moveToNext());
}
return result;
}
}
9.
AssetsHelper.Java
package com.example.codetorium.projekulfa.Helper;
import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
/**
* Created by codetorium on 08/05/17.
*/
public class AssetHelper extends SQLiteAssetHelper {
private static final String DB_NAME = "apotek.sqlite";
private static final int DB_VERSION = 1;
Universitas Sumatera Utara
A-13
public AssetHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
}
10. RouteFragment.Java
package com.example.codetorium.projekulfa.Helper;
import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
/**
* Created by codetorium on 08/05/17.
*/
public class AssetHelper extends SQLiteAssetHelper {
private static final String DB_NAME = "apotek.sqlite";
private static final int DB_VERSION = 1;
public AssetHelper(Context context){
super(context, DB_NAME, null, DB_VERSION);
}
}
11. ListRouteFragment.Java
package com.example.codetorium.projekulfa.Fragment;
import
import
import
import
import
import
import
android.os.Bundle;
android.support.v4.app.Fragment;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.ListView;
android.widget.TextView;
import
import
import
import
com.example.codetorium.projekulfa.Adapter.RouteAdapter;
com.example.codetorium.projekulfa.Model.Node;
com.example.codetorium.projekulfa.Model.Rute;
com.example.codetorium.projekulfa.R;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class ListRouteFragment extends Fragment {
Rute rute;
public ListRouteFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_list_route,
Universitas Sumatera Utara
A-14
container, false);
rute = (Rute) getArguments().getSerializable("rute");
RouteAdapter routeAdapter = new RouteAdapter(getActivity(),
rute.getRute());
ListView lvRute = (ListView)
view.findViewById(R.id.listview_rute);
lvRute.setAdapter(routeAdapter);
return view;
}
}
12. Greedy.Java
package com.example.codetorium.projekulfa.Algorithm;
import android.util.Log;
import com.example.codetorium.projekulfa.Model.Node;
import java.util.ArrayList;
import java.util.List;
/**
* Created by codetorium on 28/04/17.
*/
public class Greedy {
List open, closed;
double totalJarak;
long totalWaktu;
public Greedy() {
this.open = new ArrayList();
this.closed = new ArrayList();
this.totalWaktu = 0;
this.totalJarak = 0;
}
public double getTotalJarak() {
return totalJarak;
}
public void setTotalJarak(double totalJarak) {
this.totalJarak = totalJarak;
}
public long getTotalWaktu() {
return totalWaktu;
}
public void setTotalWaktu(long totalWaktu) {
this.totalWaktu = totalWaktu;
}
public List cariRute(Node awal, Node tujuan) {
long start = System.currentTimeMillis();
double jarakMinimum;
Node aktifNode = awal, minNode = null;
List rute = new ArrayList();
totalJarak = 0;
Universitas Sumatera Utara
A-15
boolean adaTetangga = true;
while (adaTetangga) {
rute.add(aktifNode);
adaTetangga = false;
jarakMinimum = Double.POSITIVE_INFINITY;
for (Node node : aktifNode.getTetangga()) {
if (closed.indexOf(node) == -1) {
if (aktifNode.getJarak(node) < jarakMinimum) {
jarakMinimum = aktifNode.getJarak(node);
minNode = node;
}
adaTetangga = true;
}
}
closed.add(aktifNode);
aktifNode = minNode;
if(jarakMinimum != Double.POSITIVE_INFINITY)
totalJarak += jarakMinimum;
if(aktifNode.getId() == tujuan.getId()){
break;
}
}
long end = System.currentTimeMillis();
totalWaktu = end - start;
return rute;
}
}
13. Floyd-warshall.java
package com.example.codetorium.projekulfa.Algorithm;
import android.util.Log;
import com.example.codetorium.projekulfa.Model.Node;
import java.util.ArrayList;
import java.util.List;
/**
* Created by codetorium on 28/04/17.
*/
//TODO:Floyd - Warshall Diatur lagi
//TODO:Hasilnya masih berantakan
public class Floydwarshall {
private class FloydObject {
Node node;
List rute;
Double jarak;
public FloydObject(){
this.node = new Node();
this.rute = new ArrayList();
this.jarak = 0.0;
}
}
List allNode;
Universitas Sumatera Utara
A-16
double totalJarak;
long totalWaktu;
public Floydwarshall(List allNode){
this.allNode = allNode;
}
public double getTotalJarak() {
return totalJarak;
}
public void setTotalJarak(double totalJarak) {
this.totalJarak = totalJarak;
}
public long getTotalWaktu() {
return totalWaktu;
}
public void setTotalWaktu(long totalWaktu) {
this.totalWaktu = totalWaktu;
}
public List cariRute(Node awal, Node tujuan){
List result = new ArrayList();
long start = System.currentTimeMillis();
//Bagian Inisialisasi jarak awal
FloydObject[][] floydObjects = new
FloydObject[allNode.size()][allNode.size()];
for(int k = 0; k < allNode.size(); k++){
for(int i = 0; i < allNode.size(); i++) {
floydObjects[k][i] = new FloydObject();
floydObjects[k][i].node = allNode.get(k);
floydObjects[k][i].jarak =
allNode.get(k).getJarak(allNode.get(i));
if(floydObjects[k][i].jarak > 0 &&
floydObjects[k][i].jarak != Double.POSITIVE_INFINITY) {
floydObjects[k][i].rute.add(allNode.get(k));
floydObjects[k][i].rute.add(allNode.get(i));
}
}
}
//Debug Result
int nNode = allNode.size();
String hasilLog = "";
for(int i = 0; i < nNode; i++){
for(int j = 0; j < nNode; j++){
String tempHasil = String.format("%.2f",
floydObjects[i][j].jarak);
hasilLog += ((tempHasil.length() > 4) ?
tempHasil.substring(0, 3) : tempHasil) + " ";
}
hasilLog += "\n";
}
Log.d("TABEL_SEBELUM", hasilLog);
for(int k = 0; k < nNode; k++){
for(int i = 0; i < nNode; i++){
for(int j = 0; j < nNode; j++){
double ij, ik, kj;
ij = floydObjects[i][j].jarak;
ik = floydObjects[i][k].jarak;
Universitas Sumatera Utara
A-17
kj = floydObjects[k][j].jarak;
if(ij > ik + kj){
floydObjects[i][j].rute.clear();
floydObjects[i][j].rute.addAll(floydObjects[i][k].rute);
floydObjects[i][j].rute.addAll(floydObjects[k][j].rute);
floydObjects[i][j].jarak = ik + kj;
}
}
}
}
int indexFrom, indexTo;
indexFrom = allNode.indexOf(awal);
indexTo = allNode.indexOf(tujuan);
if(indexFrom == -1 || indexTo == -1){
Log.d("ERROR_INDEX", "NODE TIDAK DITEMUKAN DALAM ALL NODE");
}
List rute = floydObjects[indexFrom][indexTo].rute;
totalJarak = floydObjects[indexFrom][indexTo].jarak;
Node prevNode = new Node();
prevNode.setId(-1);
for(Node node : rute){
if(prevNode.getId() == node.getId()) continue;
result.add(node);
prevNode = node;
}
long end = System.currentTimeMillis();
this.totalWaktu = end - start;
for(Node node : result){
Log.d("FLOYD", node.getNama());
}
return result;
}
}
14. RouteAdapter.java
package com.example.codetorium.projekulfa.Adapter;
import
import
import
import
import
import
android.content.Context;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.TextView;
import com.example.codetorium.projekulfa.Model.Node;
import com.example.codetorium.projekulfa.R;
import java.util.ArrayList;
import java.util.List;
/**
Universitas Sumatera Utara
A-18
* Created by codetorium on 11/05/17.
*/
public class RouteAdapter extends BaseAdapter {
List rute;
Context context;
LayoutInflater inflater;
public RouteAdapter(Context context, List rute){
this.rute = new ArrayList(rute);
this.context = context;
this.inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return rute.size();
}
@Override
public Object getItem(int position) {
return rute.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = inflater.inflate(R.layout.route_item_layout, null);
TextView tvJalan = (TextView) view.findViewById(R.id.tv_rute);
tvJalan.setText(rute.get(position).getKet());
TextView tvKet = (TextView)
view.findViewById(R.id.tv_keterangan);
String newKeterangan = "";
if(position == 0){
newKeterangan = "Melangkah dari posisi anda skrg";
} else
if(position == this.rute.size()-1){
newKeterangan = "Anda sudah sampai di tujuan " +
rute.get(position).getNama();
} else
if(position != 0 && position != this.rute.size()-1) {
newKeterangan = "Pastikan anda sudah melewati : " +
rute.get(position).getNama();
}
tvKet.setText(newKeterangan);
return view;
}
}
15. SpinnerAdapter
package com.example.codetorium.projekulfa.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
Universitas Sumatera Utara
A-19
import
import
import
import
android.view.View;
android.view.ViewGroup;
android.widget.BaseAdapter;
android.widget.TextView;
import com.example.codetorium.projekulfa.Model.Node;
import com.example.codetorium.projekulfa.R;
import java.util.List;
import java.util.Locale;
/**
* Created by codetorium on 09/05/17.
*/
public class SpinnerAdapter extends BaseAdapter {
List allNode;
Context context;
LayoutInflater inflater;
public SpinnerAdapter(Context context, List allNode){
this.context = context;
this.allNode = allNode;
this.inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return allNode.size();
}
@Override
public Object getItem(int position) {
return allNode.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = inflater.inflate(R.layout.spinner_item_layout, null);
TextView tvNama, tvLatLng, tvKet;
tvNama = (TextView) view.findViewById(R.id.tv_nama);
tvLatLng = (TextView) view.findViewById(R.id.tv_latlng);
tvKet = (TextView) view.findViewById(R.id.tv_ket);
tvNama.setText(allNode.get(position).getNama());
String latLng = "Latitude : " + String.format(Locale.UK, "%.2f",
allNode.get(position).getLat()) +
" Longitude : " + String.format(Locale.UK,
"%.2f", allNode.get(position).getLng());
tvLatLng.setText(latLng);
tvKet.setText(allNode.get(position).getKet());
return view;
}
}
Universitas Sumatera Utara
A-20
16. ViewPageAdapter.Java
package com.example.codetorium.projekulfa.Adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* Created by codetorium on 11/05/17.
*/
public class ViewPagerAdapter extends FragmentPagerAdapter {
List fragmentList;
List pageTitle;
public ViewPagerAdapter(FragmentManager fm, List
fragmentList, List pageTitle) {
super(fm);
this.fragmentList = fragmentList;
this.pageTitle = pageTitle;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return pageTitle.get(position);
}
}
17. GeralAdapter.Java
package com.example.codetorium.projekulfa.ActionHandler;
import android.content.Context;
import android.content.Intent;
import com.example.codetorium.projekulfa.View.HalamanPencarian;
import com.example.codetorium.projekulfa.View.LokasiActivity;
/**
* Created by codetorium on 28/04/17.
*/
public class GeneralHandler {
Context context;
public GeneralHandler(Context context){
this.context = context;
}
public void pengujianOnClick(){
Intent halamanPencarian = new Intent(context,
HalamanPencarian.class);
Universitas Sumatera Utara
A-21
context.startActivity(halamanPencarian);
}
public void cariLokasi(){
Intent halamanLokasi = new Intent(context, LokasiActivity.class);
context.startActivity(halamanLokasi);
}
}
Universitas Sumatera Utara
A-22
DAFTAR RIWAYAT HIDUP
DATA PRIBADI
Nama
Tempat /Tgl Lahir
Jenis Kelamin
Agama
Tinggi Badan
Berat Badan
Status
Warga Negara
Alamat
:
:
:
:
:
:
:
:
:
Khairina Ulfa Nst
Medan, 15 Oktober 1993
Perempuan
Islam
156 cm
57 Kg
Belum Menikah
Indonesia
Jl. HM Yamin, Medan
Kode Pos : 20233
Telepon
:
:
0813 6135 3279
[email protected]
PENDIDIKAN FORMAL
1999 – 2005
:
SD 060852 Medan
(Berijazah)
2005 – 2008
:
MTsN 2 Medan
(Berijazah)
2008 – 2011
:
MAN 1 Medan
(Berijazah)
2011 – 2014
:
Politeknik Negeri Medan
(Berijazah)
2014 – Sekarang
:
Universitas Sumatera Utara
(Mahasiswa)
Universitas Sumatera Utara