Implementasi Algoritma Solin Dalam Menentukan Minimum Spanning Tree Pada Pembuatan Jalur Pipa Air Di Universitas Sumatera Utara

A-66

LAMPIRAN

LISTING PROGRAM



CustomAdapter

package ahmad.syuhada.implementasialgoritmasolin.adapter;
import
import
import
import
import
import
import
import

android.app.Activity;

android.content.Context;
android.graphics.Color;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.ArrayAdapter;
android.widget.TextView;

import ahmad.syuhada.implementasialgoritmasolin.DataSet;
import ahmad.syuhada.implementasialgoritmasolin.R;

public class CustomAdapter extends ArrayAdapter {
Activity context;
public CustomAdapter(Activity context, int resource) {
super(context, resource, DataSet.semuaTitik);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = context.getLayoutInflater();

View view = layoutInflater.inflate(R.layout.list_layout, null, true);
TextView tvFakultas = (TextView)
view.findViewById(R.id.label_nama_fakultas);
TextView tvLatLng = (TextView) view.findViewById(R.id.label_latlng);
tvFakultas.setText(DataSet.semuaTitik.get(position).getNama());
String latLng = "LatLng : " +
DataSet.semuaTitik.get(position).getLat() + ", " +
DataSet.semuaTitik.get(position).getLng();
tvLatLng.setText(latLng);
if(DataSet.checked[position]){
view.setBackgroundColor(Color.LTGRAY);
} else {
view.setBackgroundColor(Color.WHITE);
}
return view;
}
}

Universitas Sumatera Utara




DefaultGraphFragment

package ahmad.syuhada.implementasialgoritmasolin.fragment;

import
import
import
import
import
import
import
import

android.os.AsyncTask;
android.os.Bundle;
android.support.v4.app.Fragment;
android.view.LayoutInflater;
android.view.View;

android.view.ViewGroup;
android.widget.Button;
android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import
import
import
import
import

ahmad.syuhada.implementasialgoritmasolin.AlgoritmaSolin;
ahmad.syuhada.implementasialgoritmasolin.DataSet;
ahmad.syuhada.implementasialgoritmasolin.Hubungan;
ahmad.syuhada.implementasialgoritmasolin.R;
ahmad.syuhada.implementasialgoritmasolin.Titik;

public class DefaultGraphFragment extends Fragment {
AlgoritmaSolin algoritmaSolin;

ListjalurDefault;
GraphFragment graphFragment;
Double totalBobot;
TextView tvTotalBobotAwal;
public DefaultGraphFragment() {
algoritmaSolin = new AlgoritmaSolin();
jalurDefault = new ArrayList();
graphFragment = new GraphFragment();
totalBobot = 0.0;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_default_graph,
container, false);
Button btnInputTitik = (Button)
view.findViewById(R.id.btn_pilih_titik);
tvTotalBobotAwal = (TextView) view.findViewById(R.id.tv_total_bobot_default);
getActivity().getSupportFragmentManager().beginTransaction()

.replace(R.id.map_default, graphFragment)
.commit();
btnInputTitik.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.main_content, new InputFragment())
.commit();
}
});

Universitas Sumatera Utara

new GambarRute().execute();
return view;
}
class GambarRute extends AsyncTask {
@Override
protected Object doInBackground(Object[] params) {
totalBobot = 0.0;

for(int i = 0; i < DataSet.intHub.length; i++){
Titik awal = DataSet.semuaTitik.get(DataSet.intHub[i][0]);
Titik tujuan = DataSet.semuaTitik.get(DataSet.intHub[i][1]);
Double jarak = algoritmaSolin.euclidean(awal, tujuan);
Hubungan hub = new Hubungan(awal, tujuan, jarak);
totalBobot += jarak;
jalurDefault.add(hub);
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
graphFragment.gambarSpanningTree(DataSet.semuaTitik, jalurDefault);
tvTotalBobotAwal.setText("Total Bobot " + String.format("%.2f", totalBobot) +
" km");
}
}
}




GraphFragment

package ahmad.syuhada.implementasialgoritmasolin.fragment;

import
import
import
import
import
import
import
import
import
import
import
import

android.graphics.Bitmap;

android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.graphics.Rect;
android.graphics.Typeface;
android.os.Bundle;
android.support.v4.app.Fragment;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.Toast;

import
import
import
import
import
import
import
import

