Algoritma ART (Adaptive Resonance Theory)


Algoritma ART (Adaptive Resonance Theory) adalah salah satu algoritma yang digunakan untuk klasifikasi atau pengelompokan data. Contoh yang dibahas kali ini adalah mengenai penentuan rekomendasi barang yang sebaiknya dibeli.



Diasumsikan ada 12 data barang yang dijual, dengan data sebagai berikut:

Barang
PensilPensil 2BPensil 3BPensil 4B
PenaPena MerahPena BiruPena Hitam
PenggarisPenggaris 15cmPenggaris 20cmPenggaris 30cm
BukuBuku TulisBuku GambarKomik

Contoh data barang adalah sebagai berikut:

Dim barang() As String = New String() {"Pensil 2B", "Pensil 3B", "Pensil 4B", _
									   "Pena Merah", "Pena Biru", "Pena Hitam", _
									   "Penggaris 15cm", "Penggaris 20cm", "Penggaris 30cm", _
									   "Buku Tulis", "Buku Gambar", "Komik"}

Kemudian diketahui terdapat 10 pelanggan yang sudah membeli barang-barang tersebut dengan jumlah tertentu
Diasumsikan 10 data transaksi pelanggan tersebut adalah sebagai berikut:
Akan terdapat 12 kolom angka dengan urutan barang sesuai dengan urutan barang diatas
Angka 0 berarti tidak pernah membeli barang, selain itu berarti membeli barang dengan jumlah tersebut

Nama Pelanggan
Pelanggan A33110334102803
Pelanggan B81033382523105
Pelanggan C8542449092105
Pelanggan D054013446492
Pelanggan E396211138793
Pelanggan F7107650324073
Pelanggan G504954905108
Pelanggan H124442106100410
Pelanggan I294401461077
Pelanggan J90910610305799

Contoh data pelanggan adalah sebagai berikut:

Dim pelanggan(9)() As Integer
pelanggan(0) = New Integer() {3, 3, 1, 10, 3, 3, 4, 10, 2, 8, 0, 3}
pelanggan(1) = New Integer() {8, 10, 3, 3, 3, 8, 2, 5, 2, 3, 10, 5}
pelanggan(2) = New Integer() {8, 5, 4, 2, 4, 4, 9, 0, 9, 2, 10, 5}
pelanggan(3) = New Integer() {0, 5, 4, 0, 1, 3, 4, 4, 6, 4, 9, 2}
pelanggan(4) = New Integer() {3, 9, 6, 2, 1, 1, 1, 3, 8, 7, 9, 3}
pelanggan(5) = New Integer() {7, 10, 7, 6, 5, 0, 3, 2, 4, 0, 7, 3}
pelanggan(6) = New Integer() {5, 0, 4, 9, 5, 4, 9, 0, 5, 1, 0, 8}
pelanggan(7) = New Integer() {1, 2, 4, 4, 4, 2, 10, 6, 10, 0, 4, 10}
pelanggan(8) = New Integer() {2, 9, 4, 4, 0, 1, 4, 6, 1, 0, 7, 7}
pelanggan(9) = New Integer() {9, 0, 9, 10, 6, 10, 3, 0, 5, 7, 9, 9}

Maka tentukan rekomendasi untuk pelanggan tertentu untuk membeli barang tertentu yang banyak dibeli pelanggan lain



Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan konstanta beta untuk digunakan dalam perhitungan nilai kedekatan
Diasumsikan dalam kasus ini, nilai beta adalah 2.0

Const nilaiBeta As Single = 2.0

* Tentukan probabilitas nilai cluster pada sebuah data agar masuk ke dalam cluster yang sama
Diasumsikan dalam kasus ini, nilai cluster adalah 0.6

Const nilaiCluster As Single = 0.6

* Tentukan probabilitas nilai hyper cluster pada sebuah data agar masuk ke dalam hyper cluster yang sama
Hyper cluster adalah pengelompokan cluster-cluster yang sudah ditemukan sebelumnya
Diasumsikan dalam kasus ini, nilai hyper cluster adalah 0.3

Const nilaiHyperCluster As Single = 0.3

