Algoritma ACO (Ant Colony Optimization) adalah salah satu algoritma yang digunakan untuk pencarian jalur. Contoh yang dibahas kali ini adalah mengenai pencarian jalur yang melalui semua titik tujuan dengan jarak paling rendah.
Ant Colony Optimization adalah teknik probabilitas untuk menyelesaikan permasalahan, berdasarkan tingkah laku semut dalam sebuah koloni yang mencari sumber makanan. Teknik ini dapat digunakan untuk menemukan solusi dari permasalahan kompleks untuk mendapatkan jalur optimal dalam grafik.



Diasumsikan ada sebaran titik yang harus dilalui semuanya
semua titik terhubung secara langsung dengan titik-titik lainnya, dan semua jalurnya dapat dilalui 2 arah
Jarak yang dihasilkan untuk masing-masing titik akan diambil secara acak antara angka 1 sampai 8
Tentukan Jalur yang harus diambil untuk mengelilingi semua titik dengan jarak terpendek



Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan alpha dan beta
Alpha dan Beta adalah koefisien yang digunakan untuk perhitungan taueta
Semakin besar nilai alpha, semakin besar nilai taueta
Semakin besar nilai beta, semakin kecil nilai taueta

Private Const alpha As Integer = 3
Private Const beta As Integer = 2

* Tentukan rho dan Q
rho dan Q adalah koefisien yang digunakan untuk perhitungan feromon
Semakin besar nilai rho, semakin kecil nilai feromon
Semakin besar nilai beta, semakin besar nilai feromon

Private Const rho As Double = 0.01
Private Const Q As Double = 2.0

* Tentukan jumlah titik yang harus dilalui
Diasumsikan dalam kasus ini, ada 8 titik yang harus dilalui

Const jumlahTitik As Integer = 8

* Tentukan jumlah semut yang melakukan pencarian jalur
Nantinya setiap semut akan melalui semua titik yang telah disebutkan diatas
Diasumsikan dalam kasus ini, ada 10 semut yang melakukan pencarian jalur

Const jumlahSemut As Integer = 10

* Tentukan banyak iterasi yang digunakan dalam perhitungan
Nantinya setiap semut akan melakukan perulangan ini untuk melakukan pencarian jalur
Diasumsikan dalam kasus ini, jumlah iterasi adalah 100 kali

Const iterasi As Integer = 100


Langkah-langkah penggunaan algoritma ini adalah

1. Tentukan Array Jarak untuk setiap titik yang tersedia
Sesuai asumsi diatas, jarak untuk tiap titik akan dihitung secara acak dengan angka 1 sampai 8

Dim Jarak(jumlahTitik - 1)() As Integer
For i As Integer = 0 To Jarak.Length - 1
	Jarak(i) = New Integer(jumlahTitik - 1) {}
Next i
For i As Integer = 0 To jumlahTitik - 1
	For j As Integer = i + 1 To jumlahTitik - 1
		Dim d As Integer = random.Next(1, 8)
		Jarak(i)(j) = d
		Jarak(j)(i) = d
	Next j
Next i

2. Tentukan Array Semut yang digunakan untuk melakukan pencarian jalur
Setiap semut pada Array Semut akan memiliki array Jejak untuk mencatat jalur-jalur yang dilewati
Beri nilai jejak acak sebagai jejak awal mula dari setiap semut

Dim Semut(jumlahSemut - 1)() As Integer
For k As Integer = 0 To jumlahSemut - 1
	Dim titikAwal As Integer = random.Next(0, jumlahTitik)

	Dim Jejak(jumlahTitik - 1) As Integer

	For i As Integer = 0 To jumlahTitik - 1
		Jejak(i) = i
	Next i

	For i As Integer = 0 To jumlahTitik - 1
		Dim r As Integer = random.Next(i, jumlahTitik)
		Dim tmp As Integer = Jejak(r)
		Jejak(r) = Jejak(i)
		Jejak(i) = tmp
	Next i

	Dim idx As Integer = 0
	For i As Integer = 0 To Jejak.Length - 1
		If Jejak(i) = titikAwal Then
			idx = i
		End If
	Next i

	Dim temp As Integer = Jejak(0)
	Jejak(0) = Jejak(idx)
	Jejak(idx) = temp

	Semut(k) = Jejak
Next k

3. Cari Jejak Terbaik dan Jarak Terpendek dari setiap jejak awal pada semua semut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim JejakTerbaik() As Integer = CariJejakTerbaik(Semut, Jarak)
Dim JarakTerpendek As Double = cariJarakTerpendek(JejakTerbaik, Jarak)

* Gunakan Fungsi ini untuk mencari Jejak Terbaik yang memiliki Jarak Terpendek
Jejak terbaik adalah jejak yang memiliki jarak terpendek
Perhitungan mengenai jarak terpendek dilakukan oleh fungsi cariJarakTerpendek

Private Function cariJarakTerpendek(ByVal Jejak() As Integer, ByVal Jarak()() As Integer) As Double
	Dim hasil As Double = 0.0
	For i As Integer = 0 To Jejak.Length - 2
		hasil += Jarak(Jejak(i))(Jejak(i + 1))
	Next i
	Return hasil
End Function

* Gunakan Fungsi ini untuk mencari jarak terpendek pada setiap jejak.
Jarak terpendek dihitung dari jumlah Jarak yang ditempuh pada Array Jejak

