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 | |||
---|---|---|---|
Pensil | Pensil 2B | Pensil 3B | Pensil 4B |
Pena | Pena Merah | Pena Biru | Pena Hitam |
Penggaris | Penggaris 15cm | Penggaris 20cm | Penggaris 30cm |
Buku | Buku Tulis | Buku Gambar | Komik |
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 A | 3 | 3 | 1 | 10 | 3 | 3 | 4 | 10 | 2 | 8 | 0 | 3 |
Pelanggan B | 8 | 10 | 3 | 3 | 3 | 8 | 2 | 5 | 2 | 3 | 10 | 5 |
Pelanggan C | 8 | 5 | 4 | 2 | 4 | 4 | 9 | 0 | 9 | 2 | 10 | 5 |
Pelanggan D | 0 | 5 | 4 | 0 | 1 | 3 | 4 | 4 | 6 | 4 | 9 | 2 |
Pelanggan E | 3 | 9 | 6 | 2 | 1 | 1 | 1 | 3 | 8 | 7 | 9 | 3 |
Pelanggan F | 7 | 10 | 7 | 6 | 5 | 0 | 3 | 2 | 4 | 0 | 7 | 3 |
Pelanggan G | 5 | 0 | 4 | 9 | 5 | 4 | 9 | 0 | 5 | 1 | 0 | 8 |
Pelanggan H | 1 | 2 | 4 | 4 | 4 | 2 | 10 | 6 | 10 | 0 | 4 | 10 |
Pelanggan I | 2 | 9 | 4 | 4 | 0 | 1 | 4 | 6 | 1 | 0 | 7 | 7 |
Pelanggan J | 9 | 0 | 9 | 10 | 6 | 10 | 3 | 0 | 5 | 7 | 9 | 9 |
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)
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.