* Tentukan batas atas jumlah transaksi yang diperbolehkan
Nominalnya diperoleh dari semua data transaksi dengan jumlah terbanyak
Diasumsikan dalam kasus ini, batas atas jumlah transaksi adalah 10 buah

Const batasAtasJumlahTransaksi As Integer = 10

* Tentukan epsilon, yaitu nilai pembeda antara cluster 1 dengan yang lain, sehingga tidak ada 2 cluster dengan nilai cluster yang sama
Diasumsikan dalam kasus ini, nilai epsilon adalah 0.001
Sehingga untuk cluster dengan nilai sama, cluster tersebut akan dikurangi dengan nilai ini sampai tidak ada lagi nilai cluster yang sama

Const epsilon As Single = 0.001F

* Tentukan jumlah maksimal iterasi yang diperbolehkan
Hal ini untuk mencegah sebuah data hanya berpindah antara 2 cluster secara terus menerus tanpa henti
Diasumsikan dalam kasus ini, jumlah maksimal iterasi adalah 50 kali

Const maksIterasi As Integer = 50

Langkah-langkah penggunaan algoritma ini adalah

* Lakukan proses perhitungan dengan menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 1 dan 2)

ART(daftarPelanggan, barang.Length, _
	nilaiBeta, nilaiCluster, nilaiHyperCluster, _
	batasAtasJumlahTransaksi, epsilon, maksIterasi, _
	daftarVektorCluster, daftarVektorHyperCluster, _
	DictPelangganKeCluster, DictClusterKeHyperCluster)

Memasuki perhitungan pada fungsi ART

1. Lakukan perhitungan untuk mengelompokan semua pelanggan ke dalam beberapa cluster

1a. Lakukan perhitungan selama masih ada data yang belum masuk cluster (poin 1a1 – 1a2)

While bIsDataBerubah
	bIsDataBerubah = False
    . . .

1a1. Lakukan perhitungan pada masing-masing Pelanggan (poin 1a1a – 1a1e)

For Each p As Pelanggan In daftarPelanggan
. . .

1a1a. Lakukan perhitungan pada masing-masing cluster yang ada (poin 1a1a1 – 1a1a2)

For Each c As Cluster In daftarVektorCluster
. . .

1a1a1. Hitung nilai kedekatan pada masing-masing cluster
dengan rumus (jumlah data irisan vektor pada cluster / beta + jumlah data vektor pada cluster)

Dim kedekatan As Single = (JumlahDataIrisanVektor(p.dataTransaksi, c.vektorCluster, jumlahBarang) / (nilaiBeta + JumlahDataVektor(c.vektorCluster, jumlahBarang)))

* Gunakan fungsi ini untuk menghitung jumlah data dari nilai irisan 2 vektor input
nilai irisan adalah nilai minimal dari masing-masing barang pada 2 vektor input

Public Function JumlahDataIrisanVektor(input1 As Integer(), input2 As Integer(), ByVal jumlahBarang As Integer) As Integer
	Dim hasil As Integer = 0

	For i As Integer = 0 To jumlahBarang - 1
		hasil += Math.Min(input1(i), input2(i))
	Next

	Return hasil
End Function

* Gunakan fungsi ini untuk menjumlahkan semua elemen dalam sebuah vektor

Public Function JumlahDataVektor(vektor As Integer(), ByVal jumlahBarang As Integer) As Integer
	Dim hasil As Integer = 0
	For i As Integer = 0 To jumlahBarang - 1
		hasil += vektor(i)
	Next
	Return hasil
End Function

1a1a2. Apabila nilai kedekatan pada cluster sekarang sama dengan nilai yang dihitung sebelumnya,
Maka turunkan nilainya dengan angka yang sangat kecil,
sehingga tidak ada cluster yang bernilai sama

While DictKedekatan.ContainsKey(kedekatan)
	kedekatan -= epsilon
End While

1a1a3. Catat nilai kedekatan pada masing-masing cluster

DictKedekatan.Add(kedekatan, c)