Private Function CariJejakTerbaik(ByVal Semut()() As Integer, ByVal Jarak()() As Integer) As Integer()
	Dim JarakTerpendek As Double = cariJarakTerpendek(Semut(0), Jarak)
	Dim idxJarakTerpendek As Integer = 0
	For k As Integer = 1 To Semut.Length - 1
		Dim totalJarak As Double = cariJarakTerpendek(Semut(k), Jarak)
		If totalJarak < JarakTerpendek Then
			JarakTerpendek = totalJarak
			idxJarakTerpendek = k
		End If
	Next k
	Dim jumlahTitik As Integer = Semut(0).Length

	Dim hasilJejakTerbaik(jumlahTitik - 1) As Integer
	Semut(idxJarakTerpendek).CopyTo(hasilJejakTerbaik, 0)
	Return hasilJejakTerbaik
End Function

4. Tentukan Array feromon
Feromon digunakan untuk perhitungan pencarian titik berikutnya
Beri nilai awal feromon dengan nilai yang sangat rendah sekali, yaitu 0.01

Dim Feromon(jumlahTitik - 1)() As Double
For i As Integer = 0 To jumlahTitik - 1
	Feromon(i) = New Double(jumlahTitik - 1) {}
Next i
For i As Integer = 0 To Feromon.Length - 1
	For j As Integer = 0 To Feromon(i).Length - 1
		Feromon(i)(j) = 0.01
	Next j
Next i

5. Lakukan proses pencarian jalur sebanyak n iterasi (poin 5a - 5c)

5a. Lakukan proses pencarian jejak baru pada setiap semut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

UpdateSemut(Semut, Feromon, Jarak, alpha, beta)

5a1. Lakukan perulangan pada setiap semut
Lakukan pencarian jejak baru ke semua titik-titik lain secara acak

5a1a. Untuk semut dengan index k, yang berada pada titik titikX, hitung probabilitas untuk berpindah ke semua titik tujuan

Dim taueta(jumlahTitik - 1) As Double
Dim jumlahTaueta As Double = 0.0
For j As Integer = 0 To taueta.Length - 1
	If j = titikX Then
		taueta(j) = 0.0 'Peluang untuk berpindah ke titik diri sendiri adalah 0
	ElseIf titikTerpakai(j) = True Then
		taueta(j) = 0.0 'Peluang untuk berpindah ke titik titikTerpakai adalah 0
	Else
		taueta(j) = Math.Pow(feromon(titikX)(j), alpha) * Math.Pow((1.0 / Jarak(titikX)(j)), beta)
		If taueta(j) < 0.0001 Then
			taueta(j) = 0.0001
		ElseIf taueta(j) > (Double.MaxValue / (jumlahTitik * 100)) Then
			taueta(j) = Double.MaxValue / (jumlahTitik * 100)
		End If
	End If
	jumlahTaueta += taueta(j)
Next j

Dim probabilitas(jumlahTitik - 1) As Double
For j As Integer = 0 To probabilitas.Length - 1
	probabilitas(j) = taueta(j) / jumlahTaueta
Next j

5a1b. Untuk semut dengan index k, yang berada pada titik titikX, tentukan titik acak berikutnya

Dim NilaiKumulatif(probabilitas.Length) As Double
For j As Integer = 0 To probabilitas.Length - 1
	NilaiKumulatif(j + 1) = NilaiKumulatif(j) + probabilitas(j)
Next j

Dim p As Double = random.NextDouble()

For j As Integer = 0 To NilaiKumulatif.Length - 2
	If p >= NilaiKumulatif(j) AndAlso p < NilaiKumulatif(j + 1) Then
		titikSelanjutnya = j
		Exit For
	End If
Next j

5b. Lakukan proses perubahan nilai feromon pada masing-masing jarak antar titik
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

UpdateFeromon(Feromon, Semut, Jarak, rho, Q)

5b1. Update semua nilai feromon untuk setiap jalur
Cari jarak terpendek pada jalur tersebut
Jika titik-titiknya bersebelahan dan jaraknya bersebelahan, maka nilai feromon akan semakin besar

For i As Integer = 0 To feromon.Length - 1
	For j As Integer = i + 1 To feromon(i).Length - 1
		For k As Integer = 0 To Semut.Length - 1
			Dim jarakTerpendek As Double = cariJarakTerpendek(Semut(k), Jarak)
			Dim faktorPengecil As Double = (1.0 - rho) * feromon(i)(j)
			Dim faktorPembesar As Double = 0.0
			If isBersebelahan(i, j, Semut(k)) = True Then
				faktorPembesar = (Q / jarakTerpendek)
			End If

			feromon(i)(j) = faktorPengecil + faktorPembesar

			If feromon(i)(j) < 0.0001 Then
				feromon(i)(j) = 0.0001
			ElseIf feromon(i)(j) > 100000.0 Then
				feromon(i)(j) = 100000.0
			End If

			feromon(j)(i) = feromon(i)(j)
		Next k
	Next j
Next i

5c. Cari Jejak Terbaik dan Jarak Terpendek dari jejak semut yang telah mengalami perubahan
Apabila jarak terpendek ternyata lebih baik (rendah) daripada jarak terpendek terbaik, maka ambil nilai jejak nya sebagai jejak terbaik

Dim JejakTerbaikSkrg() As Integer = CariJejakTerbaik(Semut, Jarak)
Dim JarakTerpendekSkrg As Double = cariJarakTerpendek(JejakTerbaikSkrg, Jarak)
If JarakTerpendekSkrg < JarakTerpendek Then
	JarakTerpendek = JarakTerpendekSkrg
	JejakTerbaik = JejakTerbaikSkrg
	Console.WriteLine("Jarak Terpendek terbaru " & JarakTerpendek.ToString("F1") & " ditemukan pada iterasi " & n)
End If


Hasil akhir adalah: (klik untuk perbesar gambar)

cmd16a


Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:

[sdm_download id="385" fancy="0"]



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.