public float Fitness(GameBehaviourScript game, OptimizationData optimizationData)
    {
        float fitness = 0;

        if (optimizationData.FirstAwayContactWithBallTime < float.MaxValue)
        {
            fitness += 150 - optimizationData.FirstAwayContactWithBallTime;
        }
        else
        {
            foreach (var p in game.Players)
            {
                if (p.Team == Team.Away)
                {
                    fitness -= Vector3.Distance(p.PivotPoint, game.Ball.PivotPoint);
                }
            }
        }

        if (game.Ball.controllingPlayer == null || game.Ball.controllingPlayer.Team == Team.Home)
        {
            fitness -= 50;
        }

        return(fitness);
    }
Ejemplo n.º 2
0
        private List <Point> CreateResult(OptimizationData res, GetFuelStationsDto[] stations, Trip trip)
        {
            List <Point> result         = new List <Point>();
            int          currentPoint   = 0;
            int          currentStation = 0;

            for (int i = 0; i < stations.Length; ++i)
            {
                if (stations[i].Type == StationType.Waypoint)
                {
                    result.Add(trip.InputPoints[currentPoint++].GetCopy());
                }
                else
                {
                    if (res.Refuels[currentStation] < 1e-5)
                    {
                        currentStation++;
                        continue;
                    }
                    var station = stations[i];
                    var fsPoint = new Point
                    {
                        Name      = station.Name,
                        Address   = station.Address,
                        Refuel    = Math.Round(res.Refuels[currentStation++], 3),
                        Longitude = station.Coords.Lng,
                        Latitude  = station.Coords.Lat,
                        Type      = PointType.FuelStation,
                        Cost      = station.Cost
                    };
                    if (station.Junction0 is null)
                    {
                        result.Add(fsPoint);
                    }
                    else
                    {
                        result.AddRange(new[] {
                            new Point
                            {
                                Longitude = station.Junction0.Lng,
                                Latitude  = station.Junction0.Lat,
                                Type      = PointType.Junction
                            },
                            fsPoint,
                            new Point
                            {
                                Longitude = station.Junction1.Lng,
                                Latitude  = station.Junction1.Lat,
                                Type      = PointType.Junction
                            }
                        });
                    }
                }
            }
            _logger.LogDebug(JsonConvert.SerializeObject(result));
            return(result);
        }
    public float Fitness(GameBehaviourScript game, OptimizationData optimizationData)
    {
        float fitness = 0;

        fitness -= optimizationData.FinalBallDistanceToHomeGoal;
        fitness += (game.Score.Goals[Team.Away] - game.Score.Goals[Team.Home]) * 100.0f;

        return(fitness);
    }
Ejemplo n.º 4
0
        public void StartOptimization(Trip trip)
        {
            Task.Run(async() =>
            {
                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    IHttpClientFactory clientFactory = scope.ServiceProvider.GetRequiredService <IHttpClientFactory>();

                    var(stations, optimization) = await CreateFuelData(trip, clientFactory);
                    var noOptimizaton           = optimization.GetCopy();
                    double maxCost      = noOptimizaton.Costs.Max();
                    noOptimizaton.Costs = noOptimizaton.Costs.Select(x => x = maxCost + 1 - x).ToArray();
                    _logger.LogInformation(JsonConvert.SerializeObject(optimization));
                    HttpClient optimizationClient = clientFactory.CreateClient("fuelOptimization");

                    OptimizationData res      = await(await optimizationClient.PostAsync("/optimization", new StringContent(JsonConvert.SerializeObject(optimization), Encoding.UTF8, "application/json"))).Content.ReadAsAsync <OptimizationData>();
                    OptimizationData noOptRes = await(await optimizationClient.PostAsync("/optimization", new StringContent(JsonConvert.SerializeObject(noOptimizaton), Encoding.UTF8, "application/json"))).Content.ReadAsAsync <OptimizationData>();
                    var optPoints             = CreateResult(res, stations, trip);
                    var noOptPoints           = CreateResult(noOptRes, stations, trip);

                    /// this code is greedy algorithm
                    noOptRes.Refuels = optimization.Volumes;
                    double started   = optimization.Remainder;
                    int i            = 0;
                    while (started > 0 && i < noOptRes.Refuels.Count())
                    {
                        if (noOptRes.Refuels[i] <= started)
                        {
                            started            -= noOptRes.Refuels[i];
                            noOptRes.Refuels[i] = 0;
                        }
                        else
                        {
                            noOptRes.Refuels[i] -= started;
                            started              = 0;
                        }
                        i++;
                    }
                    noOptPoints.Add(new Point
                    {
                        Type = PointType.Split
                    });
                    noOptPoints.AddRange(CreateResult(noOptRes, stations, trip));

                    IDbService dbService = scope.ServiceProvider.GetRequiredService <IDbService>();
                    await dbService.AddOptimizedPointsAsync(trip.Id, optPoints, noOptPoints);

                    _logger.LogInformation(JsonConvert.SerializeObject(optimization));

                    await _hubContext.Clients.All.UpdateTrip(await dbService.GetTripAsync(trip.Id));
                    // await _hubContext.Clients.Group(trip.UserId).ReceiveTripUpdate(trip.Id, "done", optPoints);
                    // await _hubContext.Clie5nts.Group(trip.DriverId.ToString()).ReceiveTripUpdate(trip.Id, "done", optPoints);
                }
            });
        }
    public float Fitness(GameBehaviourScript game, OptimizationData optimizationData)
    {
        float fitness = 0;

        fitness -= optimizationData.FinalBallDistanceToHomeGoal;

        if (optimizationData.AwayCorner)
        {
            fitness += 5.0f;
        }

        if (game.Score.Goals[Team.Away] > 0)
        {
            fitness = 100;
        }

        fitness -= game.Clock.TotalSeconds / (Args.Minutes * 60);

        return(fitness);
    }