Nama Kelompok:
1. Alfan Suffa (F1B016009)
2. Andre fikriawan (F1B016013)
3. Lalu Septian Wahyu Adipratama (F1B016050)
4. Egi Yayang D. (F1B016025)
FAKULTAS TEKNIK
UNIVERSITAS MATARAM
2019
Implementasi Algoritma Improved Particle Swarm Optimization
(IPSO) dalam Optimasi Komposisi Pakan Sapi Perah pada
platform Android
Rumusan Masalah
Tujuan
Manfaat
Script Optimasi
package com.startup.ec2ainun.ipsotest;
import android.app.ProgressDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.text.DecimalFormat;
import java.util.Random;
double beratSapi = 0,
produksiSusu = 0,
lemakSusu = 4.5;
double kebutuhanTDN, kebutuhanNE, kebutuhanPK,
kebutuhanBK;
int beratPakan = 0, jenispakan = 10, partikelke;
double rata2Fitness = 0, maksimal = 0;
//BK, PK, TDN, harga
double[][] kandunganGizi = new double[][]{
{0.365, 0.128, 0.557, 1250},//rumput gajah
{0.351, 0.088, 0.688, 1700},//tebon jagung
{81.79, 16.89, 32.456, 3000},//bapro
{0.8179, 0.1869, 0.32456, 4500},//pollard
{20.66, 25.69, 73.625, 500},//ampas tahu
{68.3, 15, 89.3, 250},//limbah roti
{80.8, 3.9, 45.57, 500},//jerami padi
{90.0, 13.9, 67.3, 250},//kulit kedelai
{30, 32.12, 69.017, 2000},//daun lamtoro
{90.6, 15.5, 84.8, 2500}//bekatul
};
double partikel[][];
// double partikel[][] = {
// {8.34, 7.3, 2.21, 0},
// {5.92, 3.43, 11.2, 0},
// {4.34, 4.61, 11, 41, 0},
// {2.62, 5.86, 11.64, 0},
// {9.1, 1.14, 10.65, 0}};
double partikelPBest[][], partikelGBest[] = new
double[5];
double velocity[][], vmax, vmin;
int popSize = 5, iterMax = 100;
double w1 = 1, w2 = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_optimasi);
nilaiberatPakan =
(EditText)findViewById(R.id.nilaiBeratPakan);
nilaiberatSapi =
(EditText)findViewById(R.id.nilaiBeratSapi);
nilaiproduksiSusu =
(EditText)findViewById(R.id.nilaiProduksiSusu);
nilaipopSize = (EditText)
findViewById(R.id.nilaiPopsize);
nilaiiterasi =
(EditText)findViewById(R.id.nilaiIterasi);
nilaiberatSapi.setText("450");
nilaiberatPakan.setText("20");
nilaiproduksiSusu.setText("15");
progressDialog = new ProgressDialog(this);
optimasi = (Button)findViewById(R.id.btnOptimasi);
optimasi.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View view) {
if(nilaiberatPakan.getText().toString()!=null
&&nilaiberatSapi.getText().toString()!=null
&&nilaiproduksiSusu.getText().toString()!=null
&&nilaipopSize.getText().toString()!=null
&&nilaiiterasi.getText().toString()!=null){
progressDialog.setMessage("Mengoptimalisasi Data...");
progressDialog.show();
prosesOptimasi(Integer.parseInt(nilaiberatSapi.getText().t
oString()),
Integer.parseInt(nilaiproduksiSusu.getText().toString()),
Integer.parseInt(nilaiberatPakan.getText().toString()),
Integer.parseInt(nilaipopSize.getText().toString()),
Integer.parseInt(nilaiiterasi.getText().toString()));
progressDialog.dismiss();
Intent intent = new
Intent(optimasi.this, hasil.class);
intent.putExtra("hasil"+j,belakangkoma.format(partikelGBes
t[j]));
}
startActivity(intent);
}
};
mThread.start();
}else{
Toast.makeText(optimasi.this,"mohon
isi semua nilai yang ada", Toast.LENGTH_LONG);
}
}
});
velocityClamping();
this.beratSapi = beratSapi;
this.produksiSusu = produksiSusu;
this.beratPakan = beratPakan;
this.popSize = popSize;
this.iterMax = iterasi;
partikel = new double[popSize][jenispakan + 1];
partikelPBest = new double[popSize][jenispakan +
1];
partikelGBest = new double[jenispakan + 1];
velocity = new double[popSize][jenispakan + 1];
proses();
void proses() {
hitungKebutuhanGizi();
inisialisasi();
void inisialisasi() {
Random r = new Random();
for (int i = 0; i < popSize; i++) {
for (int j = 0; j < jenispakan; j++) {
partikel[i][j] = r.nextInt(beratPakan);
}
//nilai fitness disimpan pada indeks kolom ke
jenis pakan
partikel[i][jenispakan] =
hitungFitness(partikel[i]);
}
updateBest();
}
void hitungKebutuhanGizi() {
double NEhidup = 7.82;
double TDNhidup = 3.44;
double PKhidup = 0.403;
double NEproduksi = produksiSusu * 0.78;
double TDNproduksi = produksiSusu * 0.344;
double PKproduksi = produksiSusu * 92;
double NEtumbuh = 0.1 * NEhidup;
double TDNtumbuh = 0;
double PKtumbuh = 0;
//kebutuhanNutrisi NE TDN PK BK
kebutuhanNE = NEhidup + NEproduksi + NEtumbuh;
kebutuhanTDN = TDNhidup + TDNproduksi + TDNtumbuh;
kebutuhanPK = PKhidup + PKproduksi + PKtumbuh;
kebutuhanBK = kebutuhanNE / 1.62;
}
void updatePosisi() {
for (int i = 0; i < popSize; i++) {
for (int j = 0; j < jenispakan; j++) {
partikel[i][j] = partikel[i][j] +
velocity[i][j];
if (partikel[i][j] < 0) {
partikel[i][j] = 0;
}
if (partikel[i][j] > beratPakan) {
partikel[i][j] = beratPakan;
}
}
partikel[i][jenispakan] =
hitungFitness(partikel[i]);
}
updateBest();
}
void updateBest() {
for (int i = 0; i < popSize; i++) {
if (partikel[i][jenispakan] >
partikelPBest[i][jenispakan]) {
partikelPBest[i] = partikel[i];
}
}
//update GBest
for (int i = 0; i < popSize; i++) {
if (maksimal < partikelPBest[i][jenispakan]) {
maksimal = partikelPBest[i][jenispakan];
partikelGBest = partikelPBest[i];
partikelke = i;
}
}
}
void velocityClamping() {
double k = 0.6;
vmax = k * (beratPakan - 0) / 2;
vmin = -vmax;
}
void tampil() {
System.out.print(belakangkoma.format(partikelPBest[i][j])
+ " \t");
}
System.out.println("");
}
System.out.println("");
System.out.println("Gbest");
for (int j = 0; j <= jenispakan; j++) {
System.out.print(belakangkoma.format(partikelGBest[j]) + "
\t");
}
System.out.println("");
System.out.println("partikel ke :" + (partikelke +
1));
System.out.println("rata fitness : " +
rata2Fitness);
System.out.println("");
}
}
import android.content.Intent;
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
double[][] kandunganGizi = new double[][]{
{0.365, 0.128, 0.557, 1250},//rumput gajah
{0.351, 0.088, 0.688, 1700},//tebon jagung
{81.79, 16.89, 32.456, 3000},//bapro
{0.8179, 0.1869, 0.32456, 4500},//pollard
{20.66, 25.69, 73.625, 500},//ampas tahu
{68.3, 15, 89.3, 250},//limbah roti
{80.8, 3.9, 45.57, 500},//jerami padi
{90.0, 13.9, 67.3, 250},//kulit kedelai
{30, 32.12, 69.017, 2000},//daun lamtoro
{90.6, 15.5, 84.8, 2500}//bekatul
};
String [] namaKandungan = {
"rumput gajah", "tebon jagung", "bapro",
"pollard", "ampas tahu",
"limbah roti", "jerami padi", "kulit
kedelai", "daun lamtoro","bekatul"
};
String [] infoLabel = {"Kandungan", "BK", "PK",
"TDN", "Harga"};
//buat table
TableLayout table = new TableLayout(this);
table.setStretchAllColumns(true);
table.setShrinkAllColumns(true);
TableRow rowTitle = new TableRow(this);
rowTitle.setGravity(Gravity.CENTER_HORIZONTAL);
//definisi title
TextView title = new TextView(this);
title.setText("Informasi Komposisi Pakan Sapi
Perah");
title.setTextSize(TypedValue.COMPLEX_UNIT_DIP,
18);
title.setGravity(Gravity.CENTER);
title.setTypeface(Typeface.SERIF, Typeface.BOLD);
TableRow.LayoutParams params = new
TableRow.LayoutParams();
params.span = 6;
rowTitle.addView(title, params);
TableRow optimasi = new TableRow(this);
optimasi.setGravity(Gravity.CENTER_HORIZONTAL);
Button ke = new Button(this);
ke.setPadding(10, 10, 10, 10);
ke.setText("Optimasi Kandungan Pakan");
ke.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new
Intent(MainActivity.this, optimasi.class);
startActivity(intent);
}
});
params.setMargins(10, 100, 10, 10);
optimasi.addView(ke, params);
//label
TableRow infoLabels = new TableRow(this);
TextView[] info = new TextView[infoLabel.length];
for(int i = 0; i < infoLabel.length; i++) {
info[i] = new TextView(this);
}
for (int kolom = 0; kolom < info.length; kolom++) {
info[kolom].setText(" "+infoLabel[kolom]);
info[kolom].setGravity(Gravity.CENTER_HORIZONTAL);
info[kolom].setTypeface(Typeface.DEFAULT_BOLD);
}
for(int i = 0; i < infoLabel.length; i++) {
infoLabels.addView(info[i]);
}
//data
TableRow[] rowData = new
TableRow[namaKandungan.length];
for(int i = 0; i < namaKandungan.length; i++) {
rowData[i] = new TableRow(this);
}
//nama kandungan
TextView[] namaKandunganLabel = new
TextView[namaKandungan.length];
for(int i = 0; i < namaKandungan.length; i++) {
namaKandunganLabel[i] = new TextView(this);
}
for (int baris = 0; baris < namaKandungan.length;
baris++) {
namaKandunganLabel[baris].setText("
"+namaKandungan[baris]);
namaKandunganLabel[baris].setGravity(Gravity.CENTER_HORIZO
NTAL);
}
rowData[baris].addView(namaKandunganLabel[baris]);
}
//nilai kandungan
for(int kolom = 0; kolom < kandunganGizi[0].length;
kolom++) {
TextView[][] dataKandunganLabel = new
TextView[kandunganGizi.length][kandunganGizi[0].length];
for(int i = 0; i < kandunganGizi.length; i++) {
dataKandunganLabel[i][kolom] = new
TextView(this);
}
for (int baris = 0; baris <
kandunganGizi.length; baris++) {
dataKandunganLabel[baris][kolom].setText("
" + kandunganGizi[baris][kolom]);
dataKandunganLabel[baris][kolom].setGravity(Gravity.CENTER
_HORIZONTAL);
}
for (int baris = 0; baris <
kandunganGizi.length; baris++) {
rowData[baris].addView(dataKandunganLabel[baris][kolom]);
}
}
table.addView(rowTitle);
table.addView(empty);
table.addView(infoLabels);
for (int baris = 0; baris < namaKandungan.length;
baris++) {
table.addView(rowData[baris]);
}
table.addView(optimasi);
setContentView(table);
}
}
Script Hasil
package com.startup.ec2ainun.ipsotest;
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String [] namaKandungan = {
"rumput gajah", "tebon jagung", "bapro",
"pollard", "ampas tahu",
"limbah roti", "jerami padi", "kulit
kedelai", "daun lamtoro","bekatul"
};
hasil[j]=getIntent().getExtras().get("hasil"+j).toString()
;
}
namaKandunganLabel[baris].setGravity(Gravity.CENTER_HORIZO
NTAL);
}
for (int baris = 0; baris < namaKandungan.length;
baris++) {
rowData[baris].addView(namaKandunganLabel[baris]);
}
datahasil[baris].setGravity(Gravity.CENTER_HORIZONTAL);
}
for (int baris = 0; baris < namaKandungan.length;
baris++) {
rowData[baris].addView(datahasil[baris]);
}
table.addView(rowTitle);
table.addView(empty);
for (int baris = 0; baris < namaKandungan.length;
baris++) {
table.addView(rowData[baris], data);
}
table.addView(fitness);
setContentView(table);
}
}