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; }
public solusi proses_movns(solusi Solusi, GLobalSolusi global) { return Solusi; }
/// <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; }
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(); }