Algoritma JST (Jaringan Saraf Tiruan) dengan teknik EO (Evolutionary Optimization)


Algoritma JST (Jaringan Saraf Tiruan) dengan teknik EO (Evolutionary Optimization) 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.
Proses pencarian nilai bobot pada algoritma berbasis jaringan ada beberapa macam, tetapi ada 3 algoritma yang paling umum digunakan, yaitu:
1. Algoritma PSO (Particle Swarm Optimization), dengan contoh penerapannya dapat dilihat pada Algoritma JST (Jaringan Saraf Tiruan)
2. Algoritma Gradient Descent, dengan contoh penerapannya dapat dilihat pada Algoritma Back-Propagation
3. Algoritma EO (Evolutionary Optimization), dengan contoh penerapannya akan dibahas pada halaman ini



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:

PelangganUmurJenis KelaminSkor KepribadianHasil
Pelanggan A44Laki-laki3.55Diterima
Pelanggan B52Perempuan4.71Diterima
Pelanggan C60Perempuan6.56Ditolak
Pelanggan D56Laki-laki6.8Ditolak
Pelanggan E51Laki-laki6.94Ditolak
Pelanggan F46Perempuan6.52Ditolak
Pelanggan G48Laki-laki4.25Diterima
Pelanggan H58Perempuan5.71Diterima

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 I47Perempuan6.05
Pelanggan J52Laki-Laki5

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(jumlahSarafInput As Integer, jumlahSarafTersembunyi As Integer, jumlahSarafOutput As Integer)
        rnd = New Random(0)
        Me.jumlahSarafInput = jumlahSarafInput
        Me.jumlahSarafTersembunyi = jumlahSarafTersembunyi
        Me.jumlahSarafOutput = jumlahSarafOutput

        Me.inputs = New Double(jumlahSarafInput - 1) {}

        Dim ihBobot As Double()() = New Double(jumlahSarafInput - 1)() {}
        For r As Integer = 0 To ihBobot.Length - 1
            ihBobot(r) = New Double(jumlahSarafTersembunyi - 1) {}
        Next
        Me.ihBobot = ihBobot
        Me.hBias = New Double(jumlahSarafTersembunyi - 1) {}
        Me.hOutput = New Double(jumlahSarafTersembunyi - 1) {}

        Dim hoBobot As Double()() = New Double(jumlahSarafTersembunyi - 1)() {}
        For r As Integer = 0 To hoBobot.Length - 1
            hoBobot(r) = New Double(jumlahSarafOutput - 1) {}
        Next
        Me.hoBobot = hoBobot
        Me.oBias = New Double(jumlahSarafOutput - 1) {}

        Me.outputs = New Double(jumlahSarafOutput - 1) {}
    End Sub
	
	. . .
End Class

3. Sebelum masuk ke dalam fungsi utama perhitungan, ada beberapa parameter yang perlu diperhatikan, yaitu:

3a. Tentukan popsize / ukuran populasi
Dalam kebutuhan perhitungan yang sebenarnya, nilai yang direkomendasikan adalah 10 sampai dengan 1000
Diasumsikan dalam kasus ini, ukuran popsize hanya 6 saja untuk mempercepat perhitungan

Const popSize As Integer = 6

3b. Tentukan jumlah maksimal iterasi / generasi yang dilakukan
Diasumsikan dalam kasus ini, jumlah maksimal iterasi adalah 100

Const maksGenerasi As Integer = 100

3c. Tentukan batas nilai kesalahan yang paling rendah
Jika nilai kesalahan yang ditemukan sudah kurang dari nilai ini, maka perhitungan sudah selesai
Diasumsikan dalam kasus ini, batas nilai kesalahan yang paling rendah adalah 0.00001

Const batasnilaiKesalahanMinimal As Double = 0.00001

3d. Tentukan probabilitas mutasi, yaitu besar kemungkinan sebuah gen akan bermutasi
nilai yang direkomendasikan adalah 0.1 sampai dengan 0.5
Diasumsikan dalam kasus ini, probabilitas mutasi adalah 0.2

Const probabilitasMutasi As Double = 0.2

3e. Tentukan konstanta pergerakan gen pada saat bermutasi
semakin besar nilai ini, maka semakin luas area perpindahan gen pada saat bermutasi
nilai yang direkomendasikan adalah 0.001 sampai dengan 0.1
Diasumsikan dalam kasus ini, konstanta pergerakan gen adalah 0.01

Const luasPergerakanMutasi As Double = 0.01