1a1b. Hitung jumlah semua data pada vektor terpilih
Fungsi JumlahDataVektorTerpilih sudah dijelaskan pada perhitungan sebelumnya

Dim JumlahDataVektorTerpilih As Integer = JumlahDataVektor(p.dataTransaksi, jumlahBarang)

1a1c. Hitung batas minimal kedekatan dengan rumus jumlah data vektor terpilih / (beta + batas nilai survei * jumlah barang)

Dim batasMinimalKedekatan As Single = JumlahDataVektorTerpilih / (nilaiBeta + batasAtasJumlahTransaksi * jumlahBarang)

1a1d. Lakukan perulangan pada masing-masing nilai kedekatan
Lakukan perhitungan berikutnya apabila nilai kedekatan pada sebuah cluster lebih dari batas nilai minimal kedekatan (poin 1a1d1 – 1a1d2)

For Each DictKedekatanCluster In DictKedekatan.Reverse()
	If DictKedekatanCluster.Key >= batasMinimalKedekatan Then
	. . .

1a1d1. Hitung nilai vigilance menggunakan nilai kedekatan pada masing-masing cluster

Dim vigilance As Single = CSng(JumlahDataIrisanVektor(p.dataTransaksi, DictKedekatanCluster.Value.vektorCluster, jumlahBarang)) / (JumlahDataVektorTerpilih)

1a1d2. Jika nilai vigilance melebihi nilai cluster,
maka tambahkan Pelanggan terpilih pada cluster ini (poin 1a1d2a – 1a1d2b)

If vigilance >= nilaiCluster Then
. . .

1a1d2a. Sebelumnya hapus Pelanggan ini dari cluster sebelumnya

1a1d2a1. Jika Pelanggan ini sudah ada di cluster tujuan,
maka lanjutkan perhitungan untuk Pelanggan berikutnya

If c Is DictKedekatanCluster.Value Then Exit For

1a1d2a2. Lakukan penghapusan Pelanggan dari cluster yang lama
Jika pada cluster tersebut sudah tidak ada lagi Pelanggan lain, maka hapus juga clusternya

If c.HapusPelangganDariCluster(p, jumlahBarang) = False Then daftarVektorCluster.Remove(c)

* Gunakan fungsi ini untuk menghapus seorang pelanggan dari dalam cluster
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function HapusPelangganDariCluster(ByVal p As Pelanggan, ByVal jumlahBarang As Integer) As Boolean
	If daftarPelanggan.Remove(p) = False Then
		Throw New Exception((Convert.ToString("Gagal menghapus Pelanggan ") & p.nama) & " dari cluster!")
	Else
		If daftarPelanggan.Count > 0 Then
			Dim enumerator = daftarPelanggan.GetEnumerator()
			enumerator.MoveNext()

			vektorCluster = enumerator.Current.dataTransaksi
			vektorJumlah = enumerator.Current.dataTransaksi

			While enumerator.MoveNext() <> False
				vektorCluster = IrisanVektor(vektorCluster, enumerator.Current.dataTransaksi, jumlahBarang)
				vektorJumlah = JumlahVektor(vektorJumlah, enumerator.Current.dataTransaksi, jumlahBarang)
			End While
		End If
	End If
	Return daftarPelanggan.Count > 0
End Function

1a1d2b. Tambahkan Pelanggan terpilih ke dalam cluster yang baru

DictKedekatanCluster.Value.TambahPelangganKeCluster(p, jumlahBarang)
DictPelangganKeCluster(p.nama) = DictKedekatanCluster.Value

* Gunakan fungsi ini untuk menambahkan pelanggan baru ke dalam cluster
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Sub TambahPelangganKeCluster(ByVal p As Pelanggan, ByVal jumlahBarang As Integer)
	If daftarPelanggan.Contains(p) Then
		Throw New Exception((Convert.ToString("Pelanggan ") & p.nama) & " sudah berada pada cluster ini!")
	Else
		vektorCluster = IrisanVektor(vektorCluster, p.dataTransaksi, jumlahBarang)
		vektorJumlah = JumlahVektor(vektorJumlah, p.dataTransaksi, jumlahBarang)
		daftarPelanggan.AddLast(p)
	End If
