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); }
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); }