Anda di halaman 1dari 16

TUGAS ARTIFICIAL INTELEGENCE

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

Ketersediaan pakan yang memadai dapat memaksimalkan produksi susu dan


pakan yang disediakan harus memenuhi kebutuhan nutrisi sapi. Namun dalam hal
lain, harga pakan merupakan suatu masalah terbesar beberapa peternak sapi.
Biaya yang besar dalam pemberian pakan tidak selalu menghasilkan produksi
susu yang maksimal. Diperlukan sebuah metode untuk merancang bahan pakan
sesuai kebutuhan nutrisi sapi dengan harga pakan yang seminimal mungkin. Ada
beberapa metode optimasi yang dapat digunakan untuk memecahkan masalah
tersebut antara lain Genetic Algorithm (GA), Particle Swarm Optimization (PSO)
dan ant colony optimization (ACO) (Caesar, et al., 2016). Penelitian terdahulu
pada prediksi kebangkrutan yang membandingkan algoritme PSO dengan GA
menyimpulkan bahwa algoritme PSO tidak memiliki crossover dan operator
mutasi, hal itu menjadikan PSO lebih sederhana dan komputasi yang dilakukan
memerlukan lebih sedikit memori dan runtime. Selain itu, setiap partikel
menyesuaikan kecepatan dan posisi partikel sesuai dengan lokal terbaik dan
global terbaik. Sehingga semua partikel memiliki kemampuan kuat dalam
melakukan pencarian, yang dapat membantu swarm menemukan solusi optimal
(Chen, et al., 2011).

Berdasarkan hasil penelitian yang lain diperoleh kesimpulan bahwa PSO


memperoleh hasil yang optimal karena mempunyai kinerja yang lebih cepat
(Caesar, et al., 2016). Algoritme PSO banyak dipilih untuk melakukan optimasi
dikarenakan metode ini lebih mudah diterapkan dan lebih cepat mencari solusi
optimum dibandingkan dengan algoritme matematika dan teknik optimasi
heuristik lainnya (Eliantara, et al., 2016).

Berdasarkan hasil penelitian yang telah diuraikan di atas, penulis


mengusulkan untuk membangun aplikasi berbasis dekstop yang dapat
memberikan solusi peningkatan nutrisi pakan bibit unggul sapi jantan dalam
penelitian ini yang berjudul “Optimasi Pakan Bibit Unggul Sapi Jantan
Menggunakan Particle Swarm Optimization (PSO) (Studi Kasus pada Balai
Besar Inseminasi Buatan Singosari)“ dengan harapan aplikasi ini dapat
membantu pihak BBIB untuk menghasilkan kualitas semen yang lebih baik dari
sebelumnya sehingga pendistribusian bibit unggul ke peternak sapi meningkat.

Rumusan Masalah

 Bagaimana menentukan parameter IPSO yang tepat supaya dapat


menghasilkan komposisi pakan sapi perah yang optimal?
 Bagaimana hasil evaluasi penerapan metode IPSO untuk optimasi
komposisi pakan sapi perah?

Tujuan

 Menentukan parameter algoritma IPSO supaya dapat menghasilkan


komposisi pakan sapi perah yang optimal.
 Untuk mengetahui hasil evaluasi penerapan metode IPSO dalam optimasi
komposisi pakan sapi perah.

Manfaat

 Mempermudah masyarakat terutama para peternak sapi dalam menentukan


komposisi pakan sapi perah yang tepat sesuai kondisi sapi dengan harga
pakan yang murah sehingga dapat memaksimalkan produksi susu.
 Diharapkan dapat membantu usaha pemerintah dalam meningkat
produktivitas sapi perah.

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;

public class optimasi extends AppCompatActivity {


Button optimasi;
EditText nilaiberatSapi, nilaiproduksiSusu,
nilaiberatPakan, nilaipopSize, nilaiiterasi;

private ProgressDialog progressDialog;

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;

DecimalFormat belakangkoma = new


DecimalFormat("#.########");

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

Thread mThread = new Thread() {


@Override
public void run() {

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

for (int j = 0; j <= jenispakan;


j++) {

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

}
});

void prosesOptimasi(int beratSapi, int produksiSusu,


int beratPakan, int popSize, int iterasi){

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

for (int iterasi = 0; iterasi < iterMax; iterasi++)


{
double totalf = 0;
System.out.println("Iterasi : " + iterasi);
updateVelocity(iterasi);
updatePosisi();
updateBest();
for (int i = 0; i < popSize; i++) {
totalf = totalf +
partikelPBest[i][jenispakan];
}
rata2Fitness = totalf / popSize;
//tampil();
}
}

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

double hitungFitness(double partikel[]) {


double ketersediaanTDN = 0, ketersediaanNE = 0,
ketersediaanPK = 0,ketersediaanBK = 0;
//hitung total nutrisi
//gizi : BK, PK, TDN, NEL
ketersediaanNE = (0.0245 * kandunganGizi[0][2] /
100) - 0.12;

for (int j = 0; j < (jenispakan-1); j++) {


ketersediaanBK += partikel[j] *
kandunganGizi[j][0];
ketersediaanPK += partikel[j] *
kandunganGizi[j][1];
ketersediaanTDN += partikel[j] *
kandunganGizi[j][2];
}
/*
ketersediaanBK = partikel[0] * kandunganGizi[0][0]
+ partikel[1] * kandunganGizi[1][0] + partikel[2] *
kandunganGizi[2][0];
ketersediaanPK = partikel[0] * kandunganGizi[0][1]
+ partikel[1] * kandunganGizi[1][1] + partikel[2] *
kandunganGizi[2][1];
ketersediaanTDN = partikel[0] *
kandunganGizi[0][2] + partikel[1] * kandunganGizi[1][2] +
partikel[2] * kandunganGizi[2][2];
*/
//hitung pinalti
double pinalti = 0;
pinalti = pinalti + Math.abs(kebutuhanNE -
ketersediaanNE);
pinalti = pinalti + Math.abs(kebutuhanPK -
ketersediaanPK);
pinalti = pinalti + Math.abs(kebutuhanTDN -
ketersediaanTDN);
pinalti = pinalti + Math.abs(kebutuhanBK -
ketersediaanBK);

double totalPinalti = pinalti * 5;


//hitung total harga
//harga disimpan di indeks ke 3 pada array "makanan"
double totalHarga = 0;
int j = 0;
for (int x = 0; x < jenispakan; x++) {
totalHarga = partikel[x] * kandunganGizi[x][3];
//System.out.print(kromosom[x] + " * " +
pakan[x][3] + ", ");
//System.out.print(totalHarga + "\t");
}
//System.out.println("");
double fitness = 100000 / (w1 * totalHarga + w2 *
(totalPinalti * 100000));
return fitness * 1000;
}

