public string GetRouteInfo(List <Instance> dataset, List <int> route, IDistanceCalculator distanceCalculator) { string strToShow = string.Empty; double time = 0.0; for (int i = 0; i < route.Count; i++) { var instance1 = dataset.FirstOrDefault(item => item.ID == route[i]); Instance instance2; if (i + 1 == route.Count) { instance2 = dataset.FirstOrDefault(item => item.ID == route[0]); } else { instance2 = dataset.FirstOrDefault(item => item.ID == route[i + 1]); } double length = distanceCalculator.FindLength(instance1, instance2); strToShow += "\nCurrent point: " + instance1.ID + " with capacity " + instance1.Demand + "\n"; strToShow += "Ready time: " + instance1.ReadyTime + " Due time: " + instance1.DueTime + " Service time: " + instance1.ServiceTime; strToShow += "\nDistance to next point: " + length; strToShow += " Current time: " + time + "\n"; double futureTime = time + length + instance2.ServiceTime; if (futureTime < instance2.ReadyTime) { time = instance2.ReadyTime; } else { time += length + instance2.ServiceTime; } } return(strToShow); }
public void CalculatePenalties(List <Instance> dataset, List <int> newRoute, IDistanceCalculator distanceCalculator, out double latePenalty, out double waitPenalty) { double currentTime = 0.0; latePenalty = 0.0; waitPenalty = 0.0; for (int i = 0; i < newRoute.Count; i++) { var intstance1 = dataset.FirstOrDefault(item => item.ID == newRoute[i]); Instance instance2; if (i + 1 == newRoute.Count) { instance2 = dataset.FirstOrDefault(item => item.ID == newRoute[0]); } else { instance2 = dataset.FirstOrDefault(item => item.ID == newRoute[i + 1]); } double currDist = distanceCalculator.FindLength(intstance1, instance2); double futureTime = currentTime + currDist; if (futureTime > instance2.DueTime && futureTime < (instance2.DueTime + Parameters.SOFT_DUE_WINDOW)) { latePenalty += futureTime - instance2.DueTime; } if (futureTime < instance2.ReadyTime) { waitPenalty += instance2.ReadyTime - currentTime; } } }
public List <int> Run(float vehicleCapacity, List <float> currentVehicleCapasity, int currentVehicleIndex) { var route = new List <int>(); int counter = 0; do { route.Clear(); int startPoint = 0; double currentTime = 0.0; route.Add(startPoint); dataset.FirstOrDefault(item => item.ID == startPoint).IsDone = true; while (!dataset.All(item => item.IsDone)) { var distDict = distanceCalculator.CalculateDistance(dataset, startPoint); if (distDict.Count == 0) { break; } double cMin = distDict.Min(x => x.Value); double cMax = distDict.Max(x => x.Value); double criteria = cMin + Parameters.ALPHA * (cMax - cMin); double demandCriteria = vehicleCapacity - currentVehicleCapasity[currentVehicleIndex]; var listWithGoodPoints = new List <Instance>(); foreach (var dist in distDict) { var tmp_inst = dataset.FirstOrDefault(item => item.ID == dist.Key); double futureTime = currentTime + dist.Value; bool timeWindowCriteria = (futureTime < tmp_inst.DueTime + Parameters.SOFT_DUE_WINDOW); if (dist.Value <= criteria && tmp_inst.Demand <= demandCriteria && timeWindowCriteria) { listWithGoodPoints.Add(tmp_inst); } } var RCL = new HashSet <int>(); foreach (var point in listWithGoodPoints) { double cMinReadyTime = listWithGoodPoints.Min(x => x.ReadyTime); double cMaxReadyTime = listWithGoodPoints.Max(x => x.ReadyTime); double criteriaReadyTime = cMinReadyTime + Parameters.ALPHA_READY_TIME * (cMaxReadyTime - cMinReadyTime); if (point.ReadyTime <= criteriaReadyTime) { RCL.Add(point.ID); } } if (RCL.Count == 0) { break; } else { var prevStartPoint = dataset.FirstOrDefault(item => item.ID == startPoint); Random random = new Random(); startPoint = RCL.ElementAt(random.Next(RCL.Count)); var inst = dataset.FirstOrDefault(item => item.ID == startPoint); currentVehicleCapasity[currentVehicleIndex] += inst.Demand; float dist = (float)distanceCalculator.FindLength(inst, prevStartPoint); double futureTime = currentTime + dist; if (futureTime < inst.ReadyTime) { currentTime = inst.ReadyTime; } currentTime += dist + inst.ServiceTime; route.Add(startPoint); dataset.FirstOrDefault(item => item.ID == startPoint).IsDone = true; } } route.Add(0); counter++; } while (!evaluator.CanExistWithCurrentTimeWindows(dataset, route, distanceCalculator) || route.Count <= 2); return(route); }