Algoritma Graph Coloring adalah salah satu algoritma yang digunakan untuk pengambilan keputusan. Contoh yang dibahas kali ini adalah menentukan penjadwalan mata kuliah sederhana.
Diasumsikan ada 4 slot waktu yang tersedia, yaitu slot S1, S2, S3, S4
dan ada 3 ruang yang tersedia, yaitu R1, R2, R3
Berapa mata kuliah yang dapat dimasukkan seminimal mungkin dan memenuhi syarat berikut:
– Tidak ada mata kuliah yang diajarkan pada slot waktu yang sama
– Tidak ada mata kuliah yang diajarkan pada ruang yang sama
Jika diilustrasikan dalam tabel, maka model penjadwalan adalah sebagai berikut
Slot/Ruang | R1 | R2 | R3 |
---|---|---|---|
S1 | ?? | ?? | ?? |
S2 | ?? | ?? | ?? |
S3 | ?? | ?? | ?? |
S4 | ?? | ?? | ?? |
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
Tentukan jumlah titik yang digunakan
Diasumsikan dalam kasus ini, jumlah titik adalah 4 slot waktu * 3 ruang = 12
Const jumlahTitik As Integer = 12
Langkah-langkah penggunaan algoritma ini adalah
1. Inisialisasi semua variabel yang diperlukan, yaitu variabel gambar, titik, dan garis
Penjelasan tentang masing-masing class akan dijelaskan pada skrip dibawah ini
Console.WriteLine("Masukkan kata yang akan dicari usulannya: ") Dim gmb As New Gambar(jumlahTitik) Dim daftarTitik As List(Of Titik) = gmb.daftarTitik Dim daftarGaris As New List(Of Garis)() Dim grs As Garis
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah 4 buah class
Class Titik digunakan untuk menampung data indeks, jumlah tetangga, dan warna titik tersebut
Class Garis digunakan untuk menampung data titik awal, dan titik tujuan garis tersebut
Class Gambar digunakan untuk menampung semua data titik dan semua data garis yang digunakan
Deklarasi masing-masing class adalah sebagai berikut:
Public Class Gambar Public daftarTitik As List(Of Titik) = Nothing Public daftarGaris As List(Of Garis) = Nothing Public Sub New(jumlahTitik As Integer) daftarTitik = New List(Of Titik) For i As Integer = 0 To jumlahTitik - 1 daftarTitik.Add(New Titik(i)) Next End Sub End Class Public Class Garis Private m_titikAwal As Titik Private m_titikTujuan As Titik Public Property titikAwal() As Titik Get Return m_titikAwal End Get Set(value As Titik) m_titikAwal = value End Set End Property Public Property titikTujuan() As Titik Get Return m_titikTujuan End Get Set(value As Titik) m_titikTujuan = value End Set End Property Public Sub New(titikAwal As Titik, titikTujuan As Titik) m_titikAwal = titikAwal m_titikTujuan = titikTujuan End Sub End Class Public Class Titik Private m_Idx As String Private m_jumlahTitikTetangga As Integer Private m_warna As String Public Property Idx() As String Get Return m_Idx End Get Set(value As String) m_Idx = value End Set End Property Public Property JumlahTitikTetangga() As Integer Get Return m_jumlahTitikTetangga End Get Set(value As Integer) m_jumlahTitikTetangga = value End Set End Property Public Property Warna() As String Get Return m_warna End Get Set(value As String) m_warna = value End Set End Property Public Sub New(ByVal idx As Integer) m_Idx = idx m_jumlahTitikTetangga = 0 m_warna = "" End Sub End Class
2. Masukkan data titik dan garis kedalam masing-masing variabel yang tersedia
data garis yang digunakan adalah mengikuti deskripsi batasan yang sudah dijelaskan sebelumnya
sehingga beri garis pada titik yang berada pada slot waktu atau ruang yang sama
grs = New Garis(daftarTitik(0), daftarTitik(1)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(0), daftarTitik(2)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(0), daftarTitik(3)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(0), daftarTitik(6)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(0), daftarTitik(9)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(1), daftarTitik(2)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(1), daftarTitik(4)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(1), daftarTitik(7)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(1), daftarTitik(10)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(2), daftarTitik(5)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(2), daftarTitik(8)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(2), daftarTitik(11)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(3), daftarTitik(4)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(3), daftarTitik(5)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(3), daftarTitik(6)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(3), daftarTitik(9)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(4), daftarTitik(5)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(4), daftarTitik(7)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(4), daftarTitik(10)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(5), daftarTitik(8)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(5), daftarTitik(11)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(6), daftarTitik(7)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(6), daftarTitik(8)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(6), daftarTitik(9)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(7), daftarTitik(8)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(7), daftarTitik(10)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(8), daftarTitik(11)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(9), daftarTitik(10)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(9), daftarTitik(11)) daftarGaris.Add(grs) grs = New Garis(daftarTitik(10), daftarTitik(11)) daftarGaris.Add(grs)
Jika diilustrasikan dalam gambar, maka model graphnya adalah sebagai berikut
3. Hitung jumlah titik tetangga dari masing-masing titik yang terhubung oleh garis
For i As Integer = 0 To daftarGaris.Count - 1 Dim garis As Garis = daftarGaris(i) garis.titikAwal.JumlahTitikTetangga += 1 garis.titikTujuan.JumlahTitikTetangga += 1 Next
4. Lakukan pengurutan perhitungan sehingga titik yang dihitung lebih dulu adalah titik dengan jumlah titik tetangga terbanyak sampai pada titik tetangga yang paling sedikit
gmb.daftarTitik = daftarTitik.ToList().OrderByDescending(Function(p) p.JumlahTitikTetangga).ToList()
* Lakukan perhitungan untuk mendapatkan urutan titik dan banyak warna yang digunakan (poin 5)
5. Lakukan perhitungan pada masing-masing titik (poin 5a – 5d)
For i As Integer = 0 To jumlahTitik - 1 . . .
5a. Dapatkan titik yang sedang digunakan
Dim titik As Titik = gmb.daftarTitik(i)
5b. Lakukan perhitungan pada masing-masing garis
Tandai semua titik lain yang terhubung dengan titik yang sedang dihitung
For j As Integer = 0 To daftarGaris.Count - 1 Dim garis As Garis = daftarGaris(j) If titik.Idx = garis.titikAwal.Idx Or titik.Idx = garis.titikTujuan.Idx Then isTitikTerhubung(garis.titikAwal.Idx) = True isTitikTerhubung(garis.titikTujuan.Idx) = True End If Next
5c. Lakukan perhitungan pada semua titik
Masukkan semua titik yang tidak terhubung dengan titik yang sedang dihitung secara berurutan,
tapi pastikan juga bahwa tidak ada titik yang sama dimasukkan lebih dari 1 kali
Jika semua titik sudah masuk dalam urutan maka hentikan perhitungan
For j As Integer = 0 To jumlahTitik - 1 If (i = j) Or Not isTitikTerhubung(j) Then Dim st As Boolean = False For k As Integer = 0 To urutanTitik.Count - 1 If urutanTitik(k) Is daftarTitik(j) Then st = True Exit For End If Next If Not st Then isDitemukan = True urutanTitik.Add(daftarTitik(j)) If urutanTitik.Count >= jumlahTitik Then Exit For End If End If Next
5d. Jika ditemukan titik yang tidak terhubung dengan titik yang sedang dihitung, maka tambahkan jumlah warna yang digunakan
Jika semua titik sudah masuk dalam urutan maka hentikan perhitungan
If isDitemukan Then jumlahWarna += 1 If urutanTitik.Count >= jumlahTitik Then Exit For
6. Lakukan inisialisasi warna sebanyak jumlah warna yang diperlukan
Dim warna(jumlahWarna - 1) As String For i As Integer = 0 To jumlahWarna - 1 warna(i) = "Warna" & (i + 1).ToString("00") Next
* Lakukan perhitungan untuk memberikan warna pada masing-masing titik (poin 7)
7. Lakukan perhitungan sesuai urutan titik yang sudah ditentukan sebelumnya (poin 7a – 7c)
For i As Integer = 0 To urutanTitik.Count - 1 . . .
7a. Dapatkan titik yang sedang digunakan
Dim titik As Titik = urutanTitik(i)
7b. Lakukan perhitungan pada masing-masing garis
Tandai semua warna yang sudah digunakan pada titik yang terhubung dengan titik yang sedang dihitung
For j As Integer = 0 To daftarGaris.Count - 1 Dim garis As Garis = daftarGaris(j) If (isTitikTerpakai(garis.titikAwal.Idx) Or isTitikTerpakai(garis.titikTujuan.Idx)) AndAlso _ (titik.Idx = garis.titikAwal.Idx Or titik.Idx = garis.titikTujuan.Idx) Then For k As Integer = 0 To jumlahWarna - 1 If warna(k) = garis.titikAwal.Warna Then isWarnaTerpilih(k) = True If warna(k) = garis.titikTujuan.Warna Then isWarnaTerpilih(k) = True Next End If Next
7c. Beri warna titik ini dengan warna yang belum digunakan pada titik yang terhubung dengan titik yang sedang dihitung
Kemudian tandai bahwa titik ini sudah diberi warna
For k As Integer = 0 To jumlahWarna - 1 If Not isWarnaTerpilih(k) Then titik.Warna = warna(k) isTitikTerpakai(titik.Idx) = True Console.WriteLine("Titik " & (titik.Idx + 1).ToString("00") & " termasuk dalam warna " & k + 1) Exit For End If Next
* Tampilkan hasil kesimpulan jumlah warna pada layar
Kemudian tampilkan data mata kuliah yang dapat dimasukkan pada jadwal kuliah
Dim kesimpulan(jumlahWarna - 1) As String For i As Integer = 0 To jumlahTitik - 1 Dim slot As String = "" If daftarTitik(i).Idx <= 2 Then slot = "S1" ElseIf daftarTitik(i).Idx <= 5 Then slot = "S2" ElseIf daftarTitik(i).Idx <= 8 Then slot = "S3" ElseIf daftarTitik(i).Idx <= 11 Then slot = "S4" End If Dim ruang As String = "" If daftarTitik(i).Idx Mod 3 = 0 Then ruang = "R1" ElseIf daftarTitik(i).Idx Mod 3 = 1 Then ruang = "R2" ElseIf daftarTitik(i).Idx Mod 3 = 2 Then ruang = "R3" End If For k As Integer = 0 To jumlahWarna - 1 If daftarTitik(i).Warna = "Warna" & (k + 1).ToString("00") Then kesimpulan(k) &= IIf(kesimpulan(k) = "", "", " - ") & "Slot " & slot & " Ruang " & ruang Exit For End If Next Next For k As Integer = 0 To jumlahWarna - 1 Console.WriteLine("Mata Kuliah #" & (k + 1).ToString("00") & " diletakkan pada " & kesimpulan(k)) Next
Hasil akhir adalah: (klik untuk perbesar gambar)
Jika diilustrasikan dalam tabel, maka hasil penjadwalan adalah sebagai berikut
Slot/Ruang | R1 | R2 | R3 |
---|---|---|---|
S1 | Mata Kuliah #01 | Mata Kuliah #04 | Mata Kuliah #03 |
S2 | Mata Kuliah #03 | Mata Kuliah #01 | Mata Kuliah #02 |
S3 | Mata Kuliah #04 | Mata Kuliah #02 | Mata Kuliah #01 |
S4 | Mata Kuliah #02 | Mata Kuliah #03 | Mata Kuliah #04 |
Jika diilustrasikan dalam gambar, maka model hasil akhirnya adalah sebagai berikut
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.