public void randomRestart(ref List <MataKuliah> LMK, List <Ruangan> LR, int banyakjadwal, int banyakruangan, VariasiRuangan[] varR) { int step = 0; int idxMax = 0; int konfliklama = 0; Checker ch = new Checker(); Initializer init = new Initializer(); init.Initialize(LMK, LR, banyakjadwal, banyakruangan, varR); ch.hitungKonflik(LMK); //history best konflik yang ada List <MataKuliah> HLMK = cloneListMK(LMK); // history awal saat inisialisasi awal Checker ch2 = new Checker(); while (step < thresholdMax && ch.getJumlahKonflik() > 0) { init.Initialize(LMK, LR, banyakjadwal, banyakruangan, varR); ch.hitungKonflik(LMK); ++step; while (ch.getJumlahKonflik() > 0 && (step % thresholdRestart > 0)) { konfliklama = ch.getJumlahKonflik(); idxMax = ch.getIndexMaxMKKonflik(); newAssign(idxMax, LMK, LR, banyakjadwal, banyakruangan, varR); ch.hitungKonflik(LMK); Console.WriteLine("Konflik: " + ch.getJumlahKonflik()); while (ch.getJumlahKonflik() > konfliklama && (step % thresholdRestart > 0)) { ch.hitungKonflik(LMK); newAssign(idxMax, LMK, LR, banyakjadwal, banyakruangan, varR); ++step; } ++step; } System.Console.WriteLine("selesai\n"); ch.hitungKonflik(LMK); ch2.hitungKonflik(HLMK); if (ch.getJumlahKonflik() <= ch2.getJumlahKonflik()) { HLMK = cloneListMK(LMK); } } //jika hasil akhir lebih jelek dr history terbaik maka di ganti ch2.hitungKonflik(HLMK); ch.hitungKonflik(LMK); if (ch.getJumlahKonflik() > ch2.getJumlahKonflik()) { LMK = HLMK; } /* * ch2.hitungKonflik(HLMK); * ch.hitungKonflik(LMK); * Console.WriteLine("HLMK: " + ch2.getJumlahKonflik()); * Console.WriteLine("LMK: " + ch.getJumlahKonflik()); */ }
private double initTemperature = 100.0; //temperatur awal public void simulatedAnnealing(ref List <MataKuliah> LMK, List <Ruangan> LR, int banyakjadwal, int banyakruangan, VariasiRuangan[] varR) { Checker ch = new Checker(); Initializer init = new Initializer(); init.Initialize(LMK, LR, banyakjadwal, banyakruangan, varR); //inisialisasi ch.hitungKonflik(LMK); List <MataKuliah> tempLMK = new List <MataKuliah>(); double temperatur = initTemperature; int konflikLama = 0; int konflikBaru = 0; int deltaKonflik = 0; double chance = 0.0; int idxMax = 0; int step = 1; while (step < thresholdMax && ch.getJumlahKonflik() > 0) { ch.hitungKonflik(LMK); konflikLama = ch.getJumlahKonflik(); idxMax = ch.getIndexMaxMKKonflik(); tempLMK = cloneListMK(LMK); newAssign(idxMax, LMK, LR, banyakjadwal, banyakruangan, varR); //randomize value dari variabel konflik ch.hitungKonflik(LMK); konflikBaru = ch.getJumlahKonflik(); deltaKonflik = konflikBaru - konflikLama; if (deltaKonflik > 0) //Bad Move { chance = countProbability(temperatur, deltaKonflik, LMK); if (!isAccept(chance, temperatur)) //not accept change { LMK = tempLMK; } temperatur = temperatur * ratio; } Console.WriteLine("Konflik: " + ch.getJumlahKonflik() + "\n"); ++step; } }