A-1 LAMPIRAN A : LISTING PROGRAM
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package genetiktest; import java.sql.ResultSet; import java.util.Vector; import java.math.*; public class GenetikTest {
static int maxRoom = 7; static int maxDay = 5; static int maxHour = 5;
static int maxPopulation = 200; static int currentPopulation = 0; static KoneksiDB con; static Vector<Timetable> tableVector = new Vector<Timetable>(); static Vector
dosenVector = new Vector(); static Vector<Jadwal> jadwalVector = new Vector<Jadwal>(); static Vector<MataKuliah> mkVector = new Vector<MataKuliah>(); static Vector ruangVector = new Vector(); static boolean[][][][] lecturerAvailable; public static void main(String[] args) {
con = new KoneksiDB();
Universitas Sumatera Utara
A-2 try { con.startConnection(); ResultSet rs; // Mengambil data dosen dari database rs = con.executeQuery("SELECT * FROM dosen"); Dosen dosen = new Dosen();
while ( rs.next() ) { dosen = new Dosen(); int numColumns = rs.getMetaData().getColumnCount();
dosen.nidn = (String)rs.getObject(1); dosen.nama = (String)rs.getObject(2);
dosenVector.add(dosen); }
// Mengambil data jadwal dari database rs = con.executeQuery("SELECT * FROM jadwal"); Jadwal jadwal = new Jadwal();
while ( rs.next() ) { int numColumns = rs.getMetaData().getColumnCount();
jadwal.idJadwal = Integer.valueOf(rs.getObject(1).toString()); jadwal.hari = (String)rs.getObject(2); }
Universitas Sumatera Utara
A-3 // Mengambil data mata kuliah dari database rs = con.executeQuery("SELECT * FROM mata_kuliah"); MataKuliah mk;
while ( rs.next() ) { int numColumns = rs.getMetaData().getColumnCount();
mk = new MataKuliah();
mk.idMk = Integer.valueOf(rs.getObject(1).toString()); mk.kodeMk = rs.getObject(2).toString(); mk.kelompok = Integer.valueOf(rs.getObject(3).toString()); mk.nama = rs.getObject(4).toString(); mk.sks = Integer.valueOf(rs.getObject(5).toString()); mk.semester = Integer.valueOf(rs.getObject(6).toString()); mk.nidn = rs.getObject(7).toString();
mkVector.add(mk); }
// Mengambil ruangan dari database rs = con.executeQuery("SELECT * FROM ruangan"); Ruangan ruang = new Ruangan();
while ( rs.next() ) { ruang.idRuangan = Integer.valueOf(rs.getObject(1).toString()); ruang.namaRuangan = rs.getObject(2).toString(); }
Universitas Sumatera Utara
A-4
con.closeConnection(); } catch (Exception e) { System.out.println(e); } // simulate the lecturer availability since it's hard to collect this // data in real life simulateAvailability(); //
membuat populasi awal dengan memanggil method populate()
populate();
int genNum = 0; while (tableVector.get(0).cost > 0) { System.out.print ("Generation # " + genNum + " -> "); System.out.println("Best cost: " + tableVector.get(0).cost);
float avgCost = 0.0f; float totalCost = 0.0f; for(int i = 0; i < maxPopulation; i++) { totalCost += tableVector.get(i).cost; }
avgCost = totalCost / maxPopulation; System.out.println("AverageCost: " + avgCost);
System.out.println("===================================="); System.out.println(); System.out.println();
Universitas Sumatera Utara
A-5
// do this part until best population (at 0 index) is greater than zero // might be too long to meet this condition killCostlyPopulation(); while (tableVector.size() < maxPopulation) {
// create a new timetable for a new breed Timetable newBreed = new Timetable();
// add it to vector tableVector.add(newBreed);
// the index of the new breed which is basically the last item int newBreedIndex = tableVector.size() - 1;
// picking up two timetable and put it a the newly created timetable //seleksi tournament ( awal) breedPopulation(newBreedIndex);
mutateBreed(newBreedIndex);
forceRule2(newBreedIndex); forceRule1(newBreedIndex);
evaluateSoftRule1(newBreedIndex); evaluateSoftRule2(newBreedIndex); //attemptFixSlot(newBreedIndex);
sortNewBreed(newBreedIndex);
Universitas Sumatera Utara
A-6 } genNum++; }
for (int i = 0; i < tableVector.size(); i++) { printTable(i); }
Timetable bestTable = tableVector.get(0);
con = new KoneksiDB();
// start filling the database try {
con.startConnection();
ResultSet rs; String query;
int idMk = 0; for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) {
Universitas Sumatera Utara
A-7 if (bestTable.timetable[a][b][c] != -1) { idMk = bestTable.timetable[a][b][c]; query = "INSERT INTO kelas (id_mk, ruangan, hari, jam) " + "values (" + idMk + ", " + a + ", " + b + ", " + c + ")"; System.out.println(query); con.executeUpdate(query); }
} } } } catch (Exception e) { System.out.println(e); }
}
// mengisi populasi awal pada program. metode ini hanya dipanggil sekali. static void populate() {
Timetable t; // membuat timetable sebanyak populasi maksimal yang ditentukan oleh user. // variabel yang menyimpan populasi maksimal disebut maxPopulation for (int i = 0; i < maxPopulation; i++) {
Universitas Sumatera Utara
A-8 // membuat timetable sementara dalam bentuk array int[][][] slotsArray = new int[maxRoom][maxDay][maxHour]; for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { // mengisi -1 sebagai id dari kuliah pada slot tersebut, // yang berarti slot tersebut belum dibook oleh satu kuliah slotsArray[a][b][c] = -1; } } }
t = new Timetable(); t.timetable = slotsArray;
tableVector.add(t);
// Rule 1: setiap matakuliah tidak boleh dibook 2 kali pada satu minggu // method forceRule1 memaksa setiap timetable yang baru dibentuk tidak // melanggar aturan pertama forceRule1(i);
// soft rule digunakan untuk menilai kualitas sebuah table.
Universitas Sumatera Utara
A-9 // timetable yang baru dievaluasi dengan memanggil 2 method di bawah ini evaluateSoftRule1(tableVector.size()-1); evaluateSoftRule2(tableVector.size()-1);
if (i > 0) { int sortIndex = i;
while(sortIndex > 0 && tableVector.get(sortIndex).cost < tableVector.get(sortIndex-1).cost) { swapBooking(sortIndex, sortIndex-1); sortIndex--; } }
} }
// Method ini digunakan agar timetable tertentu memenuhi aturan pertama static void forceRule1(int tableIndex) { int occured; MataKuliah mk;
Timetable table = tableVector.get(tableIndex);
for (int i = 0; i < mkVector.size(); i++) { occured = 0;
Universitas Sumatera Utara
A-10 mk = mkVector.get(i);
for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { if (table.timetable[a][b][c] == mk.idMk) { occured++; } } } }
if (occured == 0) { int room, day, hour;
while (occured == 0) { room = getRandomInteger(maxRoom); day = getRandomInteger(maxDay); hour = getRandomInteger(maxHour);
if (table.timetable[room][day][hour] == -1) { table.timetable[room][day][hour] = mk.idMk; occured++; }
Universitas Sumatera Utara
A-11 } } }
}
// Aturan 2: tidak boleh ada 2 pelajaran yang mengambil 2 slot jadwal. Artinya // satu pelajaran hanya boleh berlangsung sekali pada satu minggu static void forceRule2(int tableIndex) { int occured; MataKuliah mk; Timetable table = tableVector.get(tableIndex);
// karena setiap anak hanya dapat dihasilkan oleh 2 parent, dengan asumsi // tidak ada pelajaran yang berulang pada sebuah parent, maka pada setiap // anak, sebuah pelajaran dapat berulang maksimal 2 kali Booking[][] occurenceList = new Booking[mkVector.size()][2]; int[] occurenceQty = new int[mkVector.size()]; Vector emptySlotList = new Vector();
Booking newBook;
for (int i = 0; i < mkVector.size(); i++) { occurenceQty[i] = 0; }
for (int i = 0; i < mkVector.size(); i++) {
Universitas Sumatera Utara
A-12 occured = 0; mk = mkVector.get(i);
for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { if (table.timetable[a][b][c] == mk.idMk) {
newBook = new Booking(); newBook.room = a; newBook.day = b; newBook.hour = c;
occurenceList[i][occurenceQty[i]] = newBook;
occurenceQty[i]++;
} } } } if (occurenceQty[i] > 1) { if (getRandomFloat(2.0f) > 1) { emptySlotList.add(occurenceList[i][0]); } else { emptySlotList.add(occurenceList[i][1]);
Universitas Sumatera Utara
A-13 } } }
int room, day, hour; for (int i = 0; i < emptySlotList.size(); i++) { room = emptySlotList.get(i).room; day = emptySlotList.get(i).day; hour = emptySlotList.get(i).hour;
table.timetable[room][day][hour] = -1; } }
// Metode ini bertugas untuk "membunuh" jadwal yang memiliki nilai cost // tertinggi. Pada program ini, jumlah gen yang dibunuh sebanyak setengah dari // total populasi static void killCostlyPopulation() { int tableHalfSize = (int)((tableVector.size()*1.0)/2.0);
for(int i = tableVector.size() - 1; i >= tableHalfSize; i--) { tableVector.remove(i); }
}
Universitas Sumatera Utara
A-14 // Metode ini bertugas untuk menghasilkan gen baru untuk mengisi populasi jadwal. // Metode ini dipanggil setelah 1/2 dari populasi database dihilangkan (oleh // metode killCostlyPopulation). static void breedPopulation(int index) {
// Pembentukan gen baru dilakukan dengan mengambil 2 buah gen sebagai 'ayah' // dan 'ibu'. int fatherIndex = getRandomInteger(tableVector.size()); int motherIndex = getRandomInteger(tableVector.size());
Timetable father = tableVector.get(fatherIndex); Timetable mother = tableVector.get(motherIndex);
Timetable newBreed = tableVector.get(index);
// gen jadwal baru disusun dari salah satu jadwal (ayah atau ibu) yang // diambil secara random. for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { if (getRandomInteger(2) >= 1) { newBreed.timetable[a][b][c] = father.timetable[a][b][c]; }
Universitas Sumatera Utara
A-15 else { newBreed.timetable[a][b][c] = mother.timetable[a][b][c]; } } } }
}
// mutasi gen baru dengan melakukan perubahan-perubahan minor. // Tingkat banyak tidaknya mutasi dapat diubah. // Semakin tinggi tingkat mutasi, semakin banyak perubahan jadwal yang terjadi // pada gen anak static void mutateBreed(int index) {
int tempLectureId = 0; int newRoom, newDay, newHour;
Timetable newBreed = tableVector.get(index); for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { // sample mutation rate,, 32 yg di naikkan, 16, 32, 64,, naik2 64 if(getRandomInteger(1000) < 16) {
Universitas Sumatera Utara
A-16 tempLectureId = newBreed.timetable[a][b][c];
newRoom = getRandomInteger(maxRoom); newDay = getRandomInteger(maxDay); newHour = getRandomInteger(maxHour);
newBreed.timetable[a][b][c] = newBreed.timetable[newRoom][newDay][newHour]; newBreed.timetable[newRoom][newDay][newHour] = tempLectureId; } } } } }
static Float calculateCost(int index) { // costVector.insertElementAt(new Float(Math.random()), index); Float returnVal = new Float(Math.random()); //System.out.println(returnVal.floatValue()); return new Float(Math.random()); }
static int getRandomInteger(int maxValue) { return (int)(Math.random() * maxValue); }
Universitas Sumatera Utara
A-17
static float getRandomFloat(float maxValue){ return (float)Math.random() * maxValue; }
static void swapBooking(int to, int from) { tableVector.add(to, tableVector.remove(from)); }
// soft rule 1: setiap dosen hanya dapat mengajar 1 pelajaran pada waktu yang // sama static void evaluateSoftRule1(int index) { boolean booked = false; String nidn; String mkNidn = ""; int idMk;
int[] occurenceList = new int[dosenVector.size()];
Booking[][] lecturerBookList = new Booking[dosenVector.size()][10];
Timetable table = tableVector.get(index);
for (int i = 0; i < dosenVector.size(); i++) { mkNidn = "-"; nidn = dosenVector.get(i).nidn;
Universitas Sumatera Utara
A-18
for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { idMk = table.timetable[a][b][c]; for (int j = 0; j < mkVector.size(); j++) { if (mkVector.get(j).idMk == idMk) { mkNidn = mkVector.get(j).nidn; j = mkVector.size(); } }
if(!mkNidn.equals("-") && nidn.equals(mkNidn)) { //System.out.println(idMk + " " + nidn + " " + mkNidn + " " + occurenceList[i]); mkNidn = "-"; lecturerBookList[i][occurenceList[i]] = new Booking(a, b, c); occurenceList[i]++; } } } } }
for (int i = 0; i < dosenVector.size(); i++)
Universitas Sumatera Utara
A-19 { //System.out.println(occurenceList[i]); if (occurenceList[i] > 1) { //System.out.println("occurence happened"); for(int j = 0; j < occurenceList[i]; j++) { for(int k = j; k < occurenceList[i]; k++) { if (j == k) continue; try { if (lecturerBookList[i][j].compareTime(lecturerBookList[i][k])) { table.cost += 10; } } catch (Exception e) { System.out.println ("error"); }
} } } } }
// Metode ini digunakan untuk menghitung harga dari satu tabel dengan mencari // pelajaran ynag terletak pada slot yang tidak sesuai dengan daftar ketersediaan // pengajar static void evaluateSoftRule2(int index) {
Universitas Sumatera Utara
A-20 String mkNidn = ""; String nidn = ""; int idMk;
Timetable table = tableVector.get(index);
for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { idMk = table.timetable[a][b][c];
// search the lecturer for the lecture for (int j = 0; j < mkVector.size(); j++) { if (mkVector.get(j).idMk == idMk) { mkNidn = mkVector.get(j).nidn; j = mkVector.size(); } }
if (mkNidn != "-") { for (int j = 0; j < dosenVector.size(); j++) {
Universitas Sumatera Utara
A-21 if (dosenVector.get(j).nidn.equals(mkNidn)) { if(lecturerAvailable[j][a][b][c]) { table.cost += 5.0f; }
j = mkVector.size(); } } } // search the index of the lecturer
} } } }
// this method is used to fix the table by forcing each lecture to be booked // exactly by the number of slot used by the lecture // this method DOES NOT FILL THE SLOT, instead it only checked the sorrounding // slot of a lecture and check if it is possible to fulfill the lecture requirement
static void attemptFixSlot(int index) { int idMk; Timetable table = tableVector.get(index); float totalSksCost = 0.0f; // copy the timetable to a temporary array so we dont change the original
Universitas Sumatera Utara
A-22 // timetable int[][][] tempTimetable = new int[maxRoom][maxDay][maxHour]; for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { tempTimetable[a][b][c] = table.timetable[a][b][c]; } } }
int sks = 0;
for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { idMk = table.timetable[a][b][c]; if (idMk == -1) continue; // search the lecturer for the lecture for (int j = 0; j < mkVector.size(); j++) { if (mkVector.get(j).idMk == idMk) { sks = mkVector.get(j).sks; j = mkVector.size();
Universitas Sumatera Utara
A-23 } } int sksLeft = sks - 1; // first try to fill the slot after the current slot for (int k = 0; k < sks; k++) { if (c+k < maxHour && tempTimetable[a][b][c+k] == -1 && sksLeft > 0) { tempTimetable[a][b][c+k] = idMk; sksLeft--;
//System.out.println("Attempt to go forward success " + sksLeft); } }
for (int k = 0; k < sks; k++) { if (c-k > 0 && tempTimetable[a][b][c-k] == -1 && sksLeft > 0) {
tempTimetable[a][b][c-k] = idMk; sksLeft--;
//System.out.println("Attempt to go backward success " + sksLeft); } }
Universitas Sumatera Utara
A-24 // if there is sks left then it will add to the cost of the current // timetable
if (sksLeft == 0) { //System.out.println("Succesfully 0"); }
totalSksCost += 5 * sksLeft;
// if there's still sks left and } } } //System.out.println(totalSksCost); table.cost += totalSksCost; }
// mengurutkan populasi agar populasi dengan cost terkecil terletak pada awal // list dan cost terbesar pada akhir populasi static void sortNewBreed(int index) { while(index > 0 && tableVector.get(index).cost < tableVector.get(index-1).cost) { swapBooking(index, index-1); index--; }
Universitas Sumatera Utara
A-25 }
static void printTable(int tableIndex) { System.out.println(); System.out.println(); System.out.println(); System.out.println("Printing Table " + tableIndex); System.out.println("Cost = " + tableVector.get(tableIndex).cost); Timetable table = tableVector.get(tableIndex); int counter = 0; for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { if(table.timetable[a][b][c] != -1) { System.out.print(table.timetable[a][b][c] + " "); } if (table.timetable[a][b][c] != -1) { counter++; } } } }
System.out.println("End of printing table " + tableIndex);
Universitas Sumatera Utara
A-26 System.out.println(); System.out.println(); } // metode ini untuk mensimulasikan ketersediaan dosen untuk mengajar. // dalam program ini, data ketersediaan dosen diisi secara acak static void simulateAvailability() { lecturerAvailable = new boolean[dosenVector.size()][maxRoom][maxDay][maxHour]; for (int i = 0; i < dosenVector.size(); i++) { for (int a = 0; a < maxRoom; a++) { for (int b = 0; b < maxDay; b++) { for (int c = 0; c < maxHour; c++) { // sample if (getRandomFloat(2.0f) > 0.25) { //System.out.println("lecturer IS available"); lecturerAvailable[ i][a][b][c] = true; } else { //System.out.println("lecturer NOT available"); lecturerAvailable[i][a][b][c] = false; } } } } }}}
Universitas Sumatera Utara
B-1 CURRICULUM VITEA Nama
: Martinelly Sembiring
Tempat/Tanggal Lahir
: Sembahe/ 17 Maret 1991
Alamat
: Jalan Jamin Ginting Gang Bakti No 99 (Depan SMPN-1
P.Batu) Pancur Batu, DS Agama
: Kristen Protestan
Status
: Mahasiswa
Alamat Email
: [email protected]
No. HP
: 085372015809
Pendidikan Terakhir
: SMA
PENDIDIKAN FORMAL 2006-2009
SMA Methodist-AN Pancur batu
2003-2006
SMP Methodst –AN Pancur batu
1997-2003
SD Bakti Pancur batu
SEMINAR ,KURSUS 2013
Peserta Seminar Nasional Kongres Nasional Ikatan Lembaga Penalaran dan Penelitian Mahasiswa Indonesia.
2011
Kursus Bahasa Inggris Yayasan Pengembangan Persahabatan Indonesia-Amerika
PENGALAMAN ORGANISASI 2011 2009 2007
Anggota Seksi Kesehatan PMB(Peneriamaan Mahasiswa Baru) Anggota IMILKOM (Ikatan Mahasiswa Ilmu Komputer) Anggota OSIS SMA Methodist-An Pancur Batu
Universitas Sumatera Utara