public CarInfo() { this.rota = new Guzergah(); }
public CarInfo(int carID, Guzergah rota) { this.carID = carID; this.rota = rota; }
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); }