3f. Tentukan tau, yaitu persentase jumlah kromosom induk yang terpilih untuk kemudian dicari induk terbaiknya
semakin besar nilai tau, semakin besar kesempatan 2 individu induk terbaik akan terpilih
nilai yang direkomendasikan adalah 0.3 sampai dengan 0.7
Diasumsikan dalam kasus ini, tau bernilai 0.4

Const tau As Double = 0.4

4. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah EO (Evolutionary Optimization)
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4c)

Dim bobotTerbaik As Double() = jst.EO(contohData, popSize, maksGenerasi, batasnilaiKesalahanMinimal, probabilitasMutasi, luasPergerakanMutasi, tau)
jst.setBobot(bobotTerbaik)

Memasuki perhitungan utama pada fungsi EO

* 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 individu pada posisi acak (poin 4a)

4a. Lakukan perulangan sebanyak jumlah populasi

For i As Integer = 0 To populasi.Length - 1
. . .

4a1. Inisialisasi individu sebanyak parameter popsize, dan inisialisasi posisi nya sebanyak parameter dimensi
Untuk setiap individu, Beri nilai kromosom acak pada setiap dimensi

populasi(i) = New Individu(jumlahBobot, minPosisi, maksPosisi, probabilitasMutasi, luasPergerakanMutasi)

4a2. Kemudian hitung nilai kesalahan untuk individu pada posisi tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim nilaiKesalahan As Double = MeanSquaredError(contohData, populasi(i).kromosom)

* Gunakan fungsi ini untuk menghitung tingkat kesalahan dari masing-masing data input
Hitung tingkat kesalahan nilai jawaban menggunakan teknik Mean Squared Error
dihitung dengan rumus jumlah dari (kuadrat dari (nilai jawaban – nilai hasil pada matriks data)) / jumlah data
Nilai jawaban yang baru bisa jadi mengembalikan nilai MSE yang lebih tinggi, sehingga nilai jawaban ini tidak bisa dipakai

Private Function MeanSquaredError(contohData As Double()(), bobot As Double()) As Double
	Me.setBobot(bobot)

	Dim contohDataKolomKriteria As Double() = New Double(jumlahSarafInput - 1) {}
	Dim contohDataKolomHasil As Double() = New Double(jumlahSarafOutput - 1) {}

	Dim hasil As Double = 0.0
	For i As Integer = 0 To contohData.Length - 1
		Array.Copy(contohData(i), contohDataKolomKriteria, jumlahSarafInput)
		Array.Copy(contohData(i), jumlahSarafInput, contohDataKolomHasil, 0, jumlahSarafOutput)
		Dim dataKolomHasil As Double() = Me.hitungNilaiOutput(contohDataKolomKriteria)
		For j As Integer = 0 To jumlahSarafOutput - 1
			hasil += (contohDataKolomHasil(j) - dataKolomHasil(j)) * (contohDataKolomHasil(j) - dataKolomHasil(j))
		Next
	Next
	Return hasil / contohData.Length
End Function

4a3. Untuk masing-masing individu awal, lakukan pengecekan apakah individu ini berada pada posisi terbaik

populasi(i).nilaiKesalahan = nilaiKesalahan
If populasi(i).nilaiKesalahan < nilaiKesalahanTerbaik Then
	nilaiKesalahanTerbaik = populasi(i).nilaiKesalahan
	Array.Copy(populasi(i).kromosom, solusiTerbaik, jumlahBobot)
End If

4b. Lakukan proses pencarian matriks bobot terbaik sebanyak jumlah perulangan (poin 4b1 – 4b5)

4b1. Tentukan 2 data induk pada populasi, yang kira-kira memiliki nilai kesalahan yang cukup rendah

4b1a. Lakukan pengacakan urutan indeks populasi, sehingga populasi yang dipilih tidak akan berurutan

For i As Integer = 0 To indeksPopulasi.Length - 1
	Dim r As Integer = rnd.Next(i, indeksPopulasi.Length)
	Dim tmp As Integer = indeksPopulasi(r)
	indeksPopulasi(r) = indeksPopulasi(i)
	indeksPopulasi(i) = tmp
Next

4b1b. Tentukan banyak calon induk yang akan dipilih
Kemudian ambil induk acak sebanyak jumlah calon induk
Urutkan calon induk acak, kemudian ambil 2 data teratas untuk menjadi jawaban 2 data induk yang dicari

Dim ukuranCalonIndukTerpilih As Integer = CInt(tau * popSize)
If ukuranCalonIndukTerpilih < n Then
	ukuranCalonIndukTerpilih = n
