• Tidak ada hasil yang ditemukan

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

N/A
N/A
Protected

Academic year: 2017

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

Copied!
12
0
0

Teks penuh

(1)

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; }

(2)

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();

(3)

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;

(4)

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;

(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();

} } }

(6)

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) {

(7)

.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

(8)

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(){

(9)

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);

}

(10)

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) )

);

(11)

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;

(12)

}

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;

Referensi

Dokumen terkait

Tujuan penelitian ini adalah Menganalisa hubungan depresi dengan kadar [9] gula darah acak pada penderita Diabetes Mellitus tipe 2 di Ruang Dahlia RSUD Jombang.. Desain penelitian

ROM terdiri dari fleksi dan ekstensi siku, pronasi dan supinasi lengan bawah, fleksi bahu, adduksi, dan abduksi bahu, rotasi bahu, ekstensi jari jari tangan, inversi dan iversi

Belajar merupakan suatu perubahan tingkah laku yang relatif menetap pada seseorang akibat pengalaman atau latihan yang menyangkut aspek fisik maupun psikis, seperti dari tidak

The main objectives of this study are the (1) measurement and mapping of the spatial distribution of the deformation rates in the study area; (2) analysis of

Sistem penilaian dengan system KPI, selain dapat mengukur kinerja orang per orang, juga bisa dilakukan untuk melakukan pengukuran kinerja secara kelompok, baik itu

Dengan menggunakan Akibat 2.3 ini, dapat dikonstruksi sebuah aljabar graf pada graf- berhingga baris tanpa sources seperti halnya pada graf berarah, dinotasikan dengan

Level 3 ini aktor harus memakan lebih banyak keju dan dihadapkan dengan musuh yang lebih banyak maka dari itu pada level 3 ini pemain harus lebih berhati-hati

Pada tahap pelaksanaan, kegiatan pembelajaran dibagi menjadi tiga bagian yaitu kegiatan awal, kegiatan inti dan kegiatan penutup. Pada kegiatan awal dimulai dengan