import
import
import

com.google.android.gms.maps.CameraUpdate;
com.google.android.gms.maps.CameraUpdateFactory;
com.google.android.gms.maps.GoogleMap;
com.google.android.gms.maps.MapView;
com.google.android.gms.maps.MapsInitializer;
com.google.android.gms.maps.model.BitmapDescriptor;
com.google.android.gms.maps.model.BitmapDescriptorFactory;
com.google.android.gms.maps.model.LatLng;
com.google.android.gms.maps.model.Marker;
com.google.android.gms.maps.model.MarkerOptions;
com.google.android.gms.maps.model.PolylineOptions;

import java.util.List;
import ahmad.syuhada.implementasialgoritmasolin.Hubungan;
import ahmad.syuhada.implementasialgoritmasolin.R;


Universitas Sumatera Utara

import ahmad.syuhada.implementasialgoritmasolin.Titik;
public class GraphFragment extends Fragment {
MapView mapView;
GoogleMap map;
public GraphFragment() {
// 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_graph, container, false);
mapView = (MapView) view.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
map = mapView.getMap();
map.getUiSettings().setMyLocationButtonEnabled(true);
map.setMyLocationEnabled(true);
try {
MapsInitializer.initialize(this.getActivity());
} catch (Exception e){
}
return view;
}
@Override
public void onResume() {
mapView.onResume();
super.onResume();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
public BitmapDescriptor createPureTextIcon(String text) {
Paint textPaint = new Paint(); // Adapt to your needs
textPaint.setTextSize(16);
textPaint.setFakeBoldText(true);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
textPaint.setColor(Color.BLUE);
int marginLeft = 5, marginTop = 5;
float textWidth = textPaint.measureText(text);

Universitas Sumatera Utara

float textHeight = textPaint.getTextSize();
int width = (int) (textWidth);
int height = (int) (textHeight);
Bitmap image = Bitmap.createBitmap(width + 2 * marginLeft, height + 2
* marginTop, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(image);
canvas.translate(0, height);
canvas.drawColor(Color.WHITE);
canvas.drawText(text, marginLeft, marginTop, textPaint);

BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(image);
return icon;
}
public void gambarSpanningTree(List dots, List conns){
if(map != null){
if(dots.size() >0)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new
LatLng(dots.get(0).getLat(), dots.get(0).getLng()), 16));
for(Titik node : dots){
map.addMarker(new MarkerOptions()
.position(new LatLng(node.getLat(), node.getLng()))
.title(node.getNama())
.draggable(false)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.building))
);
}
for(Hubungan hub : conns){
map.addPolyline(new PolylineOptions()
.add(new LatLng[]{
new LatLng(hub.getAwal().getLat(), hub.getAwal().getLng()),
new LatLng(hub.getTujuan().getLat(), hub.getTujuan().getLng())
})
.geodesic(true)
.width(5f)
.visible(true)
.color(Color.BLUE)
);

LatLng textLatLng = new LatLng(hub.getAwal().getLat() +
((hub.getTujuan().getLat() - hub.getAwal().getLat()) / 2),
hub.getAwal().getLng() +
((hub.getTujuan().getLng() - hub.getAwal().getLng()) / 2));
String jarak = String.format("%.2f", hub.getJarak()) + " km";
map.addMarker(new MarkerOptions()
.icon(createPureTextIcon(jarak))
.position(textLatLng)
);
}

} else {
Toast.makeText(this.getActivity(), "Map null",
Toast.LENGTH_SHORT).show();
}
}
}



InputFragment

Universitas Sumatera Utara

package ahmad.syuhada.implementasialgoritmasolin.fragment;
android.graphics.Color;
android.support.annotation.Nullable;
android.support.v4.app.Fragment;
android.os.Bundle;
android.util.Log;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.AbsListView;
android.widget.AdapterView;
android.widget.Button;
android.widget.ListView;

import
import
import
import
import
import
import
import
import
import
import
import

