コード例 #1
0
        public double Calc(Genome genome, GASettings settings)
        {
            try
            {
                var trucks      = genome.Trucks;
                var totalMetros = trucks.Sum(t => t.Routes.Sum(r => r.Metros) + (t.DepotBack?.Metros ?? 0D));

                var totalEsperaDepois = 0D;
                var totalEsperaAntes  = 0D;
                var today             = genome.Map.DataSaida;

                foreach (var truck in trucks)
                {
                    var start  = genome.Map.DataSaida;
                    var finish = start;


                    foreach (var route in truck.Routes.Concat(new[] { truck.DepotBack }))
                    {
                        if (route == null)
                        {
                            continue;
                        }

                        var date = finish.AddMinutes(route.Minutos);
                        var from = CreateDateTime(today, route.Destino.Period.From);
                        var to   = CreateDateTime(today, route.Destino.Period.To);

                        route.Descarga = route.Destino.Period.Descarga * 60;

                        if (date > to)
                        {
                            date = date.AddDays(1);
                            totalEsperaDepois += (date - to).TotalSeconds;
                            date       = new DateTime(date.Year, date.Month, date.Day, from.Hour, from.Minute, from.Second);
                            route.Late = true;
                        }

                        if (date < from)
                        {
                            route.Espera      = (from - date).TotalSeconds;
                            totalEsperaAntes += route.Espera;
                            date              = date.Add(from - date);
                        }

                        route.DhSaida   = finish;
                        route.DhChegada = date;
                        finish          = date.AddMinutes(route.Destino.Period.Descarga);
                    }
                }
                return(totalMetros +
                       (totalEsperaDepois * settings.ArriveAfterPenalty) +
                       (totalEsperaAntes * settings.ArriveBeforePenalty));
            }
            catch (Exception ex)
            {
                throw;
            }
        }
コード例 #2
0
        int ProcessChunk = 1; // quantidade de requests simultaneos

        public GeneticAlgorithmFinder(IRouteService routeService, GASettings settings)
        {
            this.routeService = routeService;

            Mutate             = MutateFactory.GetImplementation(settings.Mutation, settings);
            Crossover          = CrossoverFactory.GetImplementation(settings.Crossover, settings, routeService);
            PopulationSize     = settings.PopulationSize;
            GenerationLimit    = settings.GenerationLimit;
            BestSolutionToPick = settings.BestSolutionToPick;
            ProcessChunk       = settings.Throttle;
            Settings           = settings;
        }
コード例 #3
0
 public static Genome Generator(Roteiro map, GASettings settings) => new Genome(map, settings);
コード例 #4
0
 public Genome(Roteiro map, GASettings settings)
 {
     Map      = map;
     Settings = settings;
     Initialize();
 }