End If
Dim calonIndukTerpilih As Individu() = New Individu(ukuranCalonIndukTerpilih - 1) {}

For i As Integer = 0 To ukuranCalonIndukTerpilih - 1
	calonIndukTerpilih(i) = populasi(indeksPopulasi(i))
Next
Array.Sort(calonIndukTerpilih)

Dim induk As Individu() = New Individu(n - 1) {}
For i As Integer = 0 To n - 1
	induk(i) = calonIndukTerpilih(i)
Next

4b2. Buat 2 data anak dari 2 data induk yang sudah dipilih sebelumnya

4b2a. Lakukan proses crossover
Buat 2 individu anak yang baru
Masukan sebagian kromosom induk 1 dan sebagian kromosom induk 2 kepada anak 1
Masukan sebagian kromosom induk 2 dan sebagian kromosom induk 1 kepada anak 2

Dim jumlahGen As Integer = induk(0).kromosom.Length
Dim anak1 As New Individu(jumlahGen, minPosisi, maksPosisi, probabilitasMutasi, luasPergerakanMutasi)
Dim anak2 As New Individu(jumlahGen, minPosisi, maksPosisi, probabilitasMutasi, luasPergerakanMutasi)

Dim crossover As Integer = rnd.Next(0, jumlahGen - 1)
For i As Integer = 0 To crossover
	anak1.kromosom(i) = induk(0).kromosom(i)
Next
For i As Integer = crossover + 1 To jumlahGen - 1
	anak2.kromosom(i) = induk(0).kromosom(i)
Next
For i As Integer = 0 To crossover
	anak2.kromosom(i) = induk(1).kromosom(i)
Next
For i As Integer = crossover + 1 To jumlahGen - 1
	anak1.kromosom(i) = induk(1).kromosom(i)
Next

4b2b. Lakukan proses mutasi
Pada masing-masing kromosom anak1
Apabila termasuk dalam probabilitas mutasi, maka lakukan proses mutasi pada kromosom tersebut
Yaitu dengan menambahkan nilai acak pada kromosom tersebut

For i As Integer = 0 To anak1.kromosom.Length - 1
	If rnd.NextDouble() < probabilitasMutasi Then
		Dim hi As Double = luasPergerakanMutasi * maksPosisi
		Dim lo As Double = -hi

		Dim delta As Double = (hi - lo) * rnd.NextDouble() + lo
		anak1.kromosom(i) += delta
	End If
Next

4b2c. Setelah proses crossover dan mutasi, hitung nilai kesalahan pada masing-masing anak
Kemudian masukkan 2 individu anak ini sebagai jawaban individu anak

anak1.nilaiKesalahan = MeanSquaredError(contohData, anak1.kromosom)
anak2.nilaiKesalahan = MeanSquaredError(contohData, anak2.kromosom)

4b3. Urutkan populasi induk, kemudian masukkan 2 data anak untuk menggantikan 2 data induk yang paling buruk (nilai kesalahan tertinggi)

Array.Sort(populasi)
populasi(popSize - 1) = anak1
populasi(popSize - 2) = anak2

4b4. Buat 1 individu acak untuk menggantikan individu induk dengan posisi ketiga terburuk
Kemudian hitung nilai kesalahan untuk individu acak tersebut

Dim individuAcak As New Individu(jumlahGen, minPosisi, maksPosisi, probabilitasMutasi, luasPergerakanMutasi)
individuAcak.nilaiKesalahan = MeanSquaredError(contohData, individuAcak.kromosom)
populasi(popSize - 3) = individuAcak

4b5. Hitung nilai kesalahan pada 3 data yang baru, yaitu 2 data anak dan 1 data individu acak
Jika nilai kesalahannya lebih rendah dari nilai kesalahan terbaik, ambil individu tersebut sebagai solusi terbaik
Jika nilai kesalahannya lebih rendah dari batas minimal nilai kesalahan, maka hentikan perhitungan

For i As Integer = popSize - 3 To popSize - 1
	If populasi(i).nilaiKesalahan < nilaiKesalahanTerbaik Then
		nilaiKesalahanTerbaik = populasi(i).nilaiKesalahan
		populasi(i).kromosom.CopyTo(solusiTerbaik, 0)

		If nilaiKesalahanTerbaik < batasnilaiKesalahanMinimal Then
			selesai = True
			Console.WriteLine(vbLf & "Perhitungan dihentikan pada generasi " & generasi)
		End If
	End If
Next

