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