import java.util.List;
import ahmad.syuhada.implementasialgoritmasolin.DataSet;
import ahmad.syuhada.implementasialgoritmasolin.R;
import ahmad.syuhada.implementasialgoritmasolin.adapter.CustomAdapter;
public class InputFragment extends Fragment {
boolean[] itemChecked = new boolean[DataSet.semuaTitik.size()];
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
/*
* Set semua selected item false
*/
for(int i = 0; i < DataSet.checked.length; i++){
DataSet.checked[i] = false;
}
View view = inflater.inflate(R.layout.fragment_input, container,
false);
CustomAdapter customAdapter = new CustomAdapter(getActivity(),
R.layout.list_layout);
ListView listView = (ListView) view.findViewById(R.id.listview_titik);
listView.setAdapter(customAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView parent, View view, int position, long
id) {
DataSet.checked[position] = !DataSet.checked[position];
if(DataSet.checked[position]){
view.setBackgroundColor(Color.LTGRAY);
} else {
view.setBackgroundColor(Color.WHITE);
}
}
});
Button btnNext = (Button) view.findViewById(R.id.btn_hasilkan);
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.main_content, new ResultFragment())

Universitas Sumatera Utara

.commit();
}
});
return view;
}
}



ResultFragment

package ahmad.syuhada.implementasialgoritmasolin.fragment;
import
import
import
import
import
import
import
import
import
import

android.os.AsyncTask;
android.support.annotation.Nullable;
android.support.v4.app.Fragment;
android.os.Bundle;
android.util.Log;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.Button;
android.widget.TextView;

import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.List;
import
import
import
import
import

ahmad.syuhada.implementasialgoritmasolin.AlgoritmaSolin;
ahmad.syuhada.implementasialgoritmasolin.DataSet;
ahmad.syuhada.implementasialgoritmasolin.Hubungan;
ahmad.syuhada.implementasialgoritmasolin.R;
ahmad.syuhada.implementasialgoritmasolin.Titik;

public class ResultFragment extends Fragment {
ListtitikPengujian;
ListhasilSolin;
AlgoritmaSolin algoritmaSolin;
GraphFragment graphFragment;
TextView runningTime, totalBobot;
Button back;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
algoritmaSolin = new AlgoritmaSolin();
titikPengujian = new ArrayList();
for(int i = 0; i < DataSet.checked.length; i++){
if(DataSet.checked[i]){
titikPengujian.add(DataSet.semuaTitik.get(i));
}
}
hasilSolin = new ArrayList();
new AlgoSolinTask().execute(titikPengujian);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
/*
* TODO: Buat graph dan panggil algoritma
*/

Universitas Sumatera Utara

View view = inflater.inflate(R.layout.fragment_result, container, false);
runningTime = (TextView) view.findViewById(R.id.tv_running_time);
totalBobot = (TextView) view.findViewById(R.id.tv_total_bobot);
back = (Button) view.findViewById(R.id.btn_back_to_input);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.main_content, new InputFragment())
.commit();
}
});
graphFragment = new GraphFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.graphLayout, graphFragment)
.commit();
return view;
}
public class AlgoSolinTask extends AsyncTask {
@Override
protected List doInBackground(Object[] params) {
algoritmaSolin.hasilKanSpanningTree((List) params[0]);
return algoritmaSolin.hasil;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
graphFragment.gambarSpanningTree(titikPengujian, algoritmaSolin.hasil);
runningTime.setText("Running Time " + algoritmaSolin.runningTime + " ms");
totalBobot.setText("Total Bobot " + String.format("%.2f",
algoritmaSolin.totalBobot) + " km");
}
}
}



AlgoritmaSolin

