예제 #1
0
        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);
        }
예제 #2
0
        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;
                }
            }
        }
예제 #3
0
        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);
        }