Algoritma JST (Jaringan Saraf Tiruan) atau disebut juga ANN (Artificial Neural Networks) adalah salah satu algoritma berbasis jaringan saraf yang dapat digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah mengenai penentuan penerimaan pengajuan kredit sepeda motor baru berdasarkan kelompok data yang sudah ada.
Inti perhitungan pada algoritma berbasis jaringan adalah untuk mencari bobot terbaik dari contoh / sampel data yang sudah ada. Karena hasil pada contoh data sudah diketahui, maka nilai bobot akan dihitung berdasarkan nilai hasil yang sudah tersedia, sampai ditemukan nilai bobot terbaik yang paling banyak cocok apabila dihitungkan kembali pada data awal. Kemudian nilai bobot tersebut dapat digunakan untuk menghitung data lain yang tidak diketahui hasilnya. Pada kasus ini, metode yang digunakan untuk mencari bobot terbaik adalah menggunakan metode PSO (Particle Swarm Optimization)
Algoritma ini memiliki kemiripan struktur data dengan Algoritma RBF (Radial Basis Function) / Radial Nets, tetapi teknik perhitungan yang dilakukan sangat berbeda.
Diasumsikan ada 8 data pelanggan yang sudah diketahui datanya, yaitu Pelanggan A,B,C,D,E,F,G,H
Masing-masing pelanggan memiliki kriteria, yaitu umur, jenis kelamin, skor kepribadian, dan memiliki nilai hasil yaitu Diterima / Ditolak
Diasumsikan 8 data tersebut adalah sebagai berikut:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian | Hasil |
---|---|---|---|---|
Pelanggan A | 44 | Laki-laki | 3.55 | Diterima |
Pelanggan B | 52 | Perempuan | 4.71 | Diterima |
Pelanggan C | 60 | Perempuan | 6.56 | Ditolak |
Pelanggan D | 56 | Laki-laki | 6.8 | Ditolak |
Pelanggan E | 51 | Laki-laki | 6.94 | Ditolak |
Pelanggan F | 46 | Perempuan | 6.52 | Ditolak |
Pelanggan G | 48 | Laki-laki | 4.25 | Diterima |
Pelanggan H | 58 | Perempuan | 5.71 | Diterima |
Contoh data pelanggan awal adalah sebagai berikut:
Untuk Kriteria Jenis Kelamin:
Laki-laki dilambangkan dengan angka -1
Perempuan dilambangkan dengan angka +1
Untuk kriteria Nilai Hasil:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Jika kondisi Diterima, maka inputan data kolom adalah 1, 0
Jika kondisi Ditolak, maka inputan data kolom adalah 0, 1
Dim data(9)() As Double data(0) = New Double() {44, -1, 3.55, 1, 0} data(1) = New Double() {52, +1, 4.71, 1, 0} data(2) = New Double() {60, +1, 6.56, 0, 1} data(3) = New Double() {56, -1, 6.8, 0, 1} data(4) = New Double() {51, -1, 6.94, 0, 1} data(5) = New Double() {46, +1, 6.52, 0, 1} data(6) = New Double() {48, -1, 4.25, 1, 0} data(7) = New Double() {58, +1, 5.71, 1, 0}
Selanjutnya ada 2 orang pelanggan baru yang mengajukan kredit sepeda motor
Maka tentukan pelanggan ini nantinya akan termasuk dalam kelompok Diterima / Ditolak
Diasumsikan data awalnya adalah sebagai berikut:
Pelanggan | Umur | Jenis Kelamin | Skor Kepribadian |
---|---|---|---|
Pelanggan I | 47 | Perempuan | 6.05 |
Pelanggan J | 52 | Laki-Laki | 5 |
Contoh data pelanggan baru adalah sebagai berikut:
Untuk kriteria Nilai Hasil:
Terdapat 2 kolom untuk merepresentasikan kondisi Diterima dan Ditolak
Karena belum diketahui nilai hasilnya, maka semua inputan data adalah -1, -1
data(8) = New Double() {47, +1, 6.05, -1, -1} data(9) = New Double() {52, -1, 5, -1, -1}
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan normalisasi data untuk kriteria Umur dan Skor Kepribadian
Penjelasan lebih lanjut dapat dilihat pada penjelasan skrip dibawah ini (poin 1a – 1c)
1a. Hitung nilai rata-rata tiap-tiap kolom
yaitu dengan rumus: jumlah semua data dibagi dengan jumlah datanya
Dim total As Double = 0.0 For r = 0 To jumlahBaris - 1 total += data(r)(c) Next r Dim rata2 As Double = total / jumlahBaris hasil(0)(c) = rata2
1b. Hitung nilai standar deviasi tiap-tiap kolom
yaitu dengan rumus: akar dari ((kuadrat dari (jumlah dari (data – rata-rata))) / jumlah data)
Dim totalKuadrat As Double = 0.0 For r = 0 To jumlahBaris - 1 totalKuadrat += (data(r)(c) - rata2) * (data(r)(c) - rata2) Next r Dim stdDev As Double = Math.Sqrt(totalKuadrat / jumlahBaris) hasil(1)(c) = stdDev
1c. Normalisasi data dihitung dengan rumus (data – (rata-rata kriteria tersebut)) / standar deviasi kriteria tersebut
For c = 0 To kolom.Length - 1 Dim j As Integer = kolom(c) Dim rata2 As Double = hasil(0)(j) Dim stdDev As Double = hasil(1)(j) For i = 0 To jumlahBaris - 1 data(i)(j) = (data(i)(j) - rata2) / stdDev Next i Next c
2. Tentukan skema awal untuk algoritma ini.
Algoritma ini dapat digunakan untuk melakukan perhitungan yang memiliki banyak input dan menghasilkan banyak output
Diasumsikan dalam kasus ini, skema yang digunakan adalah 3 – 4 – 2, dimana:
- 3 adalah jumlah saraf input, karena ada 3 kriteria awal, yaitu Umur, Jenis Kelamin, dan Skor Kepribadian
- 4 adalah jumlah saraf tersembunyi yang digunakan. Jumlah saraf tersembunyi harus lebih dari jumlah saraf input
dalam kasus ini bisa lebih dari 4, tetapi hanya digunakan 4 saja untuk mempercepat perhitungan
- 2 adalah jumlah saraf output, Karena kriteria nilai hasil bergantung pada nilai 2 kolom, yaitu 1,0 jika diterima dan 0,1 jika ditolak
Const jumlahSarafInput As Integer = 3 Const jumlahSarafTersembunyi As Integer = 4 Const jumlahSarafOutput As Integer = 2 Dim jst As New JaringanSaraf(jumlahSarafInput, jumlahSarafTersembunyi, jumlahSarafOutput)
* Diperlukan sebuah class untuk menyimpan semua matriks data untuk digunakan dalam perhitungan algoritma ini. Class ini dinamakan class JaringanSaraf. Deklarasi awal untuk setiap pengisian data adalah sebagai berikut
Public Class JaringanSaraf Private rnd As Random Private jumlahSarafInput As Integer Private jumlahSarafTersembunyi As Integer Private jumlahSarafOutput As Integer Private inputs As Double() 'Matriks data untuk perhitungan jaringan saraf input-tersembunyi Private ihBobot As Double()() 'Nilai bobot pada jaringan saraf input-tersembunyi Private hBias As Double() 'Nilai bias pada jaringan saraf tersembunyi Private hOutput As Double() 'Nilai output sementara pada jaringan saraf tersembunyi 'Matriks data untuk perhitungan jaringan saraf tersembunyi-output Private hoBobot As Double()() 'Nilai bobot pada jaringan tersembunyi-output Private oBias As Double() 'Nilai bias pada jaringan saraf output Private outputs As Double() Public Sub New(ByVal jumlahSarafInput As Integer, ByVal jumlahSarafTersembunyi As Integer, ByVal jumlahSarafOutput As Integer) rnd = New Random(0) Me.jumlahSarafInput = jumlahSarafInput Me.jumlahSarafTersembunyi = jumlahSarafTersembunyi Me.jumlahSarafOutput = jumlahSarafOutput Me.inputs = New Double(jumlahSarafInput - 1) {} Dim ihBobot(jumlahSarafInput - 1)() As Double For i = 0 To jumlahSarafInput - 1 ihBobot(i) = New Double(jumlahSarafTersembunyi - 1) {} Next i Me.ihBobot = ihBobot Me.hBias = New Double(jumlahSarafTersembunyi - 1) {} Me.hOutput = New Double(jumlahSarafTersembunyi - 1) {} Dim hoBobot(jumlahSarafTersembunyi - 1)() As Double For i = 0 To jumlahSarafTersembunyi - 1 hoBobot(i) = New Double(jumlahSarafOutput - 1) {} Next i Me.hoBobot = hoBobot Me.oBias = New Double(jumlahSarafOutput - 1) {} Me.outputs = New Double(jumlahSarafOutput - 1) {} End Sub . . . End Class
3. Tentukan parameter-parameter yang digunakan dalam perhitungan
3a. Tentukan Jumlah partikel yang digunakan
Diasumsikan dalam kasus ini jumlah partikel adalah 10 partikel
Const jumlahPartikel As Integer = 10
3b. Tentukan Jumlah maksimal iterasi
Diasumsikan dalam kasus ini jumlah maksimal iterasi adalah 500 kali
Const jumlahIterasi As Integer = 500
4. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah PSO (Particle Swarm Optimization)
Penjelasan tentang fungsi PSO akan dijelaskan pada perhitungan dibawah ini
Dim bobotTerbaik() As Double = jst.PSO(contohData, jumlahPartikel, jumlahIterasi) jst.SetBobot(bobotTerbaik)
Memasuki perhitungan utama pada fungsi PSO
* Inisialisasi jumlah bobot yang digunakan dalam perhitungan
- jumlah nilai bobot pada jaringan saraf input-tersembunyi adalah jumlah saraf input * jumlah saraf tersembunyi (3 * 4 = 12 buah)
- jumlah nilai bias pada jaringan saraf input-tersembunyi adalah jumlah saraf tersembunyi (4 buah)
- jumlah nilai bobot pada jaringan saraf tersembunyi-output adalah jumlah saraf tersembunyi * jumlah saraf output (4 * 2 = 8 buah)
- jumlah nilai bias pada jaringan saraf tersembunyi-output adalah jumlah saraf output (2 buah)
Sehingga, banyak data yang diperlukan adalah 12 + 4 + 8 + 2 = 26 buah data
Fungsi ini akan mencari data yang memiliki bobot terendah diantara semua data input, dan akan mengembalikan 26 buah data dengan susunan seperti diatas
Dim jumlahBobot As Integer = (Me.jumlahSarafInput * Me.jumlahSarafTersembunyi) + (Me.jumlahSarafTersembunyi * Me.jumlahSarafOutput) + Me.jumlahSarafTersembunyi + Me.jumlahSarafOutput
* Inisialisasi semua posisi partikel awal dengan posisi acak
4a. Lakukan perhitungan pada masing-masing partikel
For i = 0 To swarm.Length - 1 . . .
4a1. Tentukan posisi acak pada partikel tersebut sesuai dengan batasan minimal dan maksimal nilai
Dim posisiAcak(dimensi - 1) As Double For j = 0 To posisiAcak.Length - 1 Dim lo As Double = minNilai Dim hi As Double = maksNilai posisiAcak(j) = (hi - lo) * rnd.NextDouble + lo Next j
4a2. Hitung nilai fitnessnya dengan menggunakan fungsi CrossEntropy
Penjelasan tentang fungsi CrossEntropy dapat dilihat pada penjelasan dibawah ini
Dim fitness As Double = CrossEntropy(contohData, posisiAcak)
* Gunakan fungsi ini untuk menghitung tingkat kesalahan dari masing-masing data input
Teknik yang digunakan adalah CrossEntropy
Pertama, hitung nilai output untuk masing-masing data
Nilai akhir didapat dari -1 * (jumlah dari (nilai kolom output * logaritma dari nilai output yang telah dihitung sebelumnya) untuk masing-masing data)
Private Function CrossEntropy(ByVal contohData()() As Double, ByVal bobot() As Double) As Double Me.SetBobot(bobot) Dim jumlahCrossEntropy As Double = 0.0 For i = 0 To contohData.Length - 1 Dim inputTerpilih(2) As Double Dim perkiraanOutput(1) As Double Array.Copy(contohData(i), inputTerpilih, 3) Array.Copy(contohData(i), 3, perkiraanOutput, 0, 2) Dim outputTerpilih() As Double = Me.hitungNilaiOutput(inputTerpilih) Dim jumlah As Double = 0.0 For j = 0 To outputTerpilih.Length - 1 If perkiraanOutput(j) <> 0.0 Then jumlah += perkiraanOutput(j) * Math.Log(outputTerpilih(j)) End If Next j jumlahCrossEntropy += jumlah Next i Return -jumlahCrossEntropy End Function
4a3. Hitung kecepatan acak partikel tersebut sesuai dengan batasan kecepatan minimal dan maksimal
Dim kecepatanAcak(dimensi - 1) As Double For j = 0 To kecepatanAcak.Length - 1 Dim lo As Double = -1.0 * Math.Abs(maksNilai - minNilai) Dim hi As Double = Math.Abs(maksNilai - minNilai) kecepatanAcak(j) = (hi - lo) * rnd.NextDouble + lo Next j
4a4. Ambil posisi partikel terbaik sementara berdasarkan nilai fitness terendah sementara
If swarm(i).fitness < fitnessTerbaik Then fitnessTerbaik = swarm(i).fitness swarm(i).posisi.CopyTo(posisiTerbaik, 0) End If
4b. Tentukan bobot inertia (w), bobot kognitif (c1), dan bobot sosial (c2)
Nilai acuan untuk masing-masing variabel dapat dilihat di http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=00870279
Diasumsikan dalam kasus ini, nilai bobot tersebut akan mengikuti nilai acuan yang sudah ada
Const w As Double = 0.729 Const c1 As Double = 1.49445 Const c2 As Double = 1.49445
4c. Lakukan perhitungan sebanyak parameter jumlah iterasi
Dim iterasi As Integer = 0 Do While iterasi < jumlahIterasi iterasi += 1 . . .
4c1. Lakukan perulangan untuk setiap partikel
For i = 0 To swarm.Length - 1 Dim partikelTerpilih As Partikel = swarm(i) . . .
*Lakukan perhitungan untuk menentukan nilai kecepatan yang baru (poin 4c1a)
4c1a. Lakukan perhitungan pada setiap nilai kecepatan dalam masing-masing dimensi
For j = 0 To partikelTerpilih.kecepatan.Length - 1 . . .
4c1a1. Cari kecepatan perpindahan posisi yang baru dengan rumus:
v baru = (w * v skrg) + (c1 * r1 * (posisi terbaik – posisi skrg)) + (c2 * r2 * (posisi umum terbaik – posisi skrg))
kecepatanBaru(j) = (w * partikelTerpilih.kecepatan(j)) + (c1 * r1 * (partikelTerpilih.posisiTerbaik(j) - partikelTerpilih.posisi(j))) + (c2 * r2 * (posisiTerbaik(j) - partikelTerpilih.posisi(j)))
4c1a2. Jika kecepatan tersebut ternyata diluar batas kecepatan yang diperbolehkan,
maka kembalikan nilainya agar masuk dalam batas tersebut
If kecepatanBaru(j) < minKecepatan Then kecepatanBaru(j) = minKecepatan ElseIf kecepatanBaru(j) > maksKecepatan Then kecepatanBaru(j) = maksKecepatan End If
*Lakukan perhitungan untuk menentukan posisi yang baru (poin 4c1b)
4c1b. Lakukan perhitungan pada setiap nilai posisi dalam masing-masing dimensi
For j = 0 To partikelTerpilih.posisi.Length - 1 . . .
4c1b1. Hitung posisi baru dengan menambahkan posisi lama dengan kecepatan yang baru
posisiBaru(j) = partikelTerpilih.posisi(j) + kecepatanBaru(j)
4c1b2. Jika posisi tersebut ternyata diluar batas posisi yang diperbolehkan,
maka kembalikan nilainya agar masuk dalam batas tersebut
If posisiBaru(j) < minNilai Then posisiBaru(j) = minNilai ElseIf posisiBaru(j) > maksNilai Then posisiBaru(j) = maksNilai End If
4c1c. Hitung nilai fitness untuk posisi yang baru
posisiBaru.CopyTo(partikelTerpilih.posisi, 0) fitnessBaru = CrossEntropy(matriksInput, posisiBaru) partikelTerpilih.fitness = fitnessBaru
4c1d. Jika nilai fitness baru lebih baik dari nilai fitness sebelumnya, maka ambil posisi yang baru sebagai posisi terbaik partikel tersebut
If fitnessBaru < partikelTerpilih.fitnessTerbaik Then posisiBaru.CopyTo(partikelTerpilih.posisiTerbaik, 0) partikelTerpilih.fitnessTerbaik = fitnessBaru End If
4c1e. Jika nilai fitness baru ternyata lebih baik dari nilai fitness umum, maka ambil posisi yang baru sebagai posisi terbaik secara umum
If fitnessBaru < fitnessTerbaik Then posisiBaru.CopyTo(posisiTerbaik, 0) fitnessTerbaik = fitnessBaru End If
* Gunakan fungsi ini untuk memasukkan matriks bobot kedalam 4 matriks data yaitu matriks ihBobot, ihBias, hoBobot, hoBias
ihBobot adalah matriks bobot pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf input * jumlah saraf tersembunyi
ihBias adalah matriks nilai bias pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf tersembunyi
hoBobot adalah matriks bobot pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf tersembunyi * jumlah saraf output
hoBias adalah matriks nilai bias pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf output
Public Sub SetBobot(ByVal bobot() As Double) Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi) + jumlahSarafTersembunyi + (jumlahSarafTersembunyi * jumlahSarafOutput) + jumlahSarafOutput If bobot.Length <> jumlahBobot Then Throw New Exception("Pada fungsi SetBobot, panjang matriks bobot: " & bobot.Length & " tidak sama dengan jumlah bobot yang seharusnya, yaitu " & jumlahBobot) End If Dim k As Integer = 0 For i = 0 To jumlahSarafInput - 1 For j = 0 To jumlahSarafTersembunyi - 1 ihBobot(i)(j) = bobot(k) k += 1 Next j Next i For i = 0 To jumlahSarafTersembunyi - 1 hBias(i) = bobot(k) k += 1 Next i For i = 0 To jumlahSarafTersembunyi - 1 For j = 0 To jumlahSarafOutput - 1 hoBobot(i)(j) = bobot(k) k += 1 Next j Next i For i = 0 To jumlahSarafOutput - 1 oBias(i) = bobot(k) k += 1 Next i End Sub
5. Lakukan perhitungan dari masing-masing contoh data menggunakan nilai bobot dan nilai bias yang sudah ditemukan
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 5a – 5g)
Dim output() As Double = jst.hitungNilaiOutput(input)
Memasuki perhitungan utama pada fungsi hitungNilaiOutput
5a. Beri nilai matriks input sesuai array input
For i = 0 To input.Length - 1 Me.inputs(i) = input(i) Next i
5b. Hitung matriks ihJumlahBobotDanBias dengan cara perkalian matriks antara matriks input dan matriks ihBobot
For j = 0 To jumlahSarafTersembunyi - 1 For i = 0 To jumlahSarafInput - 1 ihJumlahBobotDanBias(j) += Me.inputs(i) * ihBobot(i)(j) Next i Next j
5c. Kemudian masukkan nilai bias pada matriks ihJumlahBobotDanBias
For i = 0 To jumlahSarafTersembunyi - 1 ihJumlahBobotDanBias(i) += hBias(i) Next i
5d. Hitung nilai output sementara dengan menggunakan fungsi Sigmoid untuk masing-masing data pada matriks ihJumlahBobotDanBias
Penjelasan tentang fungsi Sigmoid akan dijelaskan pada perhitungan dibawah ini
For i = 0 To jumlahSarafTersembunyi - 1 hOutput(i) = Sigmoid(ihJumlahBobotDanBias(i)) Next i
* Gunakan fungsi ini untuk menghitung nilai fungsi Sigmoid, yang diperoleh dengan rumus:
f(x) = 1.0 / (1.0 + Exp(-x))
Private Shared Function Sigmoid(ByVal x As Double) As Double If x < -45.0 Then Return 0.0 ElseIf x > 45.0 Then Return 1.0 Else Return 1.0 / (1.0 + Math.Exp(-x)) End If End Function
5e. Hitung matriks hoJumlahBobotDanBias dengan cara perkalian matriks antara matriks output sementara dan matriks hoBobot
For j = 0 To jumlahSarafOutput - 1 For i = 0 To jumlahSarafTersembunyi - 1 hoJumlahBobotDanBias(j) += hOutput(i) * hoBobot(i)(j) Next i Next j
5f. Kemudian masukkan nilai bias pada matriks hoJumlahBobotDanBias
For i = 0 To jumlahSarafOutput - 1 hoJumlahBobotDanBias(i) += oBias(i) Next i
5g. Hitung nilai output akhir dengan menggunakan fungsi Softmax untuk masing-masing data pada matriks hoJumlahBobotDanBias
Penjelasan tentang fungsi Softmax akan dijelaskan pada perhitungan dibawah ini (poin 5g1 – 5g3)
Dim hasil() As Double = Softmax(hoJumlahBobotDanBias) hasil.CopyTo(Me.outputs, 0) Return hasil
Memasuki perhitungan utama pada fungsi Softmax
5g1. Cari nilai maksimal data
Dim maksData As Double = hoJumlahBobotDanBias(0) For i = 0 To hoJumlahBobotDanBias.Length - 1 If hoJumlahBobotDanBias(i) > maksData Then maksData = hoJumlahBobotDanBias(i) End If Next i
5g2. Cari nilai skala
Dim skala As Double = 0.0 For i = 0 To hoJumlahBobotDanBias.Length - 1 skala += Math.Exp(hoJumlahBobotDanBias(i) - maksData) Next i
5g3. Hitung hasil akhir
Sehingga semua jumlah bobot pada parameter matriks hoJumlahBobotDanBias akan bernilai 1
Dim hasil(hoJumlahBobotDanBias.Length - 1) As Double For i = 0 To hoJumlahBobotDanBias.Length - 1 hasil(i) = Math.Exp(hoJumlahBobotDanBias(i) - maksData) / skala Next i
6. Jika nilai output bernilai kurang dari 0.5 maka pelanggan tersebut memiliki nilai hasil Ditolak
Jika nilai output bernilai lebih dari 0.5 maka pelanggan tersebut memiliki nilai hasil Diterima
Kemudian bandingkan nilai output dengan nilai hasil pada contoh data
Jika hasilnya sudah sama, maka catat data ini kedalam jumlah data benar
Jika hasilnya tidak sama, maka catat data ini kedalam jumlah data salah
If output(0) < output(1) Then Console.Write("-> Ditolak ") If contohData(i)(jumlahKolom - 2) < contohData(i)(jumlahKolom - 1) Then jumlahBenar += 1 Console.WriteLine("Benar") ElseIf contohData(i)(jumlahKolom - 2) > contohData(i)(jumlahKolom - 1) Then jumlahSalah += 1 Console.WriteLine("Salah") End If Else Console.Write("-> Diterima ") If contohData(i)(jumlahKolom - 2) < contohData(i)(jumlahKolom - 1) Then jumlahSalah += 1 Console.WriteLine("Salah") ElseIf contohData(i)(jumlahKolom - 2) > contohData(i)(jumlahKolom - 1) Then jumlahBenar += 1 Console.WriteLine("Benar") End If End If
7. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk data baru yang akan dihitung selanjutnya
Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah) Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F2"))
8. Lakukan perhitungan yang sama (poin 5 dan 6) untuk masing-masing data baru
For i As Integer = 0 To dataBaru.Length - 1 Console.Write("Pelanggan " & Chr(i + 65 + 8) & " ") Dim input(jumlahKolom - 3) As Double Array.Copy(dataBaru(i), input, jumlahKolom - 2) For j = 0 To input.Length - 1 Console.Write(IIf(input(j) >= 0, " ", "") & input(j).ToString("F2") & " ") Next j Console.Write(" ") Dim output() As Double = jst.hitungNilaiOutput(input) For j = 0 To output.Length - 1 Console.Write(output(j).ToString("F2") & " ") Next j Console.Write(" ") If output(0) < output(1) Then Console.Write("-> Ditolak ") Else Console.Write("-> Diterima") End If Console.WriteLine("") Next
* Agar dapat menjalankan fungsi PSO diatas, maka diperlukan sebuah Class Partikel untuk menampung semua data data partikel yang berisi posisi, fitness, dan kecepatan partikel. Deklarasi Class Partikel adalah sebagai berikut:
Public Class Partikel Public posisi() As Double Public fitness As Double Public kecepatan() As Double Public posisiTerbaik() As Double Public fitnessTerbaik As Double Public Sub New(ByVal posisi() As Double, ByVal fitness As Double, ByVal kecepatan() As Double, ByVal posisiTerbaik() As Double, ByVal fitnessTerbaik As Double) Me.posisi = New Double(posisi.Length - 1) {} posisi.CopyTo(Me.posisi, 0) Me.fitness = fitness Me.kecepatan = New Double(kecepatan.Length - 1) {} kecepatan.CopyTo(Me.kecepatan, 0) Me.posisiTerbaik = New Double(posisiTerbaik.Length - 1) {} posisiTerbaik.CopyTo(Me.posisiTerbaik, 0) Me.fitnessTerbaik = fitnessTerbaik End Sub End Class
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.