public int global_penalti_intensifikasi(mengajar job, GLobalSolusi global_jadwal, int pos, int hari, int Mengajar, int startMengajar) { int penalti = 0; if (pos > 0) { for (int i = 0; i < pos; i++) { for (int j = 0; j < global_jadwal.GlobalSolusi[i].Solusi[hari].Mengajar.Count; j++) { if (global_jadwal.GlobalSolusi[i].Solusi[hari].Mengajar[j].Guru == job.Guru) { if (Math.Abs(global_jadwal.GlobalSolusi[i].Solusi[hari].Mengajar[j].EndMengajar - startMengajar) < job.Sks) { penalti++; form.Row = form.Log.NewRow(); form.Row["Status"] = "Intensifikasi Penalti"; form.Row["Keterangan"] = "Global penalti intensifikasi : " + penalti; form.Log.Rows.Add(form.Row); } } } } } else { penalti = 0; } return(penalti); }
public int Lokal_penalti_intensifikasi(mengajar job, solusi jadwal, int pos, int hari) { int penalti = 0; int limit_jadwal = limit(hari); for (int i = 0; i < jadwal.Solusi[hari].Mengajar.Count; i++) { limit_jadwal -= jadwal.Solusi[hari].Mengajar[i].Sks; } limit_jadwal -= job.Sks; if (limit_jadwal < 0) { penalti++; int ran = rr.Next(0, jadwal.Solusi[hari].Mengajar.Count); jadwal.Solusi[hari].Mengajar[ran].Problem = true; form.Row = form.Log.NewRow(); form.Row["Status"] = "Intensifikasi Penalti"; form.Row["Keterangan"] = "Lokal Intensifikasi penalti :" + penalti; form.Log.Rows.Add(form.Row); } return(penalti); }
/// <summary> /// terakhir check bentrok collection yang di interchanging dengan global /// </summary> /// <param name=Solusi></param> /// <param name=global></param> /// <returns></returns> public GLobalSolusi interchanging(GLobalSolusi global, int pos) { if (pos >= 0) { int x = -1; int xx = -1; bool prob = false; int i = 0; int j = 0; while (!prob && i < global.GlobalSolusi[pos].Solusi.Count) { while (!prob && j < global.GlobalSolusi[pos].Solusi[i].Mengajar.Count) { if (global.GlobalSolusi[pos].Solusi[i].Mengajar[j].Problem) { x = i; xx = j; prob = true; } j++; } i++; } if (prob) { if (pos > 0) { int xy = -1; int xyy = -1; for (int y = 0; y < global.GlobalSolusi[pos].Solusi.Count; y++) { int startJam = limit(y); for (int yy = 0; yy < global.GlobalSolusi[pos].Solusi[y].Mengajar.Count; yy++) { if (global_penalti_intensifikasi(global.GlobalSolusi[pos].Solusi[x].Mengajar[xx], global, pos, y, yy, startJam) == 0) { if (Lokal_penalti_intensifikasi(global.GlobalSolusi[pos].Solusi[x].Mengajar[xx], global.GlobalSolusi[pos], pos, y) == 0) { xy = y; xyy = yy; } } startJam += global.GlobalSolusi[pos].Solusi[y].Mengajar[yy].Sks; } } if (xy >= 0 && xyy >= 0) { mengajar temp = new mengajar(); temp = global.GlobalSolusi[pos].Solusi[x].Mengajar[xx]; global.GlobalSolusi[pos].Solusi[x].Mengajar[xx] = global.GlobalSolusi[pos].Solusi[xy].Mengajar[xyy]; global.GlobalSolusi[pos].Solusi[xy].Mengajar[xyy] = temp; regenerate_jam_mengajar(global.GlobalSolusi[pos]); } else { form.Row = form.Log.NewRow(); form.Row["Status"] = "Interchanging"; form.Row["Keterangan"] = "Gagal meemukan pasangan optimal, mencari pasangan minimum limit"; form.Log.Rows.Add(form.Row); int min = 1000; int trial = 100; for (int k = 0; k < trial; k++) { int y = rr.Next(0, global.GlobalSolusi[pos].Solusi.Count); int yy = rg.Next(0, global.GlobalSolusi[pos].Solusi[y].Mengajar.Count); if (min > global_penalti_intensifikasi(global.GlobalSolusi[pos].Solusi[x].Mengajar[xx], global, pos, y, yy, global.GlobalSolusi[pos].Solusi[y].Mengajar[yy].StartMengajar)) { min = global_penalti_intensifikasi(global.GlobalSolusi[pos].Solusi[x].Mengajar[xx], global, pos, y, yy, global.GlobalSolusi[pos].Solusi[y].Mengajar[yy].StartMengajar); xy = y; xyy = yy; } } mengajar temp = new mengajar(); temp = global.GlobalSolusi[pos].Solusi[x].Mengajar[xx]; global.GlobalSolusi[pos].Solusi[x].Mengajar[xx] = global.GlobalSolusi[pos].Solusi[xy].Mengajar[xyy]; global.GlobalSolusi[pos].Solusi[xy].Mengajar[xyy] = temp; regenerate_jam_mengajar(global.GlobalSolusi[pos]); } } else { int xy = rr.Next(0, global.GlobalSolusi[pos].Solusi.Count); int xyy = rg.Next(0, global.GlobalSolusi[pos].Solusi[xy].Mengajar.Count); mengajar temp = new mengajar(); temp = global.GlobalSolusi[pos].Solusi[x].Mengajar[xx]; global.GlobalSolusi[pos].Solusi[x].Mengajar[xx] = global.GlobalSolusi[pos].Solusi[xy].Mengajar[xyy]; global.GlobalSolusi[pos].Solusi[xy].Mengajar[xyy] = temp; regenerate_jam_mengajar(global.GlobalSolusi[pos]); } } } else { } for (int i = 0; i < global.GlobalSolusi[pos].Solusi.Count; i++) { for (int j = 0; j < global.GlobalSolusi[pos].Solusi[i].Mengajar.Count; j++) { if (global.GlobalSolusi[pos].Solusi[i].Mengajar[j].Problem) { global.GlobalSolusi[pos].Solusi[i].Mengajar[j].Problem = false; } } } return(global); }