End Sub

* Gunakan fungsi ini untuk menghitung nilai irisan 2 vektor input
nilai irisan adalah nilai minimal dari masing-masing barang pada 2 vektor input

Public Function IrisanVektor(input1 As Integer(), input2 As Integer(), ByVal jumlahBarang As Integer) As Integer()
	Dim hasil As Integer() = New Integer(jumlahBarang - 1) {}

	For i As Integer = 0 To jumlahBarang - 1
		hasil(i) = Math.Min(input1(i), input2(i))
	Next

	Return hasil
End Function

* Gunakan fungsi ini untuk menghitung jumlah dari 2 vektor input
nilai pengembalian adalah vektor dengan kolom-kolom yang berisi penjumlahan nilai 2 buah vektor input

Public Function JumlahVektor(input1 As Integer(), input2 As Integer(), ByVal jumlahBarang As Integer) As Integer()
	Dim hasil As Integer() = New Integer(jumlahBarang - 1) {}

	For i As Integer = 0 To jumlahBarang - 1
		hasil(i) = input1(i) + input2(i)
	Next

	Return hasil
End Function

1a1e. Jika Pelanggan terpilih tidak termasuk dalam cluster manapun,
maka buat cluster baru dan masukkan Pelanggan terpilih dalam cluster tersebut

If Not DictPelangganKeCluster.ContainsKey(p.nama) Then
	Dim clusterBaru As New Cluster(p)
	daftarVektorCluster.AddLast(clusterBaru)
	DictPelangganKeCluster.Add(p.nama, clusterBaru)
	bIsDataBerubah = True
End If

1a2. Jika perulangan sudah melebihi batas maksimal iterasi, maka hentikan perulangan ini

If System.Threading.Interlocked.Decrement(iterasi) = 0 Then Exit While

2. Setelah masing-masing Pelanggan sudah mendapatkan cluster,
Maka lakukan perhitungan sekali lagi untuk mengelompokan cluster tersebut ke dalam hyper cluster

2a. Lakukan perhitungan selama masih ada data yang belum masuk hyper cluster (poin 2a1 – 2a2)

While bIsDataBerubah
	bIsDataBerubah = False
	. . .

2a1. Lakukan perhitungan pada masing-masing cluster (poin 2a1a – 2a1e)

For Each c As Cluster In daftarVektorCluster
. . .

2a1a. Lakukan perhitungan pada masing-masing hyper cluster yang ada (poin 2a1a1 – 2a1a3)

For Each hc As HyperCluster In daftarVektorHyperCluster
. . .

2a1a1. Hitung nilai kedekatan pada masing-masing byper cluster
dengan rumus (jumlah data irisan vektor cluster pada hyper cluster / beta + jumlah data vektor pada hyper cluster)

Dim kedekatan As Single = (JumlahDataIrisanVektor(c.vektorCluster, hc.vektorHyperCluster, jumlahBarang) / (nilaiBeta + JumlahDataVektor(hc.vektorHyperCluster, jumlahBarang)))

2a1a2. Apabila nilai kedekatan pada hyper cluster sekarang sama dengan nilai yang dihitung sebelumnya,
Maka turunkan nilainya dengan angka yang sangat kecil,
sehingga tidak ada hyper cluster yang bernilai sama

While DictKedekatan.ContainsKey(kedekatan)
	kedekatan -= epsilon
End While

2a1a3. Catat nilai kedekatan cluster pada masing-masing hyper cluster

DictKedekatan.Add(kedekatan, hc)

2a1b. Hitung jumlah semua data pada vektor terpilih

Dim JumlahDataVektorTerpilih As Integer = JumlahDataVektor(c.vektorCluster, jumlahBarang)

2a1c. Hitung batas minimal kedekatan dengan rumus jumlah data vektor terpilih / (beta + batas nilai survei * jumlah barang)

Dim batasMinimalKedekatan As Single = JumlahDataVektorTerpilih / (nilaiBeta + batasAtasJumlahTransaksi * jumlahBarang)

