BAB V PENUTUP
5.2 Saran
Berdasarkan hasil pembuatan model penjadwalan dengan menggunakan metode algoritma genetika dapat diberikan saran yaitu :
1. Diharapkan pada penelitian ini kedepannya program lebih lengkap daripada sebelumnya seperti menambah jumlah peminat dan juga ruangan untuk setiap mata kuliah ditentukan seperti untuk mata kuliah wajib semua menempati ruangan yang memiliki kapasitas ruangan yang besar karena pasti jumlah peminat lebih banyak dari jumlah peminat kuliah wajib konsentrasi
2. Pada pengujian yang dilakukan pada penelitian ini masih membedakan program yang 3 sks dan 2 sks, dan untuk keluaran jadwalnya masih harus dikeluarkan secara manual, dan untuk saran kedepannya untuk penelitian selanjutnya program memerhatikan bobot matakuliah sehingga tidak perlu lagi banyak program. Dan juga mengeluarkan keluarannya secara otomatis menjadi bentuk jadwal yang ada di Jurusan Teknik Elektro universitas Mataram tidak perlu lagi untuk mengeluarkan secara manual.
3. Diharapkan pada penelitian ini kedepan menjadi awal untuk membuat aplikasi penjadwalan perkuliahan di Jurusan Teknik Elektro Universitas Mataram .
43
DAFTAR PUSTAKA
Akademi Zane, 18 Juli 2019. Genetic Algorithms class scheduling with python Tutorial (Online) (https://www.youtube.com/watch?v=8NrNX_jCkjw, Diakses 3 Februari 2020) Aria, Muhammad. (2006). Aplikasi algoritma genetik untuk optimasi penjadwalan mata kuliah. Universitas Komputer Indonesia.
Aziz, Muliadi. (2017). Pemodelan Algoritma Genetika Pada Sistem Penjadwalan Perkuliahan Prodi Ilmu Komputer Universitas Lambung mangkurat, Jurnal Ilmu Komputer 1(1), 67-79.
Basuki, Achmad. (2003). Strategi menggunakan algoritma genetika. Tersedia di
http://lecturer. eepisits. edu/~ basuki/lecture/StrategiAlgoritmaGenetika. Pdf (diakses 29 Mei 2020).
Buliali, Joko. Lianto., Herumurti, Darlis., & Wiriapradja, Giri. (2008). Penjadwalan Matakuliah dengan Menggunakan Algoritma Genetika dan Metode Constraint Satisfaction. JUTI: Jurnal Ilmiah Teknologi Informasi, 7(1), 29-38.
Damayanti, Chusnah. P., Putri, Rekyan. Regasari. M., & Fauzi, Mochammad. A.
(2017). Implementasi Algoritma Genetika Untuk Penjadwalan Customer Service (Studi Kasus: Biro Perjalanan Kangoroo). Jurnal Pengembangan Teknologi Informasi dan Ilmu Komputer e-ISSN, 2548, 964X.
Ferawati, Evi, (2010), Optimasi Penjadwalan Mata Kuliah Di Perguruan Tinggi Menggunakan Algoritma Genetika, Depok : Universitas Indonesia
Janata, A., & Haerani, E. (2015). Sistem Penjadwalan Outsourcing Menggunakan Algoritma Genetika (Studi Kasus: PT. Syarikatama). Jurnal CoreIT: Jurnal Hasil Penelitian Ilmu Komputer dan Teknologi Informasi, 1(1), 17-24.
Josi, Ahmat. (2017). Implementasi Algoritma Genetika Pada Aplikasi Penjadwalan Perkuliahan Berbasis Web Dengan Mengadopsi Model Waterfall (Studi Kasus: STMIK Prabumulih). Jurnal Informatika: Jurnal Pengembangan IT, 2(2), 77-83.
Nugraha, Ivan. (2008). Aplikasi Algoritma Genetik Untuk Optimasi Penjadwalan Kegiatan Belajar Mengajar. Bandung: Institut Teknologi Bandung.
44 Putra, I Made S, (2018), Penerapan Algoritma Genetika dan Implementasi Dalam
Matlab, Bali: Universitas Udayana
Silitonga, Parasian. D., & Pasaribu, Natal. P. (2016). Optimasi Penjadwalan Mata Kuliah Fakultas Ilmu Komputer Universitas Katolik Santo Thomas Sumatera Utara Dengan Menggunakan Algoritma Genetika. Jurnal Teknik Informatika UNIKA Santo Thomas, 1(2), 7-12.
45
LAMPIRAN
46 Lampiran 1. Jadwal Hasil Program Algoritma Genetika
47 Lampiran 2. Source Code Python algoritma genetika
class GeneticAlgorithm:
# Fungsi evolusi
def evolve(self, population): return
self._mutate_population(self._crossover_population(population))
# Fungsi crossover populasi
def _crossover_population(self, pop):
crossover_pop = Population(0)
for i in range(NUMB_OF_ELITE_SCHEDULES):
crossover_pop.get_schedules().append(pop.get_schedules()[i]) i = NUMB_OF_ELITE_SCHEDULES
while i < POPULATION_SIZE:
schedule1 = self._select_tournament_population(pop).get_schedules()[0]
schedule2 = self._select_tournament_population(pop).get_schedules()[0]
crossover_pop.get_schedules().append(self._crossover_schedule(schedule1, schedule2))
i += 1
return crossover_pop
# Fungsi mutasi populasi
def _mutate_population(self, population):
for i in range(NUMB_OF_ELITE_SCHEDULES, POPULATION_SIZE):
self._mutate_schedule(population.get_schedules()[i]) return population
# Fungsi crossover jadwal
def _crossover_schedule(self, schedule1, schedule2):
crossoverSchedule = Schedule().initialize()
for i in range(0, len(crossoverSchedule.get_classes())):
if (rnd.random() > 0.5): crossoverSchedule.get_classes()[i] = schedule1.get_classes()[i]
else: crossoverSchedule.get_classes()[i] = schedule2.get_classes()[i]
48
return crossoverSchedule
# Fungsi mutasi jadwal
def _mutate_schedule(self, mutateSchedule):
schedule = Schedule().initialize()
for i in range(0, len(mutateSchedule.get_classes())):
if(MUTATION_RATE > rnd.random()): mutateSchedule.get_classes()[i] = schedule.get_classes()[i]
return mutateSchedule
def _select_tournament_population(self, pop):
tournament_pop = Population(0) i = 0
while i < TOURNAMENT_SELECTION_SIZE:
tournament_pop.get_schedules().append(pop.get_schedules()[rnd.randrange(0, POPULATION_SIZE)])
i += 1
tournament_pop.get_schedules().sort(key=lambda x: x.get_fitness(), reverse=True)
return tournament_pop
Lampiran 3. Source Code Python Menghitung Nilai Fitness algoritma genetika
def calculate_fitness(self):
# Kondisi awal adalah jumlah konflik nya 0 self._numbOfConflicts = 0
# Mengambil semua kelas classes = self.get_classes()
# Mengolah setiap kelas untuk mendapatkan nilai konflik yang langsung
49
dihitung jadi fitness
for i in range(0, len(classes)):
# Konflik + 1 jika kapasitas kelas kurang dari jumlah mahasiswa pada mata kuliah tersebut
# if (classes[i].get_room().get_seatingCapacity() <
classes[i].get_course().get_maxNumbOfStudents()):
# self._numbOfConflicts += 1
# Melakukan pengecekan ke konflik selanjutnya for j in range(0, len(classes)):
if (j >= i):
# Melakukan pengecekan apakah waktu pertemuan (Hari dan waktu) nya sama, dan kelas nya berbeda
if (classes[i].get_meetingDay() == classes[j].get_meetingDay() and
classes[i].get_meetingTime() == classes[j].get_meetingTime() and
classes[i].get_id() != classes[j].get_id()):
# Jika ruangannya sama maka konflik + 1
if (classes[i].get_room() == classes[j].get_room()):
self._numbOfConflicts += 1
# Jika dosennya sama maka konflik + 1 if (classes[i].get_instructor() ==
classes[j].get_instructor()):
self._numbOfConflicts += 1 def __str__(self):
returnValue = ""
for i in range(0, len(self._classes)-1):
returnValue += str(self._classes[i]) + ", "
returnValue += str(self._classes[len(self._classes)-1]) return returnValue
class Population:
def __init__(self, size):
self._size = size self._data = data self._schedules = []
50
self._lschedules = []
for i in range(0, size):
sample = Schedule().initialize() self._schedules.append(sample)
def get_schedules(self): return self._schedules def get_lschedules(self): return self._lschedules
Lampiran 4. Source Code Python Getter dan Setter
def get_id(self): return self._id
def get_dept(self): return self._dept def get_course(self): return self._course
def get_instructor(self): return self._instructor def get_meetingTime(self): return self._meetingTime def get_meetingDay(self): return self._meetingDay def get_room(self): return self._room
def set_instructor(self, instructor): self._instructor = instructor def set_meetingTime(self, meetingTime): self._meetingTime = meetingTime def set_meetingDay(self, meetingDay): self._meetingDay = meetingDay def set_room(self, room): self._room = room
def __str__(self):
return str(self._dept.get_name()) + "," \
+ str(self._course.get_number()) + "," \ + str(self._room.get_number()) + "," \ + str(self._instructor.get_id()) + "," \ + str(self._meetingTime.get_id()) + "," \ + str(self._meetingDay.get_id())
51 Lampiran 5. Source Code Python Tampilkan Populasi
class DisplayMgr:
def __init__(self):
self.MATA_KULIAH = MATA_KULIAH def print_available_data(self):
print("> Deklarasikan semua data") self.print_dept()
self.print_course() self.print_room()
self.print_instructor() self.print_meeting_times() self.print_meeting_days() def print_dept(self):
depts = data.get_depts()
availableDeptsTable = prettytable.PrettyTable(['dept', 'courses'])
def print_course(self):
availableCoursesTable = prettytable.PrettyTable(['id', 'course #', 'max # of students', 'instructors'])
courses = data.get_courses()
def print_generation(self, population):
table1 = prettytable.PrettyTable(['schedule #', 'fitness', '# of conflicts'])
schedules = population.get_schedules()
def print_schedule_as_table(self, schedule):
classes = schedule.get_classes()
table = prettytable.PrettyTable(['Class #', 'Dept', 'Course (number, max # of students)', 'Room (Capacity)'])
def print_result(self, population):
# table = prettytable.PrettyTable(['Jadwal']);
schedules = population.get_schedules()
52
for i in range(0, len(schedules)):
print("Populasi ke : #"+str(i)+" Memiliki fitness sebesar "+
str(round(schedules[i].get_fitness(), 3)))
if (schedules[i].get_fitness() == 1):
table = prettytable.PrettyTable(['No' , 'MK', 'Ruang', 'Dosen', 'Jam', 'Hari']);
# Memisahkan jadwal
schedulesa = str(schedules[i]).split(" ") # Memisahkan kolom
# Kelas, MK, Ruang, Dosen, Jam for i in range(0, len(schedulesa)):
schedulesb = str(schedulesa[i]).split(",")
# schedules[0] dihilangkan karena tidak pakai kelas
53 Lampiran 5. Source Code Python Menginialisasi Kode
data = Data()
displayMgr = DisplayMgr()
displayMgr.print_available_data() generationNumber = 0
print("\n> Generation # " + str(generationNumber)) population = Population(POPULATION_SIZE)
population.get_schedules().sort(key=lambda x: x.get_fitness(), reverse=True) displayMgr.print_generation(population)
displayMgr.print_schedule_as_table(population.get_schedules()[0]) geneticAlgorithm = GeneticAlgorithm()
while (population.get_schedules()[0].get_fitness() != 1.0):
generationNumber += 1
print("\n>Generation # " + str(generationNumber)) population = geneticAlgorithm.evolve(population)
population.get_schedules().sort(key=lambda x: x.get_fitness(), reverse=True) displayMgr.print_generation(population)
displayMgr.print_schedule_as_table(population.get_schedules()[0])
# displayMgr.print_result(population) displayMgr.print_result(population) print("\n\n")