* Gunakan fungsi ini untuk memasukkan matriks bobot awal kedalam 4 matriks data yaitu matriks ihBobot, hBias, hoBobot, oBias
ihBobot adalah matriks bobot pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf input * jumlah saraf tersembunyi (3 * 4 = 12 buah)
hBias adalah matriks nilai bias pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf tersembunyi (4 buah)
hoBobot adalah matriks bobot pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf tersembunyi * jumlah saraf output (4 * 2 = 8 buah)
oBias adalah matriks nilai bias pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf output (2 buah)

Public Sub setBobot(bobot As Double())
	Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi) + (jumlahSarafTersembunyi * jumlahSarafOutput) + jumlahSarafTersembunyi + jumlahSarafOutput
	If bobot.Length <> jumlahBobot Then
		Throw New Exception("Pada fungsi SetBobotAwal, panjang matriks bobot: " & bobot.Length & " tidak sama dengan jumlah bobot yang seharusnya, yaitu " & jumlahBobot)
	End If

	Dim k As Integer = 0
	For i As Integer = 0 To jumlahSarafInput - 1
		For j As Integer = 0 To jumlahSarafTersembunyi - 1
			ihBobot(i)(j) = bobot(k)
			k += 1
		Next
	Next
	For i As Integer = 0 To jumlahSarafTersembunyi - 1
		hBias(i) = bobot(k)
		k += 1
	Next
	For i As Integer = 0 To jumlahSarafTersembunyi - 1
		For j As Integer = 0 To jumlahSarafOutput - 1
			hoBobot(i)(j) = bobot(k)
			k += 1
		Next
	Next
	For i As Integer = 0 To jumlahSarafOutput - 1
		oBias(i) = bobot(k)
		k += 1
	Next
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 HyperTan untuk masing-masing data pada matriks hJumlahBobotDanBias
Penjelasan tentang fungsi HyperTan akan dijelaskan pada perhitungan dibawah ini

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	Me.hOutput(i) = HyperTan(hJumlahBobotDanBias(i))
Next

* Gunakan fungsi ini untuk menghitung nilai fungsi HyperTan (tanh)

Private Shared Function HyperTan(x As Double) As Double
	If x < -20.0 Then
		Return -1.0
	ElseIf x > 20.0 Then
		Return 1.0
	Else
		Return Math.Tanh(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 EO diatas, maka diperlukan sebuah Class Individu untuk menampung semua data individu seperti kromosom, nilai kesalahan, jumlah gen, probabilitas mutasi, dan luas pergerakan mutasi. Deklarasi Class Individu adalah sebagai berikut:

Public Class Individu
    Implements IComparable(Of Individu)

    Public kromosom As Double()             ' solusi yang dicari
    Public nilaiKesalahan As Double         ' semakin rendah, maka semakin baik
    Private jumlahGen As Integer            ' jumlah Gen / dimensi permasalahan
    Private posisiGenMinimal As Double      ' nilai minimum untuk sebuah gen dalam kromosom
    Private posisiGenMaksimal As Double     ' nilai maksimum untuk sebuah gen dalam kromosom
    Private probabilitasMutasi As Double    ' probabilitas gen untuk bermutasi
    Private luasPergerakanMutasi As Double  ' luas area perpindahan gen
    Private Shared rnd As New Random(0)

    Public Sub New(jumlahGen As Integer, posisiGenMinimal As Double, posisiGenMaksimal As Double, probabilitasMutasi As Double, luasPergerakanMutasi As Double)
        Me.jumlahGen = jumlahGen
        Me.posisiGenMinimal = posisiGenMinimal
        Me.posisiGenMaksimal = posisiGenMaksimal
        Me.probabilitasMutasi = probabilitasMutasi
        Me.luasPergerakanMutasi = luasPergerakanMutasi
        Me.kromosom = New Double(jumlahGen - 1) {}

        For i As Integer = 0 To Me.kromosom.Length - 1
            Me.kromosom(i) = (posisiGenMaksimal - posisiGenMinimal) * rnd.NextDouble() + posisiGenMinimal
        Next
    End Sub

    'Fungsi untuk mengurutkan nilai kesalahan dari yang terendah (terbaik) ke tertinggi (terburuk)
    Public Function CompareTo(other As Individu) As Integer Implements IComparable(Of Individu).CompareTo
        If Me.nilaiKesalahan < other.nilaiKesalahan Then
            Return -1
        ElseIf Me.nilaiKesalahan > other.nilaiKesalahan Then
            Return 1
        Else
            Return 0
        End If
    End Function
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd49a

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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *