예제 #1
0
        public void Solve(out List <IsemriL> WorkList)
        {
            Console.WriteLine($"{this.IsemriTable.Count} is emri mevcut. {this.timelimit} dakika icinde yapilacaklar optimize ediliyor...");
            this.cevap = new Dictionary <Durum, Yapilacak>();
            String[] yapilanisler = new String[0];
            WorkList = new List <IsemriL>();
            detay  dummy = new detay();
            double totalcost;

            detay vinc2iptal = new detay();

            vinc2iptal.bitimzamani     = timelimit + 1;
            vinc2iptal.baslangiczamani = 0;
            vinc2iptal.bitimkonumu     = vinc2_ilkkonum;

            detay vinc3iptal = new detay();

            vinc3iptal.bitimzamani     = timelimit + 1;
            vinc3iptal.baslangiczamani = 0;
            vinc3iptal.bitimkonumu     = vinc3_ilkkonum;

            Durum simdikidurum;


            if (this.vinc2_on && this.vinc3_on)
            {
                simdikidurum = new Durum(this.DurumCounter++, 0, yapilanisler, false, false, this.vinc2_ilkkonum, this.vinc3_ilkkonum, dummy, dummy);
            }
            else if (this.vinc2_on)
            {
                simdikidurum = new Durum(this.DurumCounter++, 0, yapilanisler, false, true, this.vinc2_ilkkonum, this.vinc3_ilkkonum, dummy, vinc3iptal);
            }
            else
            {
                simdikidurum = new Durum(this.DurumCounter++, 0, yapilanisler, true, false, this.vinc2_ilkkonum, this.vinc3_ilkkonum, vinc2iptal, dummy);
            }

            if (this.vinc2_on && this.vinc3_on)
            {
                totalcost = RecursiveFun(simdikidurum, null, null);
            }
            else if (this.vinc2_on)
            {
                totalcost = RecursiveFun(simdikidurum, null, null);
            }
            else
            {
                totalcost = RecursiveFun(simdikidurum, null, null);
            }

            //resolve the answer here

            while (simdikidurum.getZaman() < this.timelimit && this.cevap.Keys.Contains(simdikidurum))
            {
                Yapilacak yap       = this.cevap[simdikidurum];
                int       aksiyon   = yap.aksiyontipi;
                string    yazilacak = yap.id;

                IsemriL data = IsemriTable.FirstOrDefault(o => o.UniqueID.Equals(yazilacak));

                string temp;

                if (aksiyon == 2)
                {
                    temp               = ($"t={simdikidurum.getZaman()}, {data.AtmosphereTuru},  vinc 2 ile {data.Konum1Kaide} nolu kaideden {data.Konum2Kaide} nolu kaideye {data.Yapilacakis} | {data.UniqueID}  |  Konum (kolon1) {data.Konum1Kolon}  Konum (kolon2) {data.Konum2Kolon} | {yap.skor}");
                    data.VincNo        = 2;
                    data.yapilacagi_dk = simdikidurum.getZaman();
                    Console.WriteLine(temp);
                    Program.writeLog(temp, "ATAMA");
                }
                else if (aksiyon == 3)
                {
                    temp               = ($"t={simdikidurum.getZaman()}, {data.AtmosphereTuru},   vinc 3 ile {data.Konum1Kaide} nolu kaideden {data.Konum2Kaide} nolu kaideye {data.Yapilacakis} | {data.UniqueID} |  Konum (kolon1) {data.Konum1Kolon}  Konum (kolon2) {data.Konum2Kolon} | {yap.skor}");
                    data.VincNo        = 3;
                    data.yapilacagi_dk = simdikidurum.getZaman();
                    Console.WriteLine(temp);
                    Program.writeLog(temp, "ATAMA");
                }
                else
                {
                    Console.WriteLine($"{yap.id}");
                    Program.writeLog($"{yap.id}", "ATAMA");
                }
                WorkList.Add(data);
                simdikidurum = yap.sonDurum;
            }
        }
