예제 #1
0
 public CarInfo()
 {
     this.rota = new Guzergah();
 }
예제 #2
0
 public CarInfo(int carID, Guzergah rota)
 {
     this.carID = carID;
     this.rota  = rota;
 }
예제 #3
0
        public int rotaAdd(int here)
        {
            //var car = center.carList.LastOrDefault();
            CarInfo car  = new CarInfo();
            var     carL = center.carList.ToList();

            //hangi arabayı kontrol ettiğimizi buluyoruz
            foreach (var item in carL)
            {
                if (item.rota.target.LastOrDefault() == here)
                {
                    car = item;
                }
            }

            //var r1 = ShortestDistance(here);

            // son  teslim saatine göre sıralama
            var r1 = DueDateSort(here);

            int temp_distance_time = 0;
            int temp_t_time;

            NoktaInfo temp_hedef;               // bütün koşulların uyduğu gitmeye karar verdiğim yer
            NoktaInfo temp_capacityP = null;    // üsteki koşulun sorunsuz sağlanmadığı durumlarda kapasite yüzünden gidilmeyen yer
            NoktaInfo temp_timeP     = null;    // üsteki koşulun sorunsuz sağlanmadığı durumlarda teslim saati  yüzünden gidilmeyen yer
            bool      tukendi_mi     = false;

            //aracın kapasitesi yeterli mi
            if (car.rota.yuk != center.capacity)
            {
                // aracın gidebileceği noktalar
                foreach (var r in r1)
                {
                    temp_hedef = center.nokta.Where(x => x.cust_no == r.cust_no).FirstOrDefault();

                    temp_distance_time = FindDistance(here, r.cust_no).distance;
                    temp_t_time        = car.rota.t_time + temp_distance_time;

                    //Daha önce gidilmiş mi
                    if (!center.rota.target.Contains(r.cust_no))
                    {
                        //Açılış-Kapanış süreleri arasında mı
                        if (temp_hedef.r_time <= temp_t_time && temp_t_time <= temp_hedef.d_time)
                        {
                            //Kapasitem yeterli mi
                            if (car.rota.yuk + temp_hedef.yuk <= center.capacity)
                            {
                                center.rota.target.Add(r.cust_no);

                                car.rota.target.Add(r.cust_no);
                                car.rota.t_time = temp_t_time + temp_hedef.s_time;
                                car.rota.yuk   += temp_hedef.yuk;
                                Console.WriteLine("\n\n\t\tCUST_NO : " + r.cust_no + " noktasındayım.");
                                Console.WriteLine("\t\t--Araç Bilgileri--");
                                Console.WriteLine("\t\tCarID       : " + car.carID);
                                Console.WriteLine("\t\tYük         : " + car.rota.yuk);
                                Console.WriteLine("\t\tGeldiğim Zaman : " + (car.rota.t_time - temp_hedef.s_time));
                                Console.WriteLine("\t\tÇıktığım Zaman : " + car.rota.t_time);


                                if (center.nokta.Count == center.rota.target.Count + 1)
                                {
                                    return(-2);
                                }
                                #region istisna
                                ///<summary>
                                ///İstisna durumu şunu sorgulamaktır :
                                /// 3 koşulu da sağlamasına rağmen o noktaya gidilirse,
                                /// Due_date saatini kaçıracağı başka bir nokta var mı
                                /// Varsa;
                                ///    Önce boşta kullanmadığımız araba var mı
                                ///         => Varsa return et;
                                ///         => Yoksa Merkez noktasından yeni araba kaldır.
                                /// Yoksa;
                                /// Devam et
                                ///
                                /// </summary>

                                // En son gittiğim hariç gittiklerimi listeden çıkarıyor
                                foreach (var b in center.rota.target)
                                {
                                    if (b != r.cust_no)
                                    {
                                        r1.RemoveAll(x => x.cust_no == b);
                                    }
                                }
                                //Hiç gitmediklerim arasında dönüyor
                                foreach (var a in r1)
                                {
                                    // a = ideal noka, r = bulunduğum nokta
                                    // ideal nokta bulunduğum nokta olmamalı
                                    if (a != r)
                                    {
                                        NoktaInfo temp_hedef2 = center.nokta.Where(x => x.cust_no == a.cust_no).FirstOrDefault();

                                        temp_t_time = car.rota.t_time + FindDistance(r.cust_no, temp_hedef2.cust_no).distance;
                                        CarInfo bCar;

                                        //due_date saatini kaçırdığım var mı
                                        if (temp_hedef2.d_time < temp_t_time)
                                        {
                                            //boşta araç varmı
                                            bCar = carL.Where(x => x.rota.yuk < center.capacity && x.carID != car.carID).FirstOrDefault();

                                            //  VARSA
                                            if (bCar != null)
                                            {
                                                if (temp_hedef2.r_time - bCar.rota.t_time < 150)
                                                {
                                                    return(bCar.rota.target.LastOrDefault());
                                                }
                                                else
                                                {
                                                    bCar.rota.t_time = temp_hedef2.r_time - 50;

                                                    return(bCar.rota.target.LastOrDefault());
                                                }
                                            }
                                            //  YOKSA
                                            else
                                            {// Yeni araç oluştur
                                                Guzergah newcarG = new Guzergah();
                                                newcarG.t_time = temp_hedef2.d_time - 40;

                                                center.carList.Add(new CarInfo(car.carID + 1, newcarG));
                                                Console.WriteLine("\n\n\t\tMerkezden yeni araç kalktı");

                                                return(0);
                                            }
                                        }
                                    }
                                }
                                #endregion

                                return(r.cust_no);
                            }
                            else
                            {
                                temp_capacityP = temp_hedef;
                            }
                        }
                        else if (temp_hedef.r_time - temp_t_time < 150 && temp_t_time <= temp_hedef.d_time)
                        {
                            foreach (var item in carL)
                            {
                                if (item.rota.yuk < center.capacity && item.rota.t_time < temp_hedef.d_time)
                                {
                                    item.rota.t_time = temp_hedef.r_time;
                                    return(item.rota.target.LastOrDefault());
                                }
                            }
                            if (car.rota.yuk + temp_hedef.yuk <= center.capacity)
                            {
                                temp_timeP = temp_hedef;
                            }
                            else
                            {
                                tukendi_mi = true;
                            }
                        }
                    }
                }

                ///<summary>
                ///Tüm noktalar arasında tüm koşulları sağlayan bir durum çıkmadığında;
                ///Hem zaman hem capasity sorunu olan iki nokta varsa
                ///zaman sorunu olana git
                ///kapasite sorunu olan için merkezden yeni araç kaldır
                /// </summary>
                if (temp_timeP != null && temp_capacityP != null)
                {
                    center.rota.target.Add(temp_timeP.cust_no);

                    car.rota.target.Add(temp_timeP.cust_no);
                    car.rota.yuk += temp_timeP.yuk;

                    Guzergah newcarG = new Guzergah();
                    newcarG.t_time = car.rota.t_time;

                    center.carList.Add(new CarInfo(car.carID + 1, newcarG));

                    car.rota.t_time = temp_timeP.r_time + temp_timeP.s_time;
                    Console.WriteLine("\n\n\t\tCUST_NO : " + temp_timeP.cust_no + " noktasındayım.");
                    Console.WriteLine("\t\t--Araç Bilgileri--");
                    Console.WriteLine("\t\tCarID       : " + car.carID);
                    Console.WriteLine("\t\tYük         : " + car.rota.yuk);
                    Console.WriteLine("\t\tGeldiğim Zaman : " + (car.rota.t_time - temp_timeP.s_time));
                    Console.WriteLine("\t\tÇıktığım Zaman : " + car.rota.t_time);



                    Console.WriteLine("\n\n\t\tMerkezden yeni araç kalktı");
                    return(0);
                }
                //Sadece zaman için sorun varsa git
                if (temp_timeP != null)
                {
                    center.rota.target.Add(temp_timeP.cust_no);

                    car.rota.target.Add(temp_timeP.cust_no);
                    car.rota.t_time = temp_timeP.r_time + temp_timeP.s_time;
                    car.rota.yuk   += temp_timeP.yuk;
                    Console.WriteLine("\n\n\t\tCUST_NO : " + temp_timeP.cust_no + " noktasındayım.");
                    Console.WriteLine("\t\t--Araç Bilgileri--");
                    Console.WriteLine("\t\tCarID       : " + car.carID);
                    Console.WriteLine("\t\tYük         : " + car.rota.yuk);
                    Console.WriteLine("\t\tGeldiğim Zaman : " + (car.rota.t_time - temp_timeP.s_time));
                    Console.WriteLine("\t\tÇıktığım Zaman : " + car.rota.t_time);
                    return(temp_timeP.cust_no);
                }
            }
            else
            {
                if (center.nokta.Count == center.rota.target.Count + 1)
                {
                    return(-2);
                }
                foreach (var item in carL)
                {
                    if (item.rota.yuk < center.capacity)
                    {
                        return(item.rota.target.LastOrDefault());
                    }
                }
                Guzergah newcarG = new Guzergah();
                newcarG.t_time = car.rota.t_time;

                center.carList.Add(new CarInfo(car.carID + 1, newcarG));
                Console.WriteLine("\n\n\t\tMerkezden yeni araç kalktı");


                return(0);
            }

            temp_capacityP = null;
            temp_timeP     = null;
            return(-1);
        }