-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathfitnessfunction.java
More file actions
379 lines (331 loc) · 11.3 KB
/
Copy pathfitnessfunction.java
File metadata and controls
379 lines (331 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
//Author = Wiega
import java.util.Scanner;
import java.io.*;
import java.util.List;
public class fitnessfunction{
public int cToI(char c) {
return (int) c - (int) 'a';
}
public char iToC(int i) {
return (char) (i + (int) 'a');
}
public String[] pisahstring(String str){
/* Memisahkan string panjang yang berisi daftar kelas beserta
* hari, jam mulai, selesai menjadi array yang berisi string
* dengan format
* iHms | iHms | iHms | ...
* dengan rincian:
* i = index matkul (a-z)
* H = hari dalam angka
* m = jam mulai (a-z) a:7, b:8, dst
* s = jam selesai (a-z) idem atas
*/
//inisisalisasi tabJadwal
String[] tabJadwal = new String [20];
for (int i=0; i<20; i++){
tabJadwal[i] = "";
}
//pisah string empat empat ke tabJadwal
int a = str.length();
int j=0;
int k=0;
String strtemp = "";
if ((a % 4)==0) { //string kelipatan 4
for (int i=0; i<a; i++){
if (j>3){
j=0;
tabJadwal[k]=strtemp;
strtemp = "";
k++;
}
strtemp.concat(Character.toString(str.charAt(i)));
j++;
}
} else {
//string salah, harus kelipatan 4
//tabJadwal kosong
}
return tabJadwal;
}
public float hitungFitnessFunction(String str){
/* Menghitung fitnessfunction dengan sebelumnya mengecek
* terjadinya bentrok matkul pada hari dan jam yang sama
* yaitu dengan mencatat matkul apa saja yang ada pada hari
* yang sama dengan menempatkannya pada matriks sbg berikut:
* baris menandakan hari
* kolom menandakan index matkul pada hari tsb
*/
if ((str.length() % 4) == 0){
String[] tabString = pisahstring(str);
//inisialisasi tabHariSama
String[][] tabHariSama = new String [5][5];
for (int x=0; x<5; x++){
for (int y=0; y<5; y++){
tabHariSama[x][y] = "";
}
}
//mengisi tabHariSama
String strtemp = "";
int idxBrsHariSama = 0;
int idxKolHariSama;
for (char idxHari='a'; idxHari<='e'; idxHari++){
idxKolHariSama = 0;
for (int i=0; i< tabString.length; i++){
strtemp = tabString[i];
if (strtemp.charAt(1) == idxHari){ //mengecek kelas pada hari yg sama
tabHariSama[idxBrsHariSama][idxKolHariSama] = strtemp;
idxKolHariSama++;
}
}
idxBrsHariSama++;
}
//Mengecek terjadinya bentrok berdasar tabHariSama
String strtemp1 = "";
int countBentrok = 0;
int idxc;
for (int idxa=0; idxa<5; idxa++){
for(int idxb=0; idxb<5; idxb++){
strtemp = tabHariSama[idxa][idxb];
idxc=idxb+1;
while (idxc<5){
strtemp1 = tabHariSama[idxa][idxc];
if (( (strtemp.charAt(2)==strtemp1.charAt(2)) || //kedua kelas mulai pada jam sama
(strtemp.charAt(3)==strtemp1.charAt(3)) || //kedua kelas selesai pada jam sama
(strtemp.charAt(2)>strtemp1.charAt(2) && strtemp.charAt(2)<strtemp1.charAt(3)) || //kelas 1 mulai saat kelas 2 berlangsung
(strtemp.charAt(3)>strtemp1.charAt(2) && strtemp.charAt(3)<strtemp1.charAt(3))) //kelas 2 mulai saat kelas 1 berlangsung
&&
isSameRoom(strtemp,strtemp1)) { //kedua kelas pada ruangan yang sama
countBentrok++;
}
idxc++;
}
}
}
//mengembalikan nilai fitness function yaitu 1/countBentrok
if (countBentrok == 0){ //tidak ada yg bentrok, menghindari infinite
return 999;
} else {
return (1 / countBentrok);
}
} else {
return -999; //error string tidak kelipatan 4
}
}
public boolean isSameRoom(String s1, String s2){
/* mengembalikan nilai kebenaran apakah kedua kelas berada
* pada ruangan yang sama
*/
return (s1.charAt(0) == s2.charAt(0));
}
public String[] crossOver(String str1, String str2){
/* melakukan crossover antara dua string jadwal kuliah
* yang menghasilkan pertukaran jadwal secara parsial
* dengan memecah secara random
*/
//dua penyimpan sementara hasil crossover
String strtemp = "";
String strtemp1 = "";
//random batas split
int nSplit = (int )(Math.random() * (str1.length() - 1));
//menghasilkan anak 1
for (int i=0; i<=((nSplit+1)*4); i++){
strtemp.concat(Character.toString(str1.charAt(i)));
}
for (int i=((nSplit+1)*4)+1; i<str2.length(); i++){
strtemp.concat(Character.toString(str2.charAt(i)));
}
//menghasilkan anak 2
for (int i=0; i<=((nSplit+1)*4); i++){
strtemp1.concat(Character.toString(str2.charAt(i)));
}
for (int i=((nSplit+1)*4)+1; i<str1.length(); i++){
strtemp1.concat(Character.toString(str1.charAt(i)));
}
//menggabungkan kedua anak pada array of string
String[] tabResult = new String[2];
tabResult[0] = strtemp;
tabResult[1] = strtemp1;
return tabResult;
}
public float hitungPersentasiIsi(List<Ruangan> lRuang,String str){
String[] tabJadwal = pisahstring(str);
int idxa;
int idxb;
int idxHari;
int idxJam;
int idxJamSelesai;
int sizeHari;
int valHari;
int countSlot = 0;
int countUsed = 0;
String strtemp = "";
boolean isKetemu;
for (idxa = 0; idxa < lRuang.size(); idxa++){
strtemp = Character.toString(((lRuang.get(idxa)).JamMulai).charAt(0)) + Character.toString(((lRuang.get(idxa)).JamMulai).charAt(1));
idxJam = Integer.parseInt(strtemp);
strtemp = Character.toString(((lRuang.get(idxa)).JamSelesai).charAt(0)) + Character.toString(((lRuang.get(idxa)).JamSelesai).charAt(1));
idxJamSelesai = Integer.parseInt(strtemp);
idxHari = 0;
sizeHari = (Character.toString(((lRuang.get(idxa)).Hari).charAt(0))).length();
while (idxHari < sizeHari){ //iterasi hari
valHari = Integer.parseInt(Character.toString(((lRuang.get(idxa)).Hari).charAt(idxHari)));
//iterasi jam mulai - jam selesai
while (idxJam < idxJamSelesai){
isKetemu = false;
idxb = 0;
while (!isKetemu && (idxb < tabJadwal.length)){ //searching pada jadwal
if ( (cToI((tabJadwal[idxb]).charAt(0)) == idxa) && //ruangan sama
(((tabJadwal[idxb]).charAt(1)) == valHari) && //hari sama
((cToI((tabJadwal[idxb]).charAt(2)) + 7 == idxJam ) || //jam mulai sama
(cToI((tabJadwal[idxb]).charAt(3)) + 7 == idxJam + 1) || //jam selesai sama
((cToI((tabJadwal[idxb]).charAt(2)) + 7) < idxJam && (cToI((tabJadwal[idxb]).charAt(3)) + 7) > idxJam) //jam berada di antara mulai dan selesai sebuah matkul
)
){
countUsed++;
isKetemu = true;
}
countSlot++;
idxb++;
}
idxJam++;
}
idxHari = idxHari + 2;
}
}
//Jadwal Algorithm
// 1. pilih ruangan
// 2. iterasi jam available ruangan
// 3. cocokin ke string apakah ada yang sama?
// 4. hitung persentasi
return (countUsed/countSlot);
}
public boolean isSamaJam(int num, char c){
return ((cToI(c)+7) == num);
}
public void printJadwal(List<Ruangan> lRuang, List<Jadwal> lJadwal, String str){
/* Prosedur berfungsi untuk mencetak matriks jadwal dengan baris menunjukkan jam dan kolom menunjukkan hari
dari tiap Ruangan (1 ruangan 1 matriks)
I.S : lRuang, lJadwal, dan str terdefinisi
F.S : jadwal untuk tiap ruang tercetak ke layar
*/
//kumpulan kamus lokal
int idxb; //buat iterasi tabJadwal
int idxHari; //buat iterasi hari
int idxJam; //buat iterasi jam
int idxJamSelesai; //batas iterasi jam
int sizeHari; //panjang string hari
int valHari; //nilai hari dalam angka
String strtemp = ""; //penyimpan sring utk convert jam ruangan
int x; //iterasi baris
int y; //iterasi kolom
int i; //iterasi baris
int j; //iterasi kolom
//membuat dan menginisialisasi matriks jadwal yang akan dicetak ke layar
String[][] matriksjadwal = new String[11][5];
for (i = 0; i < 11; i++){
for (j = 0; j < 5; j++){
matriksjadwal[i][j] = "";
}
}
//mengassign string jadwal ke bentuk array of string
String[] tabJadwal = pisahstring(str);
//mengisi dan mencetak matriksjadwal
//iterasi ruangan
for (int idxruang = 0; idxruang < lRuang.size(); idxruang++){
idxHari = 0;
sizeHari = ((lRuang.get(idxruang)).Hari).length();
//iterasi hari
while (idxHari < sizeHari){
valHari = Integer.parseInt(Character.toString(((lRuang.get(idxruang)).Hari).charAt(idxHari)));
//mengisi idxJam dan idxJamSelesai dari lRuang
strtemp = Character.toString(((lRuang.get(idxruang)).JamMulai).charAt(0)) + Character.toString(((lRuang.get(idxruang)).JamMulai).charAt(1));
idxJam = Integer.parseInt(strtemp);
strtemp = Character.toString(((lRuang.get(idxruang)).JamSelesai).charAt(0)) + Character.toString(((lRuang.get(idxruang)).JamSelesai).charAt(1));
idxJamSelesai = Integer.parseInt(strtemp);
//iterasi jam mulai - jam selesai
while (idxJam < idxJamSelesai){
matriksjadwal[idxJam-7][idxHari] += "v"; //penanda jika slot tersedia
idxb = 0;
//searching digunakannya slot pada tabJadwal
while (idxb < tabJadwal.length){
if ( (cToI((tabJadwal[idxb]).charAt(0)) == idxruang) && //ruangan sama
(Integer.parseInt(Character.toString((tabJadwal[idxb]).charAt(1))) == valHari) && //hari sama
( (cToI((tabJadwal[idxb]).charAt(2)) == idxJam ) || //jam mulai sama
(cToI((tabJadwal[idxb]).charAt(3)) == idxJam + 1) || //jam selesai sama
((cToI((tabJadwal[idxb]).charAt(2))) < idxJam && (cToI((tabJadwal[idxb]).charAt(3))) > idxJam) //jam berada di antara mulai dan selesai sebuah matkul
)
){
matriksjadwal[idxJam-7][idxHari] += " - " + (lJadwal.get(idxb)).NamaKegiatan;
}
idxb++;
}
idxJam++;
}
idxHari = idxHari + 2;
}
//pencetakan ke layar
System.out.println("Jadwal Ruangan " + (lRuang.get(idxruang)).Nama);
System.out.print("|Jam▼ - Hari►|");
for (x = 0; x < 5; x++){
System.out.print(" " + x +" |");
}
System.out.println();
for (x = 0; x < 11; x++){
if ((x+7) < 10){
System.out.print(" 0" + (x+7) +".00 |");
} else {
System.out.print(" " + (x+7) +".00 |");
}
for (y = 0; y < 5; y++){
System.out.print(" " + matriksjadwal[x][y] + " ");
}
System.out.println();
}
System.out.println("Keterangan: 'v' menunjukkan slot tersedia ");
System.out.println();
System.out.println();
}
}
}
//// Biar lolos compile ////
class Ruangan {
public String Nama;
public String JamMulai;
public String JamSelesai;
public String Hari;
}
class Jadwal {
public String NamaKegiatan;
public String Ruangan;
public String JamMulai;
public String JamSelesai;
public String Durasi;
public String Hari;
// Constructs an intial course
public Jadwal() {
this.NamaKegiatan = "IFXXXX";
this.Ruangan = "";
this.JamMulai = "0";
this.JamSelesai = "0";
this.Durasi = "0";
this.Hari = "";
}
// Constructs a course with certain of parameters
public Jadwal(String nm, String rg, String mulai, String selesai, String dur, String hr) {
this.NamaKegiatan = nm;
this.Ruangan = rg;
this.JamMulai = mulai;
this.JamSelesai = selesai;
this.Durasi = dur;
this.Hari = hr;
}
// Constructs a course from another course
public Jadwal(Jadwal jadwal) {
this.NamaKegiatan = jadwal.NamaKegiatan;
this.Ruangan = jadwal.Ruangan;
this.JamMulai = jadwal.JamMulai;
this.JamSelesai = jadwal.JamSelesai;
this.Durasi = jadwal.Durasi;
this.Hari = jadwal.Hari;
}
}