예제 #2
0
        private double RecursiveFun(Durum baslangicDurumu, string V2SonIs, string V3SonIs)
        {
            //asagidaki is emirlerini iceren her durum icin, sirada hangi islere bakacagini ve skorlarini raporlar
            string[] incelenecekListe = { "60010101020HNX", "50020101020H2" };

            if (baslangicDurumu.t >= this.timelimit)
            {
                return(0);
            }

            //eger iki vinc'te calisiyorsa en kucuklerinin bitim zamanina gidilebilir.
            if (baslangicDurumu.V2Durum && baslangicDurumu.V3Durum && baslangicDurumu.t < baslangicDurumu.V2Detay.bitimzamani && baslangicDurumu.t < baslangicDurumu.V3Detay.bitimzamani)
            {
                Durum     next  = new Durum(this.DurumCounter++, Math.Min(baslangicDurumu.V2Detay.bitimzamani, baslangicDurumu.V3Detay.bitimzamani), baslangicDurumu.yapilan, baslangicDurumu.V2Durum, baslangicDurumu.V3Durum, baslangicDurumu.V2Konum, baslangicDurumu.V3Konum, baslangicDurumu.V2Detay, baslangicDurumu.V3Detay);
                double    sonuc = RecursiveFun(next, V2SonIs, V3SonIs);
                Yapilacak yp    = new Yapilacak(0, $"{Math.Min(baslangicDurumu.V2Detay.bitimzamani, baslangicDurumu.V3Detay.bitimzamani) - baslangicDurumu.t} dk bekle", sonuc, next);
                this.cevap.Add(baslangicDurumu, yp);
                return(sonuc);
            }

            /***
             * Su kopyalari olustur: V2Guncel, V3Guncel, V2Gkonum, V3Gkonum, V2Gdetay, V3Gdetay, islistesi
             **/
            double tnow     = baslangicDurumu.t;
            bool   V2Guncel = baslangicDurumu.V2Durum;
            bool   V3Guncel = baslangicDurumu.V3Durum;
            int    V2Gkonum = baslangicDurumu.V2Konum;
            int    V3Gkonum = baslangicDurumu.V3Konum;
            // reference type - kopya yarattigina emin olmali
            detay V2Gdetay = new detay();

            V2Gdetay.setDetay(baslangicDurumu.V2Detay.baslangiczamani, baslangicDurumu.V2Detay.bitimzamani, baslangicDurumu.V2Detay.baslangickonumu, baslangicDurumu.V2Detay.bitimkonumu);
            detay V3Gdetay = new detay();

            V3Gdetay.setDetay(baslangicDurumu.V3Detay.baslangiczamani, baslangicDurumu.V3Detay.bitimzamani, baslangicDurumu.V3Detay.baslangickonumu, baslangicDurumu.V3Detay.bitimkonumu);
            string[] islistesi = new string[baslangicDurumu.yapilan.Length];
            for (int i = 0; i < baslangicDurumu.yapilan.Length; i++)
            {
                islistesi[i] = baslangicDurumu.yapilan[i].ToString();
            }
            // kopyalar olustu


            //bittiyse isler vinc konumunu guncelle
            if (V2Guncel && V2Gdetay.bitimzamani == tnow)
            {
                V2Guncel = false;
                V2Gkonum = V2Gdetay.bitimkonumu;
            }
            if (V3Guncel && V3Gdetay.bitimzamani == tnow)
            {
                V3Guncel = false;
                V3Gkonum = V3Gdetay.bitimkonumu;
            }

            // KRITIK: cakisma vs olduysa ve biri digerini (aktif ya da degil) ittirdiyse burada sacmalamamasi icin konumu guncelliyorum
            // bu zaten issiz olan da olabilir, isi yeni biten de olabilir

            if (!V2Guncel)
            {
                int v3nerede = 0;
                if (V3Guncel)
                {
                    v3nerede = V3Gdetay.bitimkonumu;
                }
                else
                {
                    v3nerede = V3Gkonum;
                }
                V2Gkonum = Math.Min(V2Gkonum, v3nerede - 2);
            }
            if (!V3Guncel)
            {
                int v2nerede = 0;
                if (V2Guncel)
                {
                    v2nerede = V2Gdetay.bitimkonumu;
                }
                else
                {
                    v2nerede = V2Gkonum;
                }
                V3Gkonum = Math.Max(V3Gkonum, v2nerede + 2);
            }

            //YAZDIRIP YAZDIRMAMA KARARI

            bool yazdir = false;

            if (this.detayliyaz)
            {
                yazdir = true;
                foreach (var b in incelenecekListe)
                {
                    yazdir = yazdir && islistesi.Contains(b);
                }
                yazdir = yazdir && (islistesi.Length == incelenecekListe.Length);
            }
            bool[]   secki2 = new bool[IsemriTable.Count];
            bool[]   secki3 = new bool[IsemriTable.Count];
            double[] skor2  = new double[IsemriTable.Count];
            double[] skor3  = new double[IsemriTable.Count];
            for (int u = 0; u < IsemriTable.Count; u++)
            {
                skor2[u] = 0;
                skor3[u] = 0;
            }

            bool enAzBirIsUygun = false;


            for (int u = 0; u < IsemriTable.Count; u++)
            {
                // eger is yapilmadiysa, onculeri yapildiysa, zamani geldiyse
                //!!! MUTLAKA EKLE : Alternatifinin oncusu yapilmadiysa...
                if (DoesNotInclude(islistesi, IsemriTable[u].UniqueID) && onculersaglandi(IsemriTable[u], islistesi) && tnow >= IsemriTable[u].IntZaman)
                {
                    enAzBirIsUygun = true;
                    detay        YAPANVINCdetay = new detay();
                    VincNumarasi vincNo         = new VincNumarasi();//  VincNo vincNo;
                    YAPANVINCdetay.setDetay(tnow, tnow + Convert.ToDouble(IsemriTable[u].Issuresi), Convert.ToInt32(IsemriTable[u].Konum1Kolon), Convert.ToInt32(IsemriTable[u].Konum2Kolon));

                    if (!V2Guncel)
                    {
                        vincNo = VincNumarasi.vinc2;
                        if (sinirlaricinde(2, IsemriTable[u]))
                        {
                            // sag yarimindaysa layoutun c*k az cezalandiriyorum - skor eksilterek
                            skor2[u] = IsemriTable[u].skor - .5 * sagda(IsemriTable[u]) - this.parameterCakisma * cakisma(vincNo, V2Gkonum, YAPANVINCdetay, V3Guncel, V3Gkonum, V3Gdetay);
                        }
                    }
                    if (!V3Guncel)
                    {
                        if (sinirlaricinde(3, IsemriTable[u]))
                        {
                            vincNo = VincNumarasi.vinc3;
                            // sol yarimindaysa c*k az cezalandiriyorum
                            skor3[u] = IsemriTable[u].skor - .5 * solda(IsemriTable[u]) - this.parameterCakisma * cakisma(vincNo, V3Gkonum, YAPANVINCdetay, V2Guncel, V2Gkonum, V2Gdetay);
                        }
                    }
                }
            }

            // bu durumdaki hepsinin kismi skorunu basti - simdi kacina bakacagina karar verip en iyi 2-4 tanesinden secki olusturacak
            if (!enAzBirIsUygun)
            {
                Durum     next  = new Durum(this.DurumCounter++, tnow + 0.5, baslangicDurumu.yapilan, baslangicDurumu.V2Durum, baslangicDurumu.V3Durum, baslangicDurumu.V2Konum, baslangicDurumu.V3Konum, baslangicDurumu.V2Detay, baslangicDurumu.V3Detay);
                double    sonuc = RecursiveFun(next, V2SonIs, V3SonIs);
                Yapilacak yp    = new Yapilacak(0, $"{0.5} dk bekle", sonuc, next);
                this.cevap.Add(baslangicDurumu, yp);
                return(sonuc);
            }
            else
            {
                // kacinabak dinamik degisiyor, bastan 4 alternatife bakarken sonra 2'ye dusuyor.
                int kacinabak = eniyi_kactane;
                if (baslangicDurumu.t < bol_timelimit)
                {
                    kacinabak = eniyi_kactane_bol;
                }
                bool v2ZorluIs = false;
                bool v3ZorluIs = false;

                v2ZorluIs = zorundalikTara(islistesi, secki2, skor2, skor3, V2SonIs);
                v3ZorluIs = zorundalikTara(islistesi, secki3, skor3, skor2, V3SonIs);


                // v2ZorluIs ya da v3ZorluIs true olmasi demek, onun devam eden ya da bitmis isi var, digeri o isi yapamaz demek.
                // eger devam etmekteyse zaten guncel'i true'dur tarama yapmayacakti
                // eger bittiyse ve tarayacaktiysa da bu durumda taramasin, zaten zorundalikTara icinde secki'sini true yaptim sira yapmak zorunda oldugu isi

                if (!V2Guncel && !v2ZorluIs)
                {
                    tara(secki2, skor2, kacinabak);
                }
                if (!V3Guncel && !v3ZorluIs)
                {
                    tara(secki3, skor3, kacinabak);
                }


                // yazdir = true;
                if (yazdir)
                {
                    Console.Write("Yapilanlar @ " + tnow + " ");
                }
                if (yazdir)
                {
                    foreach (var u in islistesi)
                    {
                        Console.Write(u + " ");
                    }
                    Console.Write("\n Bakilanlar (tekadimda): ");
                    for (int u = 0; u < IsemriTable.Count; u++)
                    {
                        if (secki2[u] || secki3[u])
                        {
                            Console.Write(IsemriTable[u].UniqueID + " ");
                            if (secki2[u])
                            {
                                Console.Write("vinc2 " + skor2[u] + " ");
                            }
                            if (secki3[u])
                            {
                                Console.Write("vinc3 " + skor3[u] + " ");
                            }
                        }
                    }
                }
                string[] geciciisler = new string[islistesi.Length + 1];


                double[] vinc2ileyaparsam         = new double[IsemriTable.Count];
                double[] vinc3ileyaparsam         = new double[IsemriTable.Count];
                Durum[]  vinc2ileyaparsamSonDurum = new Durum[IsemriTable.Count];
                Durum[]  vinc3ileyaparsamSonDurum = new Durum[IsemriTable.Count];

                for (int u = 0; u < IsemriTable.Count; u++)
                {
                    vinc2ileyaparsam[u] = 0;
                    vinc3ileyaparsam[u] = 0;
                }

                for (int i = 0; i < IsemriTable.Count; i++)
                {
                    if (secki2[i] || secki3[i])
                    {
                        for (int k = 0; k < islistesi.Length; k++)
                        {
                            geciciisler[k] = islistesi[k];
                        }
                        geciciisler[islistesi.Length] = IsemriTable[i].UniqueID;

                        //YAPANVINCdetay -> tumisler.Rows[i]'daki islerin detaylari olmali
                        //baska hic bir sey degismemeli
                        //EKLE : seyahat suresini eklemedik, vinc uzaksa!
                        //EKLE: is yapinca reward eklemeli, yoksa hic bir sey yapmamak 0 maliyetle optimal cikar
                        detay YAPANVINCdetay = new detay();
                        YAPANVINCdetay.setDetay(tnow, tnow + Convert.ToDouble(IsemriTable[i].Issuresi), Convert.ToInt32(IsemriTable[i].Konum1Kolon), Convert.ToInt32(IsemriTable[i].Konum2Kolon));

                        //!!! EKLE: maliyet eksik, raw sure vs maliyeti islerin... asagidaki iki equation'da da eksik. travel time eksik!
                        if (!V2Guncel && secki2[i])
                        {
                            Durum next = new Durum(this.DurumCounter++, tnow, geciciisler, true, V3Guncel, V2Gkonum, V3Gkonum, YAPANVINCdetay, V3Gdetay);
                            vinc2ileyaparsam[i]         = skor2[i] + RecursiveFun(next, IsemriTable[i].UniqueID, V3SonIs);
                            vinc2ileyaparsamSonDurum[i] = next;
                        }
                        if (!V3Guncel && secki3[i])
                        {
                            Durum next = new Durum(this.DurumCounter++, tnow, geciciisler, V2Guncel, true, V2Gkonum, V3Gkonum, V2Gdetay, YAPANVINCdetay);
                            vinc3ileyaparsam[i]         = skor3[i] + RecursiveFun(next, V2SonIs, IsemriTable[i].UniqueID);
                            vinc3ileyaparsamSonDurum[i] = next;
                        }
                    }
                }


                if (yazdir)
                {
                    Console.Write("\n Bakilanlar (recursion): ");
                    for (int u = 0; u < IsemriTable.Count; u++)
                    {
                        if (secki2[u] || secki3[u])
                        {
                            Console.Write(IsemriTable[u].UniqueID + " ");
                            if (secki2[u])
                            {
                                Console.Write("vinc2 " + vinc2ileyaparsam[u] + " ");
                            }
                            if (secki3[u])
                            {
                                Console.Write("vinc3 " + vinc3ileyaparsam[u] + " ");
                            }
                        }
                    }
                    Console.WriteLine();
                    Console.WriteLine();
                }

                //Console.WriteLine();


                int    aksiyon             = -1;
                double maximumsayi         = 0;
                double vinc2ileyaparsamMax = vinc2ileyaparsam.Max();
                double vinc3ileyaparsamMax = vinc3ileyaparsam.Max();


                if (vinc2ileyaparsamMax > maximumsayi)
                {
                    maximumsayi = vinc2ileyaparsamMax;
                    aksiyon     = 2;
                }

                if (vinc3ileyaparsamMax > maximumsayi)
                {
                    maximumsayi = vinc3ileyaparsamMax;
                    aksiyon     = 3;
                }

                Yapilacak yap;
                Durum     sonDurum;

                if (aksiyon == 2)
                {
                    int satir = Array.IndexOf(vinc2ileyaparsam, maximumsayi);
                    //Console.WriteLine($"{t} zamaninda vinc 2 ile {IsemriTable[Array.IndexOf(vinc2ileyaparsam, minimumsayi)].UniqueID} isini yap.");
                    sonDurum = vinc2ileyaparsamSonDurum[satir];
                    yap      = new Yapilacak(aksiyon, IsemriTable[satir].UniqueID, maximumsayi, sonDurum);
                    this.cevap.Add(baslangicDurumu, yap);
                }
                else if (aksiyon == 3)
                {
                    int satir = Array.IndexOf(vinc3ileyaparsam, maximumsayi);
                    //Console.WriteLine($"{t} zamaninda vinc 3 ile {IsemriTable[Array.IndexOf(vinc3ileyaparsam, minimumsayi)].UniqueID} isini yap.");
                    sonDurum = vinc3ileyaparsamSonDurum[satir];
                    yap      = new Yapilacak(aksiyon, IsemriTable[satir].UniqueID, maximumsayi, sonDurum);
                    this.cevap.Add(baslangicDurumu, yap);
                }
                else
                {   // bulamadigina gore ikisi de bossa tamam, degilse devam eden bitmeli
                    if (!V2Guncel && !V3Guncel)
                    {
                        return(0);
                    }
                    else
                    {
                        //eger iki vinc'te calisiyorsa en kucuklerinin bitim zamanina gidilebilir.
                        if (V2Guncel && tnow < V2Gdetay.bitimzamani)
                        {
                            Durum     next  = new Durum(this.DurumCounter++, V2Gdetay.bitimzamani, islistesi, V2Guncel, V3Guncel, V2Gkonum, V3Gkonum, V2Gdetay, V3Gdetay);
                            double    sonuc = RecursiveFun(next, V2SonIs, V3SonIs);
                            Yapilacak yp    = new Yapilacak(0, $"{V2Gdetay.bitimzamani - tnow} dk (vinc3 idle) bekle", sonuc, next);
                            this.cevap.Add(baslangicDurumu, yp);
                            return(sonuc);
                        }
                        if (V3Guncel && tnow < V3Gdetay.bitimzamani)
                        {
                            Durum     next  = new Durum(this.DurumCounter++, V3Gdetay.bitimzamani, islistesi, V2Guncel, V3Guncel, V2Gkonum, V3Gkonum, V2Gdetay, V3Gdetay);
                            double    sonuc = RecursiveFun(next, V2SonIs, V3SonIs);
                            Yapilacak yp    = new Yapilacak(0, $"{V3Gdetay.bitimzamani - tnow} dk (vinc2 idle) bekle", sonuc, next);
                            this.cevap.Add(baslangicDurumu, yp);
                            return(sonuc);
                        }
                    }
                }
                return(maximumsayi);
            }
        }