5. Dosen luar mendapatkan prioritas dibandingkan dengan dosen tetap
dalam waktu dan hari mengajar. Jadi dosen luar bisa menentukan hari dan jam mengajar.
6. Setiap dosen tidak boleh mengajar melebihi 20 sks.
B. Batasan yang sebaiknya tidak dilanggar, tapi jika terlanggar masih
dianggap valid Soft Contraints. 1.
Dalam 1 hari, rombongan belajar tidak boleh dijadwalkan lebih dari 3 untuk menghindari mahasiswa kuliah 4 pertemuan dalam 1 hari.
3.2 Pemodelan Simulated Annealing untuk Penjadwalan Kelas Matakuliah.
Dalam algoritma SA ada beberapa komponen penting yang harus diperhatikan untuk proses pembuatan jadwal kelas matakuliah.
3.2.1. Menetapkan Jadwal Awal Initial state.
Dalam menetapkan jadwal awal akan digunakan pemodelan vector yaitu Y adalah
“timeslot” dan X adalah “Ruang”, dan koordinat yang dihasilkan X dan Y adalah kelas matakuliah. Berikut ini pemodelannya :
A. Model Data
Di PGSD terdapat 5 hari perkuliahan senin-jumat, waktu perkuliahan dibagi 4 sesi dalam 1 hari, dan terdapat 13 ruang kelas teori.
Maka, dapat langsung diambil kesimpulan berapa jumlah kelas matakuliah
yang dapat ditangani dengan data tersebut, yaitu 5 hari 4 waktu 13 ruang = 260 kelas matakuliah. Jika melebihi 260, maka ada kelas matakuliah yang
tidak terjadwal. 1.
Data Hari dan Waktu dapat dilihat dilampiran pada table 5.1 halaman 193.
2. Data TimeSlot dapat dilihat dilampiran pada table 5.2 halaman 194.
3. Data Ruang dapat dilihat dilampiran pada table 5.3 halaman 194.
4. Data Dosen dapat dilihat dilampiran pada table 5.4 halaman 195.
5. Data Matakuliah dapat dilihat dilampiran pada table 5.5 halaman 196.
6.
Data KelasMatakuliah dapat dilihat dilampiran pada table 5.6 halaman 197.
Berikut ini pemodelan struktur data vector untuk membuat jadwal awal, Y adalah kode timeslot dan X adalah kode ruang. Pada titikkoordinat
pertemuan antara X dan Y akan ditandaidiisikan dengan satu kode kelas matakuliah yang diambil secara random. Berikut ini pemodelan X dan Y:
Y adalah Kode TimeSlot, X adalah kode Ruang.
Gambar 3. 1 Pemodelan Vektor untuk membuat jadwal awal
Keterangan : Pada titikkoordinat pertemuan akan di isikan kode Kelas Matakuliah
yang akan diambil secara acak.
Setiap titikkoordinat pertemuan X dan Y akan berisi kode kelas matakuliah yang akan diambil secara acak. Berikut ini table penjelasannya :
Hasil Koordinat =
{11,ts1,kodeKM, 11,ts1,kodeKM,…,Xav,ts20,KodeKM} Koordinat Tabel
X Y
Kode KM 11
ts1 12
ts1 13
ts1 21
ts1 22
ts1 23
ts1 24
ts1 L.Sbk
ts1 L.Lis
ts1 300
ts1 401
ts1 …
… …
Xav ts20
Tabel 3. 1 Penjelasan model koordinat yang akan terbentuk.
Keterangan : Kode KM adalah kode kelas matakuliah, Kode KM akan di acak untuk
menempati setiap koordinattitik pertemuan.
Setelah didapatkan kode kelas matakuliah, maka akan diambil dari setiap titik koordinat yang dihasilkan X dan Y. Maka akan dihasilkan jadwal
awal terdiri dari satu “time slot” , satu “ruang” dan satu “kelas matakuliah”.
Kumpulan jadwal awal akan disimpan kedalam larik arraylist dengan setiap hasil koordinat akan diberi satu kode jadwal yang unik. Berikut ini struktur
kumpulan jadwal awal yang tersimpan :
Jadi, Jadwal Awal ={
S1,Ts1,11,kodeKM
,
S2,Ts1,12, kodeKM
,…,
Sn, Ts20,Xav, kodeKM
}.
Jadwal Awal Kode Jadwal
Kode TimeSlot Kode Ruang
Kode KM
S1 Ts1
11 S2
Ts1 12
… …
… …
Sn Ts20
Xav
Tabel 3. 2 Tabel Jadwal Awal.
Sebelum menetapkan Algoritma jadwal awal, harus terlebih dahulu buat atribut untuk menampung JadwalAwal, Jadwal_sekarang, Jadwal_baru,
jadwal_yg_terbaik, fungsi biaya jadwal awal, fungsi biaya Jadwal_sekarang, fungsi biaya Jadwal_baru, dan Permintaan kedalam larik seperti berikut.
Keterangan : 1.
jadwal_Awal, untuk menyimpan hasil dari random awal initial state tanpa terjadi duplikat kelas matakuliah dalam random.
2. Jadwal_sekarang dan jadwal_baru untuk menyimpan hasil sementara untuk
proses pengoptimalan dari annealing schedule. 3.
Jadwal_terbaik, untuk menyimpan hasil solusistate terbaik.
private static ListJadwal jadwal_awal = new ArrayList; private static List Jadwal jadwal_sekarang = new ArrayList;
private static List Jadwal jadwal_baru = new ArrayList; private static List Jadwal jadwal_terbaik = new ArrayList;
private static ListPelanggaran fungsiBiaya_jadwal_Awal = new ArrayList; private static ListPelanggaran fungsiBiaya_jadwal_sekarang = new ArrayList;
private static ListPelanggaran fungsiBiaya_jadwal_baru = new ArrayList; private static ListPelanggaran fungsiBiaya_jadwal_terbaik = new ArrayList;
private static ListJadwal permintaan = new ArrayList;
4. fungsiBiaya_jadwal_Awal, fungsiBiaya_jadwal_skrg, fungsiBiaya_jadwal
baru, fungsiBiaya_terbaik, untuk menyimpan dan menghitung pelanggaran jadwal.
5. Permintaan, yaitu untuk menyimpan jadwal permintaan.
Berikut ini adalah Algoritma Metod menetapkan jadwal awal secara random tanpa duplikat kelas matakuliah,
“TimeSlot” terhadap “Ruang” untuk mendapatkan “Kelas Matakuliah”.
1.
Algoritma Menetapkan Jadwal Awal Algoritma 3.1
1. Mulai.
2. Buat metod dengan nama MenetapkanJadwalAwal, type pengembalian
static void. 3.
Buat variable Objek baru untuk menyimpan kodetimeslot” dan
“kodeRuang” didalam list Object java. ListObject bantuSimpantimeslotRuang= new ArrayListObject;
4. Buat variable Objek baru untuk menyimpan Permintaan dalam list.
List
Jadwal
jadwal_permintaan= KontrolPermintaan.getKoneksi.getAllPermintaan;
5. Buat variable Objek baru untuk menyimpan timeslot didalam list.
List TimeSlot timeslot=
KontrolTimeSlot.getKoneksi.getAllTimeSlot; 6.
Buat variable Objek baru untuk menyimpan ruang didalam list. List
Ruang ruang = KontrolRuang.getKoneksi.getAllRuangTeori; 7.
Buat matrik 2 dimensi untuk menyimpan timeslot dan ruang sementara. String[][] matrikJadwal = new String[timeslot.size][ruang.size];
8. Untuk
i=0 sampai i sebanyak “timeslot”, lakukan, 1.
Untuk j=0 sampai j sebanyak “ruang” , lakukan -
Set matrikJadwal[i][j]= kodetimeslot, koderuang, kodewaktu dan kodehari.
-
Simpan matrikJadwal[i][j] kedalam “bantuSimpantimeslotRuang”.
Keterangan : 9.
Cek, jika jadwal permintaan tidak kosong maka, lakukan langkah berikut:
- Untuk i=0 sampai i sebanyak jadwal_permintaan, lakukan
- Buat variable Objek baru untuk menyimpan atribut solusi.
Jadwal
solusi=new
Jadwal
; -
Set semua atribut solusi dan simpan kedalam Larik jadwalAwal, solusiBaru, dan permintaann.
1. Untuk j=0 sampai j sebanyak
“bantuSimpantimeslotRuang”, lakukan
- Cek apakah kodetimeslot dan koderuang pada
“jadwal_permintaan” = kodetimeslot dan koderuang pada “bantuSimpantimeslotRuang”.
- Jika ya, maka dihapus dari “bantuSimpantimeslotRuang”.
10. Random kelasmatakuliah.
ListObject BantukodeKM = RandomKelasMatakuliah; 11.
Cek, apakah jumlah BantukodeKM = bantuSimpantimeslotRuang. 1.
Ya, Untuk i=0 sampai i sebanyak “BantukodeKM”, lakukan
- Ambil kodeKelasMatakuliah dari “bantukm” ke i
- Ambil kodeTimeslot dan koderuang dari “bantutimeslot” ke i.
- Simpan dalam Larik jadwalAwal dan jadwalBaru.
12. Selesai.
7.
Jadwal
solusi=new
Jadwal
, solusi digunakan untuk mengeset semua atribut
Jadwal
untuk disimpan kedalam jadwalAwal,jadwalBaru, dan permintaan. 8.
BantukodeKM, fungsinya untuk menyimpan satu data kelas matakuliah matakuliah hasil random.
9. ListJadwaljadwal_permintaan=KontrolPermintaan.getKoneksi.getAllPer
mintaan, fungsinya mengambil semua jadwal permintaan ke database menggunakan perintah sql kemudian dimasukan kedalam list.
10. ListTimeSlottimeslot=KontrolTimeSlot.getKoneksi.getAllTimeSlot,
fungsinya mengambil semua timeslot ke database menggunakan perintah sql kemudian dimasukan kedalam list.
11. ListRuangruang=KontrolRuang.getKoneksi.getAllRuangTeori,
fungsinya mengambil semua ruang ke database menggunakan perintah sql kemudian dimasukan kedalam list.
Sebelum membuat random jadwal awal, terlebih dahulu membuat metod random kelas matakuliah tanpa duplikat serta pengecekan dengan jadwal permintaan.
2.
Metod RandomKelasMataKuliah tanpa terjadi duplikat Algoritma 3.2.
1. Mulai.
2. Buat metod dengan nama RandomKelasMatakuliah, type pengembalian
static ListKelasMatakuliah. 3.
Buat variable Objek baru bantu untuk menyimpan kodekelasMatakuliah didalam list object java.
ListObject simpanKodeKM = new ArrayListObject; 4.
Buat variable Objek baru untuk menyimpan sementara kodekelasMatakuliah didalam list object java untuk menghindari terjadi
duplikat. ListObject randomkm = new ArrayListObject;
5. Buat variable Objek baru untuk menyimpan KelasMatakuliah didalam
list. ListKelasMatakuliah kelasMatKul =
KontrolKelasMataKuliah.getKoneksi.getAllKelasMataKuliah_Teori; Buat Object baru random.
Random random = new Random; 6.
Untuk i=0 sampai i sebanyak kelasMatKul, -
Buat objek baru dari kelasmatakuliah, “KelasMatakuliah km = new
KelasMatakuliah;” -
Set abtribut matakuliah dan simpan kedalam “randomkm”.
randomkm.addkm; 7.
Untuk i=randomkm.size-1, sampai 0, lakukan langkah berikut:
Dalam SA jika jadwal awal sudah merupakan jadwal yang optimal tidak ada terjadi pelanggaran maka yang digunakan adalah jadwal awal tersebut, tanpa
harus melakukan proses pengoptimalan lagi pencarian jadwal baru. Jika tidak 1.
Random kelasmatakuliah berdasarkan indexnya. int next_num = random.nextIntrandomkm.size;
2. Ambil kodekelasmatakuliah pada index tersebut.
- Buat objek baru dari kelasmatakuliah,
KelasMatakuliah km = new KelasMatakuliah; -
Set abtribut matakuliah sesuai index hasil random. “km.setKodeKMrandomKm.getnext_num.getKodeKM;”
3. Simpan kedalam “simpanKodeKM”.
simpanKodeKM.addkm; 4.
Hapus kodekelasmatakuliah tersebut dari “randomkm”. randomKm.removerandomkm.getnext_num;
8. Cek, jika jadwal permintaan tidak kosong maka, lakukan langkah
berikut: -
Untuk i=0 sampai i sebanyak jadwal_permintaan, lakukan 1.
Untuk j=0 sampai j sebanyak simpanKodeKM, lakukan -
Cek apakah kodekelasMatakuliah pada “jadwal_permintaan” = kodekelasmatakuliah pada “simpanKodeKM”.
- Jika ya, maka dihapus dari “simpanKodeKM”.
9. Kembalikan simpanKodeKM.
10. Selesai.
maka buat inisialisasi jadwal_sekarang dari jadwal_awal, jadwal_terbaik dari jadwal_sekarang. Begitu juga simpan fungsi biaya jadwal_sekarang dari fungsi
biaya jadwal awal dan fungsiBiaya_terbaik dari jadwal_sekarang. Menghitung
fungsiBiaya_jadwal_awal menggunakan Algoritma 3.9 sampai Algoritma 3.13.
1.
Buat inisialisasi jadwal_sekarang dari jadwal_awal Algoritma 3.3.
2.
Buat inisialisasi JadwalTerbaik dari jadwal_sekarang Algoritma 3.4.
1. Mulai
2. Buat metod dengan nama inisialisasiJadwalSkrg_dari_JadwalAwal, dengan
tipe pengembalian static void. 3.
Untuk i=0, sampai i sebanyak jadwal_awal.
Jadwal
solusi=new
Jadwal
. Sett atribut
Jadwal
dari solusi_awal ke i jadwal_sekarang.addsolusi
4. Untuk i=0, sampai i sebanyak fungsiBiaya_jadwal_awal
Sett atribut
Jadwal
dari fungsiBiaya_jadwal_awal ke i fungsiBiaya_ jadwal_sekarang.addsolusi
5. Selesai.
3.2.2. Menetapkan Temperatur Awal, Nilai Reduksi Suhu, dan Jumlah Iterasi.