2a1d. Lakukan perulangan pada masing-masing nilai kedekatan
Lakukan perhitungan apabila nilai kedekatan cluster pada sebuah hyper cluster lebih dari batas nilai minimal kedekatan (poin 2a1d1 – 2a1d2)

For Each DictKedekatanHyperCluster In DictKedekatan.Reverse()
	If DictKedekatanHyperCluster.Key >= batasMinimalKedekatan Then
	. . .

2a1d1. Hitung nilai vigilance menggunakan nilai kedekatan cluster pada masing-masing hyper cluster

Dim vigilance As Single = CSng(JumlahDataIrisanVektor(c.vektorCluster, DictKedekatanHyperCluster.Value.vektorHyperCluster, jumlahBarang)) / (JumlahDataVektorTerpilih)

2a1d2. Jika nilai vigilance melebihi nilai hyper cluster,
maka tambahkan cluster terpilih pada hyper cluster ini (poin 2a1d2a – 2a1d2b)

If vigilance >= nilaiHyperCluster Then
. . .

2a1d2a. Sebelumnya hapus cluster ini dari hyper cluster sebelumnya

2a1d2a1. Jika cluster ini sudah ada di hyper cluster tujuan,
maka lanjutkan perhitungan untuk hyper cluster berikutnya

If hc Is DictKedekatanHyperCluster.Value Then Exit For

2a1d2a2. Lakukan penghapusan cluster dari hyper cluster yang lama
Jika pada hyper cluster tersebut sudah tidak ada lagi cluster lain, maka hapus juga hyper clusternya

If hc.HapusCluster(c, jumlahBarang) = False Then
	daftarVektorHyperCluster.Remove(hc)
End If

* Gunakan fungsi ini untuk menghapus sebuah cluster dari dalam hyper cluster
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Public Function HapusCluster(ByVal c As Cluster, ByVal jumlahBarang As Integer) As Boolean
	If daftarCluster.Remove(c) = False Then
		Throw New Exception("Gagal menghapus cluster!")
	Else
		If daftarCluster.Count > 0 Then
			Dim enumerator = daftarCluster.GetEnumerator()
			enumerator.MoveNext()

			vektorHyperCluster = enumerator.Current.vektorCluster
			vektorJumlah = enumerator.Current.vektorJumlah

			daftarPelanggan.Clear()
			For Each p As Pelanggan In enumerator.Current.daftarPelanggan
				daftarPelanggan.AddLast(p)
			Next

			While enumerator.MoveNext() <> False
				vektorHyperCluster = IrisanVektor(vektorHyperCluster, enumerator.Current.vektorCluster, jumlahBarang)
				vektorJumlah = JumlahVektor(vektorJumlah, enumerator.Current.vektorJumlah, jumlahBarang)

				For Each p As Pelanggan In enumerator.Current.daftarPelanggan
					daftarPelanggan.AddLast(p)
				Next
			End While
		End If
	End If

	Return daftarCluster.Count > 0
End Function

2a1d2b. Tambahkan cluster terpilih ke dalam hyper cluster yang baru

DictKedekatanHyperCluster.Value.TambahCluster(c, jumlahBarang)
DictClusterKeHyperCluster(c) = DictKedekatanHyperCluster.Value

* Gunakan fungsi ini untuk menambahkan cluster baru ke dalam hyper cluster
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Fungsi IrisanVektor dan JumlahVektor sudah dijelaskan pada poin diatas

Public Sub TambahCluster(ByVal c As Cluster, ByVal jumlahBarang As Integer)
	vektorHyperCluster = IrisanVektor(vektorHyperCluster, c.vektorCluster, jumlahBarang)
	vektorJumlah = JumlahVektor(vektorJumlah, c.vektorJumlah, jumlahBarang)
	For Each p As Pelanggan In c.daftarPelanggan
		daftarPelanggan.AddLast(p)
	Next
	daftarCluster.AddLast(c)
End Sub

2a1e. Jika cluster terpilih tidak termasuk dalam hyper cluster manapun,
maka buat hyper cluster baru dan masukkan cluster terpilih dalam hyper cluster tersebut