package ahmad.syuhada.implementasialgoritmasolin;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class AlgoritmaSolin {
ListsemuaHubungan;
int tempRute;
public Listhasil;
public long runningTime;
public double totalBobot;
public AlgoritmaSolin(){
}

Universitas Sumatera Utara

public void cariJalur(List closed, Titik awal, Titik tujuan, int
step){
List tempHubungan = new ArrayList();
for(Hubungan hub : semuaHubungan){
if(hub.awal.id == awal.id){
tempHubungan.add(hub);
}
else if(hub.tujuan.id == awal.id){
tempHubungan.add(new Hubungan(hub.tujuan, hub.awal,
hub.jarak));
}
}

closed.add(awal);
for(Hubungan hub : tempHubungan){
if(hub.tujuan.id != tujuan.id){
if(!closed.contains(hub.tujuan))
cariJalur(closed, hub.tujuan, tujuan, (step + 1));
} else {
if(step >0) tempRute++;
}
}
}

public double euclidean(Titik a, Titik b){
double derajatKeKM = 111.319;
return (Math.sqrt(Math.pow(a.getLat() - b.getLat(), 2) + Math.pow(a.getLng()
- b.getLng(), 2))) * derajatKeKM;
}
public void hasilKanSpanningTree(List titikPengujian){
runningTime = System.currentTimeMillis();

semuaHubungan = new ArrayList();
for(int i = 0; i < titikPengujian.size(); i++){
for(int j = i+1; j < titikPengujian.size(); j++){
if(i == j) continue;
semuaHubungan.add(new Hubungan(
titikPengujian.get(i),
titikPengujian.get(j),
euclidean(titikPengujian.get(i),
titikPengujian.get(j))
)
);
}
}
List hubunganTerurut = new ArrayList();
while(semuaHubungan.size() >0){
double jarakMaksimal = 0;
Hubungan hubMaksimal = new Hubungan();
for(int j = 0; j 0){
semuaHubungan.remove(hubunganTerurut.get(i));
}
}
/*
* Update hasil
*/
hasil = new ArrayList(semuaHubungan);
totalBobot = 0;
for(Hubungan hub : hasil){
Log.d("HASILCARI", hub.getAwal().getNama() + " -> " +
hub.getTujuan().getNama() + " jarak : " + hub.getJarak());
totalBobot += hub.getJarak();
}
runningTime = System.currentTimeMillis() - runningTime;
}
}



DataSet

package ahmad.syuhada.implementasialgoritmasolin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DataSet {
/*
* Data semua titik
*/
public static ListsemuaTitik = new ArrayList(Arrays.asList(
new Titik(1,"Biro Rektor",3.565373,98.656793),
new Titik(2,"Auditorium",3.563692,98.656879),
new Titik(3,"Perpustakaan",3.559561,98.657124),
new Titik(4,"Fakultas Ilkom & TI",3.562513,98.659892),
new Titik(5,"Fakultas Kedokteran Gigi",3.563783,98.658432),
new Titik(6,"Fakultas Teknik",3.562046,98.655237),
new Titik(7,"Fakultas Farmasi",3.560152,98.653515),
new Titik(8,"Fakultas MIPA",3.559609,98.65465),
new Titik(9,"Fakultas Pertanian",3.556933,98.6545),
new Titik(10,"Fakultas ISIP",3.556719,98.65696),
new Titik(11,"Fakultas Kehutanan",3.558611,98.653443),
new Titik(12,"Fakultas Hukum",3.55841,98.659717),
new Titik(13,"Fakultas Kesehatan Masyarakat",3.565817,98.659074),
new Titik(14,"Fakultas Psikologi",3.566803,98.65797),
new Titik(15,"Fakultas Keperawatan",3.564814,98.658872),
new Titik(16,"Fakultas Ekonomi & Bisnis",3.557903,98.656738),
new Titik(17,"Fakultas Kedokteran",3.566295,98.659884),
new Titik(18,"Fakultas Ilmu Budaya",3.56037,98.65969)
)
);

public static boolean[] checked = new boolean[]{
false,

Universitas Sumatera Utara

false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
};

public static int[][] intHub = new int[][]{
{9, 8}, {8, 10}, {10, 15}, {15, 9}, {15, 2}, {1, 4},
{10, 6}, {6, 7}, {7, 2}, {2, 17}, {17, 11}, {15, 11},
{17, 3}, {7, 5}, {3, 5}, {5, 1}, {3, 4}, {1, 0}, {4, 14},
{0, 14}, {0, 13}, {12, 13}, {3, 16}, {12, 14}, {12, 16}
};
}



Hubungan

package ahmad.syuhada.implementasialgoritmasolin;
public class Hubungan {
Titik awal, tujuan;
double jarak;
public Hubungan(Titik awal, Titik tujuan, double jarak){
this.awal = awal;
this.tujuan = tujuan;
this.jarak = jarak;
}
public Hubungan(){
}
public Titik getAwal() {
return awal;
}
public double getJarak() {
return jarak;
}
public Titik getTujuan() {return tujuan;
}
}



Titik

package ahmad.syuhada.implementasialgoritmasolin;

public class Titik {
int id;
String nama;
double lat, lng;
public Titik(int id, String nama, double lat, double lng){
this.id = id;
this.nama = nama;
this.lat = lat;
this.lng = lng;

Universitas Sumatera Utara

}
public int getId() {
return id;
}
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 String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
}

Universitas Sumatera Utara