Ejemplo n.º 1
0
        void CalculateRoute()
        {
            var pokestopsNotOnCooldown = bot.Map.Pokestops.Where(p => p.IsActive);

            route = RouteOptimizer.Optimize(pokestopsNotOnCooldown, bot.Player.Position);
            Route.Clear();
            Route.AddRange(route.Select(r => r.Position));
            RaisePropertyChanged(nameof(Route));
        }
Ejemplo n.º 2
0
    // crossover
    private static List <RouteScheme> Crossover(RouteScheme p1, RouteScheme p2, int routeLength, bool simple)
    {
        List <RouteScheme> children = new List <RouteScheme>(2)
        {
            new RouteScheme(), new RouteScheme()
        };

        if (simple)
        {
            for (int i = 0; i < p1.Routes.Count; i++)
            {
                if (Random.value <= 0.5)
                {
                    children[0].Routes.Add(new SimpleRoute(p1.Routes[i]));
                    children[1].Routes.Add(new SimpleRoute(p2.Routes[i]));
                }
                else
                {
                    children[0].Routes.Add(new SimpleRoute(p2.Routes[i]));
                    children[1].Routes.Add(new SimpleRoute(p1.Routes[i]));
                }
            }
        }
        else
        {
            List <SimpleRoute> routeChildren;
            for (int i = 0; i < p1.Routes.Count; i++)
            {
                if (Random.value <= 0.5)
                {
                    children[0].Routes.Add(new SimpleRoute(p1.Routes[i]));
                    children[1].Routes.Add(new SimpleRoute(p2.Routes[i]));
                }
                else
                {
                    routeChildren = RouteOptimizer.Crossover(p1.Routes[i], p2.Routes[i], routeLength);
                    children[0].Routes.Add(routeChildren[0]);
                    children[1].Routes.Add(routeChildren[1]);
                }
            }
        }

        return(children);
    }