If Not DictClusterKeHyperCluster.ContainsKey(c) Then
	Dim hyperClusterBaru As New HyperCluster(c)
	daftarVektorHyperCluster.AddLast(hyperClusterBaru)
	DictClusterKeHyperCluster.Add(c, hyperClusterBaru)
	bIsDataBerubah = True
End If

2a2. Jika perulangan sudah melebihi batas maksimal iterasi, maka hentikan perulangan ini

If System.Threading.Interlocked.Decrement(iterasi) = 0 Then Exit While

3. Tentukan pelanggan yang akan dicari rekomendasinya

Console.WriteLine("Tentukan pelanggan yang akan dicari rekomendasinya (1-10)")
Dim input As Integer = CInt(Console.ReadLine)

4. Cari rekomendasi untuk pelanggan tersebut
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

CariRekomendasi(daftarBarang, barang.Length, DictPelangganKeCluster, DictClusterKeHyperCluster, PelangganTerpilih, c)

Memasuki perhitungan pada fungsi CariRekomendasi

4a. Hitung rekomendasi dari cluster pelanggan tersebut

4a1. Lakukan perhitungan pada setiap barang (poin 4a1a – 4a1b)

For i As Integer = 0 To jumlahBarang - 1
. . .

4a1a. Jika data transaksi pada awal mula adalah 0 dan hasil perhitungan bukan 0,
maka barang ini termasuk dalam kesimpulan barang yang tidak pernah dibeli dan sebaiknya dibeli
Kemudian catat selisih minimal untuk barang-barang yang termasuk dalam kesimpulan ini

If p.dataTransaksi(i) = 0 AndAlso c.vektorJumlah(i) <> 0 Then
	IsDirekomendasikanTidakPernahMembeli = True

	If selisihTidakPernahMembeli < c.vektorJumlah(i) Then
		selisihTidakPernahMembeli = c.vektorJumlah(i)

		'indeks barang adalah i+1 karena daftar barang pada indeks ke 0 adalah nama barang
		idxTidakPernahMembeli = i + 1
	End If
. . .

4a1b. Jika data transaksi pada awal mula kurang dari hasil perhitungan, dan data transaksi pada awal mula kurang dari batas minimal rekomendasi
maka barang ini termasuk dalam kesimpulan barang yang sudah pernah dibeli sedikit dan sebaiknya dibeli lagi
Kemudian catat selisih minimal untuk barang-barang yang termasuk dalam kesimpulan ini

. . .
ElseIf p.dataTransaksi(i) < c.vektorJumlah(i) AndAlso p.dataTransaksi(i) < batasMinimalRekomendasi Then
	IsDirekomendasikanMembeliLagi = True

	Dim selisih As Integer = c.vektorJumlah(i) - p.dataTransaksi(i)
	If selisihMembeliLagi < selisih Then
		selisihMembeliLagi = selisih

		'indeks barang adalah i+1 karena daftar barang pada indeks ke 0 adalah nama barang
		idxMembeliLagi = i + 1
	End If
End If

4a2. Catat rekomendasi barang-barang yang termasuk dalam kesimpulan barang yang tidak pernah dibeli dan sebaiknya dibeli

If IsDirekomendasikanTidakPernahMembeli Then
	sOutput &= (Convert.ToString("Direkomendasikan ") & p.nama) & " untuk membeli " & daftarBarang(idxTidakPernahMembeli) & " (kolom ke " & idxTidakPernahMembeli & ")" & vbCrLf
End If

4a3. Catat rekomendasi barang-barang yang termasuk dalam kesimpulan barang yang sudah pernah dibeli sedikit dan sebaiknya dibeli lagi

If IsDirekomendasikanMembeliLagi Then
	sOutput &= (Convert.ToString("Direkomendasikan ") & p.nama) & " untuk membeli " & daftarBarang(idxMembeliLagi) & " (kolom ke " & idxMembeliLagi & ") lagi " & vbCrLf
End If

4b. Hitung rekomendasi dari hyper cluster pelanggan tersebut

4b1. Lakukan perhitungan pada setiap barang (poin 4b1a – 4b1b)