void updateVelocity(int iterasi) {


double w, k = Math.cos(2*3.14 / iterMax * (iterasi
- iterMax / 2)) + 2.428571;
//hitung kecepatan

for (int i = 0; i < popSize; i++) {


for (int j = 0; j < jenispakan; j++) {
//fitness
if (partikelGBest[jenispakan] ==
partikel[i][jenispakan]) {
w = 0.857143;
} else {
w = 0.857143 + (1 - 0.857143) * (1 -
iterasi / iterMax);
}
if (iterasi < iterMax / 2) {
velocity[i][j] = w * velocity[i][j] + 2
* Math.random() * (partikelPBest[i][j] - partikel[i][j]) +
2 * Math.random() * (partikelGBest[j] - partikel[i][j]);
} else {
velocity[i][j] = k * (0.7 *
velocity[i][j] + 2 * Math.random() * (partikelPBest[i][j] -
partikel[i][j]) + 2 * Math.random() * (partikelGBest[j] -
partikel[i][j]));
}

if (velocity[i][j] <= vmin) {


velocity[i][j] = vmin;
}
if (velocity[i][j] >= vmax) {
velocity[i][j] = vmax;
}
}
}
}

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.println("fitur 1 \t fitur 2 \t fitur 3


\t fitur 4 \t fitur 5 \t fitur 6 \t fitur 7 \t fitur 8 \t
fitur 9 \t fitur 10 \t fitness");
for (int i = 0; i < popSize; i++) {
for (int j = 0; j <= jenispakan; j++) {

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

Script Main Activity


package com.startup.ec2ainun.ipsotest;

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;

public class MainActivity extends AppCompatActivity {

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

TableRow empty = new TableRow(this);


TextView emptyrow = new TextView(this);
empty.addView(emptyrow);

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

for (int baris = 0; baris < namaKandungan.length;


baris++) {

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;

public class hasil extends AppCompatActivity {

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

String hasil[]= new String[11];


for (int j = 0; j <= 10; j++) {

hasil[j]=getIntent().getExtras().get("hasil"+j).toString()
;
}

TableLayout table = new TableLayout(this);


table.setGravity(Gravity.CENTER_HORIZONTAL);
table.setStretchAllColumns(true);
table.setShrinkAllColumns(true);
TableRow rowTitle = new TableRow(this);
rowTitle.setGravity(Gravity.CENTER_HORIZONTAL);

TableRow empty = new TableRow(this);


TextView emptyrow = new TextView(this);
empty.addView(emptyrow);

TextView title = new TextView(this);


title.setText("Hasil Optimasi");
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 = 2;
params.setMargins(10, 100, 10, 10);
rowTitle.addView(title, params);
TableRow[] rowData = new
TableRow[namaKandungan.length];
TableRow.LayoutParams data = new
TableRow.LayoutParams();
data.gravity = Gravity.RIGHT;

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);
}
for (int baris = 0; baris < namaKandungan.length;
baris++) {

rowData[baris].addView(namaKandunganLabel[baris]);
}

TextView[] datahasil = new


TextView[namaKandungan.length];
for(int i = 0; i < namaKandungan.length; i++) {
datahasil[i] = new TextView(this);
}
for (int baris = 0; baris < namaKandungan.length;
baris++) {
datahasil[baris].setText(" " + hasil[baris]);

datahasil[baris].setGravity(Gravity.CENTER_HORIZONTAL);
}
for (int baris = 0; baris < namaKandungan.length;
baris++) {
rowData[baris].addView(datahasil[baris]);
}

TableRow fitness = new TableRow(this);


TextView hasilFitness = new TextView(this);
hasilFitness.setText("Dengan nilai Fitness :
"+hasil[10]);
hasilFitness.setGravity(Gravity.CENTER);
fitness.addView(hasilFitness, params);

table.addView(rowTitle);
table.addView(empty);
for (int baris = 0; baris < namaKandungan.length;
baris++) {
table.addView(rowData[baris], data);
}
table.addView(fitness);

setContentView(table);

}
}

Anda mungkin juga menyukai