Beispiel #1
0
        public override IEntity Decode(MultiKey islandKey, Dictionary <MultiKey, IEntity> entities)
        {
            EntityCount++;
            SortedSubsetChromosomeValidator.EntityCount = EntityCount;

            var entity     = entities[Key] as VehicleSchedulingEntity;
            var chromosome = entity.Chromosomes[Key[0]] as SortedSubsetChromosome;

            entity.VehiclesCount = chromosome.Sections.Length;

            for (int s = 0; s < chromosome.Sections.Length; s++)
            {
                //int DailyFirstTime = InitData.Trips[chromosome.Sections[s][0]].ArrivalTime;
                //int length = chromosome.Sections[s].Length;
                //int DailyLastTime = InitData.Trips[chromosome.Sections[s][length-1]].DepartureTime;
                //int? AMLastTime = null;
                //int? PMFirstTime = null;

                for (int p = 0; p < chromosome.Sections[s].Length - 1; p++)
                {
                    if (ConflictDetector.ConflictDetected(chromosome.Sections[s][p], chromosome.Sections[s][p + 1]))
                    {
                        throw new ApplicationException("Shit happend");
                        //return null;    //hard conflict
                    }

                    var trip1 = InitData.Trips[chromosome.Sections[s][p]];
                    var trip2 = InitData.Trips[chromosome.Sections[s][p + 1]];

                    double distance = InitData.GetDistance(trip1.LastStopId, trip2.FirstStopId);
                    entity.TotalDeadMileage += distance;

                    //if ((trip1.DepartureTime <= 720) && (!AMLastTime.HasValue || trip1.DepartureTime > AMLastTime)) AMLastTime = trip1.DepartureTime;
                    //if ((trip1.ArrivalTime >= 720) && (!PMFirstTime.HasValue || trip1.ArrivalTime < PMFirstTime)) PMFirstTime = trip1.ArrivalTime;
                }

                //var lastTrip = InitData.Trips[chromosome.Sections[s][length-1]];
                //if ((lastTrip.DepartureTime <= 720) && (!AMLastTime.HasValue || lastTrip.DepartureTime > AMLastTime)) AMLastTime = lastTrip.DepartureTime;
                //if ((lastTrip.ArrivalTime >= 720) && (!PMFirstTime.HasValue || lastTrip.ArrivalTime < PMFirstTime)) PMFirstTime = lastTrip.ArrivalTime;

                //entity.TotalActiveTime += DailyLastTime - DailyFirstTime;
                //if (AMLastTime.HasValue) entity.TotalActiveTime -= (720 - AMLastTime.Value);
                //if (PMFirstTime.HasValue) entity.TotalActiveTime -= (PMFirstTime.Value - 720);
            }

            var fitness0 = 1 / (1 + entity.TotalDeadMileage);
            var fitness1 = 1 / (1 + (double)entity.VehiclesCount);
            MultiObjectiveFitness fitness = new MultiObjectiveFitness(new double[] { fitness0, fitness1 });

            //fitness.Value[2] = 1 / (1 + (double) entity.TotalActiveTime);
            //GetAverageLengthOfLongSections(chromosome.Sections);

            entity.SetFitness(fitness);

            return(entity);
        }
Beispiel #2
0
        private List <KeyValuePair <double, int> > CheckFitVehicles(List <List <int> > indices, int i)
        {
            var fitVehicles = new List <KeyValuePair <double, int> >();

            for (int s = 0; s < indices.Count; s++)
            {
                var previousIndex = indices[s][indices[s].Count - 1];

                if (!ConflictDetector.ConflictDetected(previousIndex, i))
                {
                    var trip1    = InitData.Trips[previousIndex];
                    var trip2    = InitData.Trips[i];
                    var distance = InitData.GetDistance(trip1.LastStopId, trip2.FirstStopId);
                    fitVehicles.Add(new KeyValuePair <double, int>(distance, s));
                }
            }

            return(fitVehicles);
        }