For i As Integer = 0 To jumlahBarang - 1
. . .

4b1a. Jika data transaksi pada awal mula adalah 0 dan hasil perhitungan bukan 0 dan belum tercatat pada perhitungan rekomendasi cluster,
maka barang ini termasuk dalam kesimpulan barang yang tidak pernah dibeli dan sebaiknya dibeli
Kemudian catat selisih minimal untuk barang-barang yang termasuk dalam kesimpulan ini

If p.dataTransaksi(i) = 0 AndAlso hc.vektorJumlah(i) <> 0 AndAlso Not (IsDirekomendasikanTidakPernahMembeli AndAlso idxTidakPernahMembeli = i + 1) Then
	hcIsDirekomendasikanTidakPernahMembeli = True

	If selisihTidakPernahMembeli < hc.vektorJumlah(i) Then
		selisihTidakPernahMembeli = hc.vektorJumlah(i)

		'indeks barang adalah i+1 karena daftar barang pada indeks ke 0 adalah nama barang
		hcidxTidakPernahMembeli = i + 1
	End If
. . .

4b1b. Jika data transaksi pada awal mula kurang dari hasil perhitungan, dan data transaksi pada awal mula kurang dari batas minimal rekomendasi, dan belum tercatat pada perhitungan rekomendasi cluster,
maka barang ini termasuk dalam kesimpulan barang yang sudah pernah dibeli sedikit dan sebaiknya dibeli lagi
Kemudian catat selisih minimal untuk barang-barang yang termasuk dalam kesimpulan ini

. . .
ElseIf p.dataTransaksi(i) > 0 AndAlso p.dataTransaksi(i) < hc.vektorJumlah(i) AndAlso p.dataTransaksi(i) < batasMinimalRekomendasi AndAlso idxMembeliLagi <> i + 1 Then
	hcIsDirekomendasikanMembeliLagi = True

	Dim selisih As Integer = hc.vektorJumlah(i) - p.dataTransaksi(i)
	If selisihMembeliLagi < selisih Then
		selisihMembeliLagi = selisih

		'indeks barang adalah i+1 karena daftar barang pada indeks ke 0 adalah nama barang
		hcidxMembeliLagi = i + 1
	End If
End If

4b2. Catat rekomendasi barang-barang yang termasuk dalam kesimpulan barang yang tidak pernah dibeli dan sebaiknya dibeli dan belum tercatat pada perhitungan rekomendasi cluster

If hcIsDirekomendasikanTidakPernahMembeli Then
	sOutput &= (Convert.ToString("Direkomendasikan ") & p.nama) & " untuk membeli " & daftarBarang(hcidxTidakPernahMembeli) & " (kolom ke " & hcidxTidakPernahMembeli & ")" & vbCrLf
End If

4b3. Catat rekomendasi barang-barang yang termasuk dalam kesimpulan barang yang sudah pernah dibeli sedikit dan sebaiknya dibeli lagi dan belum tercatat pada perhitungan rekomendasi cluster

If hcIsDirekomendasikanMembeliLagi Then
	sOutput &= (Convert.ToString("Direkomendasikan ") & p.nama) & " untuk membeli " & daftarBarang(hcidxMembeliLagi) & " (kolom ke " & hcidxMembeliLagi & ") lagi " & vbCrLf
End If

4c. Jika tidak ada satupun barang yang memenuhi kesimpulan diatas, maka tampilkan pesan peringatan di layar

If Not (IsDirekomendasikanTidakPernahMembeli OrElse hcIsDirekomendasikanTidakPernahMembeli OrElse IsDirekomendasikanMembeliLagi OrElse hcIsDirekomendasikanMembeliLagi) Then
	sOutput &= (Convert.ToString("Tidak ada rekomendasi yang ditemukan untuk ") & p.nama) & ". Coba turunkan batas maksimal rekomendasi!"
End If

