A-66
LAMPIRAN
LISTING PROGRAM
•
CustomAdapter
package ahmad.syuhada.implementasialgoritmasolin.adapter;
import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View;
import android.view.ViewGroup; import android.widget.ArrayAdapter; import 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; }
•
DefaultGraphFragment
package ahmad.syuhada.implementasialgoritmasolin.fragment;
import android.os.AsyncTask; import android.os.Bundle;
import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View;
import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView;
import java.util.ArrayList; import java.util.List;
import ahmad.syuhada.implementasialgoritmasolin.AlgoritmaSolin; import ahmad.syuhada.implementasialgoritmasolin.DataSet;
import ahmad.syuhada.implementasialgoritmasolin.Hubungan; import ahmad.syuhada.implementasialgoritmasolin.R;
import ahmad.syuhada.implementasialgoritmasolin.Titik;
public class DefaultGraphFragment extends Fragment { AlgoritmaSolin algoritmaSolin;
List<Hubungan>jalurDefault; 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();
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 android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; import android.os.Bundle;
import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View;
import android.view.ViewGroup; import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions;
import java.util.List;
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 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<Titik> dots, List<Hubungan> 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();
} } }
package ahmad.syuhada.implementasialgoritmasolin.fragment;
import android.graphics.Color;
import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.View;
import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView;
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) {
.commit(); }
});
return view; }
}
•
ResultFragment
package ahmad.syuhada.implementasialgoritmasolin.fragment;
import android.os.AsyncTask;
import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.View;
import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView;
import org.w3c.dom.Text;
import java.util.ArrayList; import java.util.List;
import ahmad.syuhada.implementasialgoritmasolin.AlgoritmaSolin; import ahmad.syuhada.implementasialgoritmasolin.DataSet;
import ahmad.syuhada.implementasialgoritmasolin.Hubungan; import ahmad.syuhada.implementasialgoritmasolin.R;
import ahmad.syuhada.implementasialgoritmasolin.Titik;
public class ResultFragment extends Fragment { List<Titik>titikPengujian;
List<Hubungan>hasilSolin; 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
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<Hubungan> doInBackground(Object[] params) { algoritmaSolin.hasilKanSpanningTree((List<Titik>) 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 { List<Hubungan>semuaHubungan; int tempRute;
public List<Hubungan>hasil; public long runningTime; public double totalBobot;
public AlgoritmaSolin(){
public void cariJalur(List<Titik> closed, Titik awal, Titik tujuan, int step){
List<Hubungan> 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<Titik> 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<Hubungan> hubunganTerurut = new ArrayList<>(); while(semuaHubungan.size() >0){
double jarakMaksimal = 0;
Hubungan hubMaksimal = new Hubungan();
for(int j = 0; j <semuaHubungan.size(); j++){ if(jarakMaksimal <semuaHubungan.get(j).jarak){
jarakMaksimal = semuaHubungan.get(j).jarak; hubMaksimal = semuaHubungan.get(j);
} }
hubunganTerurut.add(hubMaksimal); semuaHubungan.remove(hubMaksimal);
}
for(int i = 0; i < hubunganTerurut.size(); i++){ tempRute = 0;
cariJalur(new ArrayList<Titik>(), hubunganTerurut.get(i).awal, hubunganTerurut.get(i).tujuan, 0);
Log.d("CARIJALUR", hubunganTerurut.get(i).awal.getNama() + " -> " + hubunganTerurut.get(i).tujuan.getNama() + " = " + tempRute + " Rute
Alternatif"); if(tempRute >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 List<Titik>semuaTitik = new ArrayList<Titik>(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) )
);
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;
}
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;