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 global_pinalti(GLobalSolusi GLobalJadwal, int pos) { int pinalti = 0; // cek guru ngajar bentrok dengan kelas sebelumnya //cek rentang guru ngajar terlalu dempet ex : kelas-a mp x jam 1-3, kelas-b mp y 4-6 for (int i = 0; i < GLobalJadwal.GlobalSolusi[pos].Solusi.Count; i++) { for (int j = 0; j < GLobalJadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count; j++) { for (int k = 0; k < pos; k++) { for (int l = 0; l < GLobalJadwal.GlobalSolusi[k].Solusi[i].Mengajar.Count; l++) { if (GLobalJadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j).Guru == GLobalJadwal.GlobalSolusi[k].Solusi[i].Mengajar.ElementAt(l).Guru) { if (Math.Abs(GLobalJadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j).StartMengajar - GLobalJadwal.GlobalSolusi[k].Solusi[i].Mengajar.ElementAt(l).StartMengajar) < GLobalJadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j).Sks) { GLobalJadwal.GlobalSolusi[pos].Solusi[i].Mengajar[j].Problem = true; form.Row = form.Log.NewRow(); form.Row["Status"] = "Global Penalti"; form.Row["Keterangan"] = "Jadwal Mengajar guru bentrok"; form.Log.Rows.Add(form.Row); pinalti++; } } } } } } return(pinalti); }
private void runAlgo() { LoadAlgo(); var bw = new BackgroundWorker(); bw.DoWork += (sender, args) => { int done = 0; int shuffle = 0; while (done < GlobalJadwal.GlobalSolusi.Count) { Row = Log.NewRow(); Row["Status"] = "Waktu"; Row["Keterangan"] = "Cek Penalti"; Log.Rows.Add(Row); LokalPinalti = optimasi.local_pinalti(GlobalJadwal.GlobalSolusi[done]); Row = Log.NewRow(); Row["Status"] = "Lokal Penalti"; Row["Keterangan"] = "Lokal Penalti : " + LokalPinalti; Log.Rows.Add(Row); GlobalPinalti = optimasi.global_pinalti(GlobalJadwal, done); Row = Log.NewRow(); Row["Status"] = "Global Penalti"; Row["Keterangan"] = "Global Penalti : " + GlobalPinalti; Log.Rows.Add(Row); if (GlobalPinalti == 0 && LokalPinalti == 0) { Row = Log.NewRow(); Row["Status"] = "Optimal"; Row["Keterangan"] = "Kelas : " + GlobalJadwal.GlobalSolusi[done].Kelas; Log.Rows.Add(Row); done++; double x = (done * 1.00 / GlobalJadwal.GlobalSolusi.Count * 1.00) * 100.00; x = Math.Floor(x); progress_loading.Invoke((MethodInvoker)(() => progress_loading.Text = x + "%")); loading.Invoke((MethodInvoker)(() => loading.Value = int.Parse(x.ToString()))); shuffle = 0; } else { Row = Log.NewRow(); Row["Status"] = "Proses"; Row["Keterangan"] = "Interchanging"; Log.Rows.Add(Row); GlobalJadwal = optimasi.interchanging(GlobalJadwal, done); Row = Log.NewRow(); Row["Status"] = "Waktu"; Row["Keterangan"] = "Cek Penalti"; Log.Rows.Add(Row); LokalPinalti = optimasi.local_pinalti(GlobalJadwal.GlobalSolusi[done]); Row = Log.NewRow(); Row["Status"] = "Lokal Penalti"; Row["Keterangan"] = "Lokal Penalti : " + LokalPinalti; Log.Rows.Add(Row); GlobalPinalti = optimasi.global_pinalti(GlobalJadwal, done); Row = Log.NewRow(); Row["Status"] = "Global Penalti"; Row["Keterangan"] = "Global Penalti : " + GlobalPinalti; Log.Rows.Add(Row); if (GlobalPinalti > 0 || LokalPinalti > 0) { Row = Log.NewRow(); Row["Status"] = "Proses"; Row["Keterangan"] = "Insertion"; Log.Rows.Add(Row); GlobalJadwal.GlobalSolusi[done] = optimasi.insertion(GlobalJadwal.GlobalSolusi[done]); Row = Log.NewRow(); Row["Status"] = "Proses"; Row["Keterangan"] = "Intensifikasi"; Log.Rows.Add(Row); GlobalJadwal = optimasi.intensifikasi(GlobalJadwal, done); shuffle++; } else { done++; double x = (done * 1.00 / GlobalJadwal.GlobalSolusi.Count * 1.00) * 100.00; x = Math.Floor(x); progress_loading.Invoke((MethodInvoker)(() => progress_loading.Text = x + "%")); loading.Invoke((MethodInvoker)(() => loading.Value = int.Parse(x.ToString()))); shuffle = 0; } } if (done < GlobalJadwal.GlobalSolusi.Count) { ErrorLbl.Invoke((MethodInvoker)(() => ErrorLbl.Text = GlobalJadwal.GlobalSolusi[done].Kelas + " Lokal Penalti: " + LokalPinalti.ToString())); GlobalErrorLbl.Invoke((MethodInvoker)(() => GlobalErrorLbl.Text = GlobalJadwal.GlobalSolusi[done].Kelas + " Global Penalti: " + GlobalPinalti.ToString() + done.ToString())); } if (shuffle > 500) { if (shuffle < 3 && done > 0) { done -= 1; } else if (done >= 3) { done -= 2; } double x = (done * 1.00 / GlobalJadwal.GlobalSolusi.Count * 1.00) * 100.00; x = Math.Floor(x); progress_loading.Invoke((MethodInvoker)(() => progress_loading.Text = x + "%")); loading.Invoke((MethodInvoker)(() => loading.Value = int.Parse(x.ToString()))); shuffle = 0; Row = Log.NewRow(); Row["Status"] = "Proses"; Row["Keterangan"] = "Insertion"; Log.Rows.Add(Row); GlobalJadwal.GlobalSolusi[done] = optimasi.insertion(GlobalJadwal.GlobalSolusi[done]); Row = Log.NewRow(); Row["Status"] = "Proses"; Row["Keterangan"] = "Intensifikasi"; Log.Rows.Add(Row); GlobalJadwal = optimasi.intensifikasi(GlobalJadwal, done); shuffle++; } Thread.Sleep(200); } }; bw.RunWorkerCompleted += (sender, args) => { hasiljadwal x = new hasiljadwal(this); op = true; x.Show(); this.Close(); }; bw.RunWorkerAsync(); }
/// <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); }
/* public List<solusi> intensification(solusi jadwal) * { * //pindah mengajar yang ditandain * List<solusi> temp_jadwal = new List<solusi>(); * List<solusi> temp_job = new List<solusi>(); * List<mengajar> job = new List<mengajar>(); * LinkedListNode<mengajar> lln; * for (int i = 0; i < jadwal.Solusi.Count; i++) * { * for (int j = 0; j < jadwal.Solusi[i].Mengajar.Count; j++) * { * if (jadwal.Solusi[i].Mengajar.ElementAt(j).Problem) * { * //lln = new LinkedListNode<mengajar>(jadwal.Solusi[i].Mengajar.ElementAt(j)); * job.Add(jadwal.Solusi[i].Mengajar.ElementAt(j)); * jadwal.Solusi[i].Mengajar.Remove(jadwal.Solusi[i].Mengajar.ElementAt(j)); * lln = null; * } * } * } * //end pisah ngajar * temp_jadwal.Add(jadwal); * // masukin ke tetangga * for (int i = 0; i < job.Count; i++) // iterasi sebanyak job * { * for (int j = 0; j < temp_jadwal.Count; j++)// iterasi per solusi yang fitness di lokal * { * for (int k = 0; k <jadwal.Solusi.Count; k++) // iterasi per hari * { * for (int l = 0; l <= jadwal.Solusi[k].Mengajar.Count; l++)// iterasi mengajar per hari * { * List<jadwal> x = temp_jadwal[j].Solusi.ToList(); * temp_job.Add(new solusi() { Jurusan = temp_jadwal[j].Jurusan, Kelas = temp_jadwal[j].Kelas, Solusi = x, Tingkat = temp_jadwal[j].Tingkat, Visit = temp_jadwal[j].Visit}); * temp_job.Last().Solusi[k].Mengajar.Insert(l, job[i]); * } * * } * } * * for (int m = 0; m < temp_job.Count; m++)//periksa lokal fitness temp_job * { * if (local_pinalti(temp_job[m]) > 0) * { * temp_job.RemoveAt(m); * } * } * temp_jadwal.Clear(); * temp_jadwal.AddRange(temp_job); * temp_job.Clear(); * } * //end tetangga * * for (int i = 0; i < temp_jadwal.Count; i++) * { * for (int j = 0; j < temp_jadwal[i].Solusi.Count; j++) * { * for (int k = 0; k < temp_jadwal[i].Solusi[j].Mengajar.Count; k++) * { * if (temp_jadwal[i].Solusi[j].Mengajar.ElementAt(k).Problem) * { * temp_jadwal[i].Solusi[j].Mengajar.ElementAt(k).Problem = false; * } * } * } * } * return temp_jadwal; * }*/ public GLobalSolusi intensifikasi(GLobalSolusi globaljadwal, int pos) { List <mengajar> Job = new List <mengajar>(); for (int i = 0; i < globaljadwal.GlobalSolusi[pos].Solusi.Count; i++) { for (int j = 0; j < globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count; j++) { if (globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j).Problem) { if (globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count == 1) { globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j).Problem = false; } else { //lln = new LinkedListNode<mengajar>(jadwal.Solusi[i].Mengajar.ElementAt(j)); Job.Add(globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j)); globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Remove(globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.ElementAt(j)); } } } } regenerate_jam_mengajar(globaljadwal.GlobalSolusi[pos]); int fin = 0; int counterError = 1; int rand_hari = rg.Next(0, globaljadwal.GlobalSolusi[pos].Solusi.Count); int rand_ngajar = rr.Next(0, globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar.Count); while (fin < Job.Count) { //if (global_penalti_intensifikasi(Job[fin], globaljadwal,pos,rand_hari,rand_ngajar) == 0) //{ //check global if (Lokal_penalti_intensifikasi(Job[fin], globaljadwal.GlobalSolusi[pos], pos, rand_hari) > 0) { rand_hari = rg.Next(0, globaljadwal.GlobalSolusi[pos].Solusi.Count); rand_ngajar = rr.Next(0, globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar.Count); form.ErrorLbl.Invoke((MethodInvoker)(() => form.ErrorLbl.Text = globaljadwal.GlobalSolusi[pos].Kelas + ", Lokal intensifikasi Penalti: " + Lokal_penalti_intensifikasi(Job[fin], globaljadwal.GlobalSolusi[pos], pos, rand_hari) + counterError.ToString())); counterError++; } else { //lokal fitt form.Row = form.Log.NewRow(); form.Row["Status"] = "Intensifikasi"; form.Row["Keterangan"] = "Generate Barnch sebanyak " + counterError + " pada satu job"; form.Log.Rows.Add(form.Row); globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar.Insert(rand_ngajar, Job[fin]); int jam = atur_jam_mengajar(rand_hari); int lim = limit(rand_hari); int jam_end = jam; for (int i = 0; i < globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar.Count; i++) { globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar[i].StartMengajar = jam; globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar[i].EndMengajar = jam + globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar[i].Sks - 1; lim -= globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar[i].Sks; jam += globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar[i].Sks; } globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Limit = lim; fin++; counterError = 1; } if (counterError > 300) //0.5 detik belum menemukan keputusan { form.Row = form.Log.NewRow(); form.Row["Status"] = "Intensifikasi"; form.Row["Keterangan"] = "Jumlah branch melibihi limit melakukan penelusuran fitness"; form.Log.Rows.Add(form.Row); int globalHariMin = -1; int globalngajar = -1; int globalMin = 9999; for (int i = 0; i < globaljadwal.GlobalSolusi[pos].Solusi.Count; i++) { int jamStart = atur_jam_mengajar(i); for (int j = 0; j <= globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count; j++) { if (globalMin > global_penalti_intensifikasi(Job[fin], globaljadwal, pos, i, j, jamStart)) { globalMin = global_penalti_intensifikasi(Job[fin], globaljadwal, pos, i, j, jamStart); if (globalMin == 0) { if (Lokal_penalti_intensifikasi(Job[fin], globaljadwal.GlobalSolusi[pos], pos, i) == 0) { globalHariMin = i; globalngajar = j; j = globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count; } } } if (j < globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count - 1) { jamStart += globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar[j].Sks; } } if (pos == 0) { if (globalHariMin >= 0 || globalngajar >= 0) { i = globaljadwal.GlobalSolusi[pos].Solusi.Count; } } else { if (globalHariMin >= 0 && globalngajar >= 0) { i = globaljadwal.GlobalSolusi[pos].Solusi.Count; } } } if (globalHariMin >= 0 && globalngajar >= 0) { form.Row = form.Log.NewRow(); form.Row["Status"] = "Intensifikasi"; form.Row["Keterangan"] = "Ketemu branch dengan fitnesh optimal global dan lokal"; form.Log.Rows.Add(form.Row); globaljadwal.GlobalSolusi[pos].Solusi[globalHariMin].Mengajar.Insert(globalngajar, Job[fin]); regenerate_jam_mengajar(globaljadwal.GlobalSolusi[pos]); } else { form.Row = form.Log.NewRow(); form.Row["Status"] = "Intensifikasi"; form.Row["Keterangan"] = "tidak ketemu fitness lokal dan global, memasuki job ke limit terbesar"; form.Log.Rows.Add(form.Row); int min = 0; for (int i = 1; i < globaljadwal.GlobalSolusi[pos].Solusi.Count; i++) { if (globaljadwal.GlobalSolusi[pos].Solusi[min].Limit < globaljadwal.GlobalSolusi[pos].Solusi[i].Limit) { min = i; } } int force = rr.Next(0, globaljadwal.GlobalSolusi[pos].Solusi[min].Mengajar.Count); globaljadwal.GlobalSolusi[pos].Solusi[min].Mengajar.Insert(force, Job[fin]); regenerate_jam_mengajar(globaljadwal.GlobalSolusi[pos]); } fin++; counterError = 1; } /*} * else * { * rand_hari = rg.Next(0, globaljadwal.GlobalSolusi[pos].Solusi.Count); * rand_ngajar = rr.Next(0, globaljadwal.GlobalSolusi[pos].Solusi[rand_hari].Mengajar.Count); * form.GlobalErrorLbl.Invoke((MethodInvoker)(()=> form.GlobalErrorLbl.Text= globaljadwal.GlobalSolusi[pos].Kelas + " , Global Penalti : " + global_penalti_intensifikasi(Job[fin], globaljadwal, pos, rand_hari, rand_ngajar))); * }*/ } Job = null; for (int i = 0; i < globaljadwal.GlobalSolusi[pos].Solusi.Count; i++) { for (int j = 0; j < globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar.Count; j++) { if (globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar[j].Problem) { globaljadwal.GlobalSolusi[pos].Solusi[i].Mengajar[j].Problem = false; } } } return(globaljadwal); }
public solusi proses_movns(solusi Solusi, GLobalSolusi global) { return(Solusi); }