* Agar dapat menjalankan skrip diatas, maka diperlukan 3 buah Class
Class Cluster digunakan untuk menampung data vektor cluster, data pelanggan dan vektor jumlah
Class HyperCluster digunakan untuk menampung data vektor hyper cluster, data cluster, data pelanggan, dan data vektor jumlah
Class Pelanggan digunakan untuk menampung data nama dan data transaksi yang ada.
Deklarasi masing-masing class tersebut adalah sebagai berikut:

Public Class Cluster
    Private m_vektorCluster As Integer()                    'Nilai transaksi pada cluster tersebut
    Private m_daftarPelanggan As LinkedList(Of Pelanggan)   'Data pelanggan yang termasuk dalam cluster ini
    Private m_vektorJumlah As Integer()                     'Jumlah vektor pada cluster ini

    Public Property vektorCluster() As Integer()
        Get
            Return m_vektorCluster
        End Get
        Set(value As Integer())
            m_vektorCluster = value
        End Set
    End Property

    Public Property daftarPelanggan() As LinkedList(Of Pelanggan)
        Get
            Return m_daftarPelanggan
        End Get
        Set(value As LinkedList(Of Pelanggan))
            m_daftarPelanggan = value
        End Set
    End Property

    Public Property vektorJumlah() As Integer()
        Get
            Return m_vektorJumlah
        End Get
        Set(value As Integer())
            m_vektorJumlah = value
        End Set
    End Property

    Public Sub New(p As Pelanggan)
        vektorCluster = p.dataTransaksi
        vektorJumlah = p.dataTransaksi
        daftarPelanggan = New LinkedList(Of Pelanggan)()

        daftarPelanggan.AddFirst(p)
    End Sub
	
	. . .
End Class

Public Class HyperCluster
    Private m_vektorHyperCluster As Integer()               'Nilai transaksi pada hyper cluster tersebut
    Private m_daftarCluster As LinkedList(Of Cluster)       'Data cluster yang termasuk dalam hyper cluster ini
    Private m_daftarPelanggan As LinkedList(Of Pelanggan)   'Data pelanggan yang termasuk dalam hyper cluster ini
    Private m_vektorJumlah As Integer()                     'Jumlah vektor pada hyper cluster ini

    Public Property vektorHyperCluster() As Integer()
        Get
            Return m_vektorHyperCluster
        End Get
        Set(value As Integer())
            m_vektorHyperCluster = value
        End Set
    End Property

    Public Property daftarCluster() As LinkedList(Of Cluster)
        Get
            Return m_daftarCluster
        End Get
        Set(value As LinkedList(Of Cluster))
            m_daftarCluster = value
        End Set
    End Property

    Public Property daftarPelanggan() As LinkedList(Of Pelanggan)
        Get
            Return m_daftarPelanggan
        End Get
        Set(value As LinkedList(Of Pelanggan))
            m_daftarPelanggan = value
        End Set
    End Property

    Public Property vektorJumlah() As Integer()
        Get
            Return m_vektorJumlah
        End Get
        Set(value As Integer())
            m_vektorJumlah = value
        End Set
    End Property

    Public Sub New(c As Cluster)
        vektorHyperCluster = c.vektorCluster
        vektorJumlah = c.vektorJumlah

        daftarPelanggan = New LinkedList(Of Pelanggan)()
        For Each p As Pelanggan In c.daftarPelanggan
            daftarPelanggan.AddLast(p)
        Next

        daftarCluster = New LinkedList(Of Cluster)()
        daftarCluster.AddLast(c)
    End Sub

	. . .
End Class

Public Class Pelanggan
    Private m_nama As String                'Nama pelanggan
    Private m_dataTransaksi As Integer()    'Data transaksi masing-masing pelanggan

    Public Property nama() As String
        Get
            Return m_nama
        End Get
        Set(value As String)
            m_nama = value
        End Set
    End Property

    Public Property dataTransaksi() As Integer()
        Get
            Return m_dataTransaksi
        End Get
        Set(value As Integer())
            m_dataTransaksi = value
        End Set
    End Property

    Public Sub New(nama As String, dataTransaksi As Integer())
        Me.nama = nama
        Me.dataTransaksi = dataTransaksi
    End Sub
End Class

Hasil akhir adalah: (klik untuk perbesar gambar)

cmd71

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 *