public bool CheckAnswer(List<Order>[,] oplossingen, Order[] orders, int[,] reistijden) { for (int i1 = 0; i1 < 2; i1++) { for (int i2 = 0; i2 < 5; i2++) { List<Order> oplossing = oplossingen[i1, i2]; mogelijk = true; int vrachtWagenGewicht = 0; int j = 1; double reistijd = 0; //for(int j = 0; j < oplossing.route.Length - 1; j++) while (oplossing.Count > j && mogelijk) { reistijd += reistijden[oplossing[j - 1].routeNummer, oplossing[j].routeNummer]; reistijd += oplossing[j].legingsDuur * 60; vrachtWagenGewicht += oplossing[j - 1].aantalContainers * oplossing[j - 1].afvalPerContainer; if (oplossing[j - 1].orderNummer == 0) vrachtWagenGewicht = 0; if (vrachtWagenGewicht > 100000) return mogelijk = false; if (reistijd > 43200) return mogelijk = false; j++; } } } return mogelijk; }
//Parameters: Huidige oplossing, niet-ingeplande orders, de lijst van alle orders // return: nieuwe oplossing, nieuwe lijst van niet-ingeplande orders. public static KeyValuePair<List<Order>[, ], List<int>> AddOrder(List<Order>[,] oldList, List<int> unplannedOrders, Order[] orders, Random rand) { List<Order>[,] list = (List<Order>[,])oldList.Clone(); List<int> upOrders = unplannedOrders; if (upOrders.Count != 0) { int plannableOrder = upOrders[rand.Next(upOrders.Count)]; Order order = orders.Where(i => i.orderNummer ==plannableOrder).First(); int day = rand.Next(5); int truck = rand.Next(2); switch (order.aantalOphalen) #region switch { case 1: list[truck, day].Add(order); break; case 2: if (day != 2) { list[truck, day].Add(order); day = (day + 3) % 6; list[truck, day].Add(order); } break; case 3: if (day == 0 || day == 2 || day == 4) { list[truck, 0].Add(order); list[truck, 2].Add(order); list[truck, 4].Add(order); } break; case 4: list[truck, day].Add(order); day = (day + 1) % 5; list[truck, day].Add(order); day = (day + 1) % 5; list[truck, day].Add(order); day = (day + 1) % 5; list[truck, day].Add(order); break; case 5: for (int a = 0; a < 5; a++) { list[truck, a].Add(order); } break; default: break; } #endregion } return new KeyValuePair<List<Order>[,], List<int>>(list, upOrders); }
public static KeyValuePair<List<Order>[, ], List<int>> Change(List<Order>[,] oldList, List<int> unplannedOrders, Order[] orders, Random rand, int c) { int day, truck; KeyValuePair<List<Order>[,], List<int>> result; List<Order>[,] list = oldList; List<int> upOrders = unplannedOrders; switch (c) { //15% chance to add a random order to the solution case 0:case 1:case 2: result = Verbeteringen.AddOrder(list, upOrders, orders, rand); list = result.Key; upOrders = result.Value; break; //10% chance to remove a random order from the solution case 3:case 4: result = Verbeteringen.RemoveOrder(list, upOrders, orders, rand); list = result.Key; upOrders = result.Value; break; //20% chance to change the solution with 2-opt case 5:case 6:case 7:case 8: day = rand.Next(5); truck = rand.Next(2); list[truck, day] = Verbeteringen.Opt(list[truck, day]); break; //15% chance to change the order of a route randomly case 9:case 10:case 11: day = rand.Next(5); truck = rand.Next(2); list[truck, day] = Verbeteringen.RandomChange(list[truck, day], rand); break; //15% chance to change the day of an order case 12:case 13:case 14: list = Verbeteringen.ChangeDay(list, rand); break; //15% chance to change the truck of an order case 15:case 16:case 17: list = Verbeteringen.ChangeTruck(list, rand); break; //5% chance to add a trip to the dump case 18: list = Verbeteringen.AddDump(list, rand); //TODO break; //5% chance to remove a trip to the dump case 19: list = Verbeteringen.RemoveDump(list, rand); //TODO break; } return new KeyValuePair<List<Order>[,], List<int>>(list, upOrders); }
public int RijTijden(List<Order>[,] oplossing, Order[] orders, int[,] reistijden, List<int> nietIngepland) { int rijtijden = 0; for (int i1 = 0; i1 < 2; i1++) { for (int i2 = 0; i2 < 5; i2++) { rijtijden += checkRijTijd(oplossing[i1, i2], orders, reistijden); } } return rijtijden; }
public int checkRijTijd(List<Order> oplossing, Order[] orders, int[,] reistijden) { int rijtijd = 0; int j = 1; while (oplossing.Count > j && mogelijk) { rijtijd += reistijden[oplossing[j - 1].routeNummer, oplossing[j].routeNummer]; rijtijd += (int)oplossing[j].legingsDuur * 60; j++; } return rijtijd; }
public List<Order>[,] StartOplossing(Order[] orders) { List<Order>[,] oplossingen = new List<Order>[2,5]; for (int i = 0; i < 2; i++) { for (int k = 0; k < 5; k++) { oplossingen[i, k] = new List<Order>(); } } StreamReader r2 = new StreamReader("startfiles/OplossingFile.txt"); string newLine = r2.ReadLine(); int j = 0; while (newLine != null) { string[] newLines = newLine.Split(';'); for (int i = 0; i < orders.Length; i++) { if (orders[i].orderNummer == int.Parse(newLines[3])) oplossingen[int.Parse(newLines[0]) - 1, int.Parse(newLines[1]) - 1].Add(orders[i]); else continue; break; } if (int.Parse(newLines[3]) == 0) { // oplossingen[int.Parse(newLines[0]) + int.Parse(newLines[1])].stort[j] = int.Parse(newLines[2]); // j++; } newLine = r2.ReadLine(); } return oplossingen; }
public Order[] OrderList() { Order[] orders = new Order[1178]; /* Moet je aanpassen */ StreamReader r3 = new StreamReader("startfiles/OrderFile.txt"); string newLine = r3.ReadLine(); int i = 1; orders[0] = new Order(0, 0, 0, 0, 30,56343016,513026712, 0); while (newLine != null) { string[] newLines = newLine.Split(';'); string[] newLines2 = newLines[2].Split('P'); for (int j = 0; j < newLines.Length; j++) { newLines[j].Trim(); } orders[i] = new Order(int.Parse(newLines[0]), int.Parse(newLines2[0]), int.Parse(newLines[3]), int.Parse(newLines[4]), double.Parse(newLines[5], CultureInfo.InvariantCulture), double.Parse(newLines[7], CultureInfo.InvariantCulture), double.Parse(newLines[8], CultureInfo.InvariantCulture),int.Parse(newLines[6])); i++; newLine = r3.ReadLine(); } return orders; }
//Parameters: Huidige oplossing, niet-ingeplande orders, de lijst van alle orders // return: nieuwe oplossing, nieuwe lijst van niet-ingeplande orders. public static KeyValuePair<List<Order>[, ], List<int>> RemoveOrder(List<Order>[,] oldList, List<int> unplannedOrders, Order[] orders, Random rand) { int day = rand.Next(5); int truck = rand.Next(2); List<int> upOrders = unplannedOrders; List<Order>[,] list = oldList; if (list[truck, day].Count != 0) { int removableIndex = rand.Next(list[truck, day].Count); Order removable = list[truck, day][removableIndex]; if (removable.orderNummer != 0) { int count = 0; for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { if (count >= removable.aantalOphalen) break; if (list[i, j].Remove(removable)) { count++; } } } upOrders.Add(removable.orderNummer); } } return new KeyValuePair<List<Order>[,], List<int>>(list, upOrders); }
public List<int> UnPlannedOrders(Order[] orders, List<Order>[,] oplossingen) { List<int> unPlannedOrders = new List<int>(); for (int i = 0; i < 1178; i++) { bool finishedorder = false; for (int j1 = 0; j1 < 2; j1++) { for (int j2 = 0; j2 < 5; j2++) { int k = 0; while (oplossingen[j1, j2].Count > k) { if (oplossingen[j1, j2][k] == orders[i]) { finishedorder = true; break; } k++; } if (finishedorder) break; } if (finishedorder) break; } if (finishedorder) continue; unPlannedOrders.Add(orders[i].orderNummer); } return unPlannedOrders; }