Ejemplo n.º 3
0
    // rewrite the spreaded detection values with zeroes
    public void SpreadZeroes(int id, Vector3 pos)
    {
        float[][] detection = new float[0][];
        int       minX      = 0;
        int       maxX      = 0;
        int       minY      = 0;
        int       maxY      = 0;

        switch (_fitnessFunction)
        {
        case GameManager.FitnessFunctions.DetectionBased:
            detection = RouteOptimizer.SpreadDetection(new Vector2(pos.x, pos.y), this);
            minX      = Mathf.Clamp((int)(pos.x) - RouteOptimizer.Radius, 0, _width - 1);
            maxX      = Mathf.Clamp((int)(pos.x) + RouteOptimizer.Radius, 0, _width - 1);
            minY      = Mathf.Clamp((int)(pos.y) - RouteOptimizer.Radius, 0, _height - 1);
            maxY      = Mathf.Clamp((int)(pos.y) + RouteOptimizer.Radius, 0, _height - 1);
            break;

        case GameManager.FitnessFunctions.IntersectionBased:
            detection = RouteOptimizer2.SpreadDetection(new Vector2(pos.x, pos.y), this);
            minX      = Mathf.Clamp((int)(pos.x) - RouteOptimizer2.Radius, 0, _width - 1);
            maxX      = Mathf.Clamp((int)(pos.x) + RouteOptimizer2.Radius, 0, _width - 1);
            minY      = Mathf.Clamp((int)(pos.y) - RouteOptimizer2.Radius, 0, _height - 1);
            maxY      = Mathf.Clamp((int)(pos.y) + RouteOptimizer2.Radius, 0, _height - 1);
            break;

        case GameManager.FitnessFunctions.IntersectionScheme:
            detection = RouteOptimizer3.SpreadDetection(new Vector2(pos.x, pos.y), this);
            minX      = Mathf.Clamp((int)(pos.x) - RouteOptimizer3.Radius, 0, _width - 1);
            maxX      = Mathf.Clamp((int)(pos.x) + RouteOptimizer3.Radius, 0, _width - 1);
            minY      = Mathf.Clamp((int)(pos.y) - RouteOptimizer3.Radius, 0, _height - 1);
            maxY      = Mathf.Clamp((int)(pos.y) + RouteOptimizer3.Radius, 0, _height - 1);
            break;
        }
        for (int x = minX; x <= maxX; x++)
        {
            for (int y = minY; y < maxY; y++)
            {
                _grid[x][y].Detection[id] = 0f;
            }
        }
    }
        protected void OnButtonAcceptClicked(object sender, EventArgs e)
        {
            try
            {
                SetSensetivity(false);
                var callTaskWorker = new CallTaskWorker(
                    CallTaskSingletonFactory.GetInstance(),
                    new CallTaskRepository(),
                    new OrderRepository(),
                    _employeeRepository,
                    _baseParametersProvider,
                    ServicesConfig.CommonServices.UserService,
                    ErrorReporter.Instance);

                if (Entity.Car == null)
                {
                    MessageDialogHelper.RunWarningDialog("Не заполнен автомобиль");
                    return;
                }
                StringBuilder warningMsg = new StringBuilder($"Автомобиль '{ Entity.Car.Title }':");
                if (Entity.HasOverweight())
                {
                    warningMsg.Append($"\n\t- перегружен на { Entity.Overweight() } кг");
                }

                if (Entity.HasVolumeExecess())
                {
                    warningMsg.Append($"\n\t- объём груза превышен на { Entity.VolumeExecess() } м<sup>3</sup>");
                }

                if (buttonAccept.Label == "Подтвердить" && (Entity.HasOverweight() || Entity.HasVolumeExecess()))
                {
                    if (ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_confirm_routelist_with_overweight"))
                    {
                        warningMsg.AppendLine("\nВы уверены что хотите подтвердить маршрутный лист?");
                        if (!MessageDialogHelper.RunQuestionDialog(warningMsg.ToString()))
                        {
                            return;
                        }
                    }
                    else
                    {
                        warningMsg.AppendLine("\nПодтвердить маршрутный лист нельзя.");
                        MessageDialogHelper.RunWarningDialog(warningMsg.ToString());
                        return;
                    }
                }

                if (Entity.Status == RouteListStatus.New)
                {
                    var valid = new QSValidator <RouteList>(Entity,
                                                            new Dictionary <object, object> {
                        { "NewStatus", RouteListStatus.Confirmed },
                        { nameof(IRouteListItemRepository), new RouteListItemRepository() }
                    });
                    if (valid.RunDlgIfNotValid((Window)this.Toplevel))
                    {
                        return;
                    }

                    Entity.ChangeStatusAndCreateTask(RouteListStatus.Confirmed, callTaskWorker);
                    //Строим маршрут для МЛ.
                    if ((!Entity.PrintsHistory?.Any() ?? true) || MessageDialogHelper.RunQuestionWithTitleDialog("Перестроить маршрут?", "Этот маршрутный лист уже был когда-то напечатан. При новом построении маршрута порядок адресов может быть другой. При продолжении обязательно перепечатайте этот МЛ.\nПерестроить маршрут?"))
                    {
                        RouteOptimizer optimizer = new RouteOptimizer(ServicesConfig.InteractiveService);
                        var            newRoute  = optimizer.RebuidOneRoute(Entity);
                        if (newRoute != null)
                        {
                            createroutelistitemsview1.DisableColumnsUpdate = true;
                            newRoute.UpdateAddressOrderInRealRoute(Entity);
                            //Рассчитываем расстояние
                            using (var calc = new RouteGeometryCalculator())
                            {
                                Entity.RecalculatePlanedDistance(calc);
                            }
                            createroutelistitemsview1.DisableColumnsUpdate = false;
                            var noPlan = Entity.Addresses.Count(x => !x.PlanTimeStart.HasValue);
                            if (noPlan > 0)
                            {
                                MessageDialogHelper.RunWarningDialog($"Для маршрута незапланировано { noPlan } адресов.");
                            }
                        }
                        else
                        {
                            MessageDialogHelper.RunWarningDialog($"Маршрут не был перестроен.");
                        }
                    }

                    Save();

                    if (Entity.GetCarVersion.IsCompanyCar && Entity.Car.CarModel.CarTypeOfUse == CarTypeOfUse.Truck && !Entity.NeedToLoad)
                    {
                        if (MessageDialogHelper.RunQuestionDialog(
                                "Маршрутный лист для транспортировки на склад, перевести машрутный лист сразу в статус '{0}'?",
                                RouteListStatus.OnClosing.GetEnumTitle()))
                        {
                            Entity.CompleteRouteAndCreateTask(_wageParameterService, callTaskWorker, _trackRepository);
                        }
                    }
                    else
                    {
                        //Проверяем нужно ли маршрутный лист грузить на складе, если нет переводим в статус в пути.
                        var needTerminal = Entity.Addresses.Any(x => x.Order.PaymentType == PaymentType.Terminal);

                        if (!Entity.NeedToLoad && !needTerminal)
                        {
                            if (MessageDialogHelper.RunQuestionDialog("Для маршрутного листа, нет необходимости грузится на складе. Перевести маршрутный лист сразу в статус '{0}'?", RouteListStatus.EnRoute.GetEnumTitle()))
                            {
                                valid = new QSValidator <RouteList>(
                                    Entity,
                                    new Dictionary <object, object>
                                {
                                    { "NewStatus", RouteListStatus.EnRoute },
                                    { nameof(IRouteListItemRepository), new RouteListItemRepository() }
                                });
                                if (!valid.IsValid)
                                {
                                    return;
                                }

                                Entity.ChangeStatusAndCreateTask(valid.RunDlgIfNotValid((Window)this.Toplevel) ? RouteListStatus.New : RouteListStatus.EnRoute, callTaskWorker);
                            }
                            else
                            {
                                Entity.ChangeStatusAndCreateTask(RouteListStatus.New, callTaskWorker);
                            }
                        }
                    }
                    Save();
                    UpdateButtonStatus();
                    createroutelistitemsview1.SubscribeOnChanges();
                    UpdateAdditionalLoadingWidgets();

                    return;
                }
                if (Entity.Status == RouteListStatus.InLoading || Entity.Status == RouteListStatus.Confirmed)
                {
                    if (_routeListRepository.GetCarLoadDocuments(UoW, Entity.Id).Any())
                    {
                        MessageDialogHelper.RunErrorDialog("Для маршрутного листа были созданы документы погрузки. Сначала необходимо удалить их.");
                    }
                    else
                    {
                        Entity.ChangeStatusAndCreateTask(RouteListStatus.New, callTaskWorker);
                    }
                    UpdateButtonStatus();
                    return;
                }
            }
            finally
            {
                SetSensetivity(true);
            }
            UpdateDlg(_isLogistican);
        }
Ejemplo n.º 5
0
        protected void OnButtonAcceptClicked(object sender, EventArgs e)
        {
            if (buttonAccept.Label == "Подтвердить" && Entity.HasOverweight())
            {
                if (QSMain.User.Permissions["can_confirm_routelist_with_overweight"])
                {
                    if (
                        !MessageDialogHelper.RunQuestionDialog(
                            String.Format(
                                "Вы перегрузили '{0}' на {1} кг.\nВы уверены что хотите подтвердить маршрутный лист?",
                                Entity.Car.Title,
                                Entity.Overweight()
                                )
                            )
                        )
                    {
                        return;
                    }
                }
                else
                {
                    MessageDialogHelper.RunWarningDialog(
                        String.Format(
                            "Вы перегрузили '{0}' на {1} кг.\nПодтвердить маршрутный лист нельзя.",
                            Entity.Car.Title,
                            Entity.Overweight()
                            )
                        );
                    return;
                }
            }

            if (UoWGeneric.Root.Status == RouteListStatus.New)
            {
                var valid = new QSValidator <RouteList>(UoWGeneric.Root,
                                                        new Dictionary <object, object> {
                    { "NewStatus", RouteListStatus.InLoading }
                });
                if (valid.RunDlgIfNotValid((Window)this.Toplevel))
                {
                    return;
                }

                UoWGeneric.Root.ChangeStatus(RouteListStatus.InLoading);

                foreach (var address in UoWGeneric.Root.Addresses)
                {
                    if (address.Order.OrderStatus < Domain.Orders.OrderStatus.OnLoading)
                    {
                        address.Order.ChangeStatus(Domain.Orders.OrderStatus.OnLoading);
                    }
                }

                //Строим маршрут для МЛ.
                if (!Entity.Printed || MessageDialogHelper.RunQuestionWithTitleDialog("Перестроить маршрут?", "Этот маршрутный лист уже был когда-то напечатан. При новом построении маршрута порядок адресов может быть другой. При продолжении обязательно перепечатайте этот МЛ.\nПерестроить маршрут?"))
                {
                    RouteOptimizer optimizer = new RouteOptimizer();
                    var            newRoute  = optimizer.RebuidOneRoute(Entity);
                    if (newRoute != null)
                    {
                        createroutelistitemsview1.DisableColumnsUpdate = true;
                        newRoute.UpdateAddressOrderInRealRoute(Entity);
                        //Рассчитываем расстояние
                        Entity.RecalculatePlanedDistance(new Tools.Logistic.RouteGeometryCalculator(Tools.Logistic.DistanceProvider.Osrm));
                        createroutelistitemsview1.DisableColumnsUpdate = false;
                        var noPlan = Entity.Addresses.Count(x => !x.PlanTimeStart.HasValue);
                        if (noPlan > 0)
                        {
                            MessageDialogHelper.RunWarningDialog($"Для маршрута незапланировано {noPlan} адресов.");
                        }
                    }
                    else
                    {
                        MessageDialogHelper.RunWarningDialog($"Маршрут не был перестроен.");
                    }
                }

                Save();

                if (UoWGeneric.Root.Car.TypeOfUse == CarTypeOfUse.Truck)
                {
                    if (MessageDialogHelper.RunQuestionDialog("Маршрутный лист для транспортировки на склад, перевести машрутный лист сразу в статус '{0}'?", RouteListStatus.OnClosing.GetEnumTitle()))
                    {
                        Entity.ChangeStatus(RouteListStatus.OnClosing);
                        foreach (var item in UoWGeneric.Root.Addresses)
                        {
                            item.Order.OrderStatus = Domain.Orders.OrderStatus.OnTheWay;
                        }
                        Entity.CompleteRoute();
                    }
                }
                else
                {
                    //Проверяем нужно ли маршрутный лист грузить на складе, если нет переводим в статус в пути.
                    var forShipment = Repository.Store.WarehouseRepository.WarehouseForShipment(UoW, Entity.Id);
                    if (forShipment.Count == 0)
                    {
                        if (MessageDialogHelper.RunQuestionDialog("Для маршрутного листа, нет необходимости грузится на складе. Перевести машрутный лист сразу в статус '{0}'?", RouteListStatus.EnRoute.GetEnumTitle()))
                        {
                            valid = new QSValidator <RouteList>(
                                UoWGeneric.Root,
                                new Dictionary <object, object> {
                                { "NewStatus", RouteListStatus.EnRoute }
                            }
                                );

                            Entity.ChangeStatus(valid.RunDlgIfNotValid((Window)this.Toplevel) ? RouteListStatus.New : RouteListStatus.EnRoute);
                        }
                        else
                        {
                            Entity.ChangeStatus(RouteListStatus.New);
                        }
                    }
                }
                Save();
                UpdateButtonStatus();
                return;
            }
            if (UoWGeneric.Root.Status == RouteListStatus.InLoading)
            {
                if (RouteListRepository.GetCarLoadDocuments(UoW, Entity.Id).Any())
                {
                    MessageDialogHelper.RunErrorDialog("Для маршрутного листа были созданы документы погрузки. Сначала необходимо удалить их.");
                }
                else
                {
                    UoWGeneric.Root.ChangeStatus(RouteListStatus.New);
                }
                UpdateButtonStatus();
                return;
            }
        }
Ejemplo n.º 6
0
    // use GA to find the patrol route scheme and construct guards from them
    private void SetGuards()
    {
        GameObject tempGuard;
        Guard      behavior;

        _guardControllers = new List <GuardController>();

        List <SimpleRoute> lr = new List <SimpleRoute>();

        switch (FitnessFunction)
        {
        case FitnessFunctions.DetectionBased:
            lr = RouteOptimizer.FindScheme(NumberOfGuards, CrossoverPerStage, MapGrid, NumberOfIterations,
                                           RouteGenotypeLength, MutationProbability, DetectionRadius, DetectionDecayTime, FitnessBinsX,
                                           FitnessBinsY, RandomSeed);
            break;

        case FitnessFunctions.IntersectionBased:
            lr = RouteOptimizer2.FindScheme(NumberOfGuards, CrossoverPerStage, MapGrid, NumberOfIterations,
                                            RouteGenotypeLength, MutationProbability, DetectionRadius, DetectionDecayTime, FitnessBinsX,
                                            FitnessBinsY, RandomSeed);
            break;

        case FitnessFunctions.IntersectionScheme:
            lr = RouteOptimizer3.FindScheme(NumberOfSchemes, NumberOfGuards, CrossoverPerStage, SimpleCrossover, MapGrid,
                                            NumberOfIterations, RouteGenotypeLength, MutationProbability, RouteMutationProbability, UseMinFunction,
                                            DetectionRadius, DetectionDecayTime, RandomSeed);
            break;
        }
        Vector2 curNode, prevNode;
        Color   color;

        float totalFitness = 0f;

        for (int i = 0; i < NumberOfGuards; i++)
        {
            totalFitness += lr[i].Fitness;
            tempGuard     = Instantiate(GuardPrefab, GuardContainer);
            behavior      = new Guard(lr[i]);
            tempGuard.transform.position = new Vector3(lr[i].StartNode.x, lr[i].StartNode.y, 0f);

            do
            {
                color = new Color(Random.value, Random.value, Random.value);
            }while (color.grayscale > 0.75);
            tempGuard.GetComponent <GuardController>().color = color;

            curNode = lr[i].StartNode;
            MapGrid.ModifyNodeText(curNode, i.ToString());

            for (int j = 0; j < lr[i].PatrolRoutePhen.Count; j++)
            {
                prevNode = curNode;
                curNode  = MapGrid.Move(curNode, lr[i].PatrolRoutePhen[j].Direction);

                MapGrid.ModifyNodeText(curNode, i.ToString());
                MapGrid.ModifyRouteDisplay(prevNode, curNode, lr[i].PatrolRoutePhen[j].Direction, color);
            }

            tempGuard.GetComponent <GuardController>().Behavior = behavior;
            tempGuard.GetComponent <GuardController>().SetAlarmLimits(MinOutputToCheck, MinOutputForAlarm);
            _guardControllers.Add(tempGuard.GetComponent <GuardController>());
        }

        totalFitness             /= NumberOfGuards;
        FitnessDisplayField.text += totalFitness.ToString();
    }