コード例 #1
0
        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());
             */
        }
コード例 #2
0
        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;
            }
        }