private void CanvasAreaForSchemeOfRoom_Initialized(object sender, EventArgs e) { Canvas canvas = (Canvas)sender; canvas.Width = SingleSpaceParams.getInstance().Width; canvas.Height = SingleSpaceParams.getInstance().Height; }
private static bool AlgorithmOfCheckIntersection(Gene A, Gene B) { int width = SingleSpaceParams.getInstance().Width; int height = SingleSpaceParams.getInstance().Height; /*Длина прямой от центра первого круга до центра второго круга*/ double radiusLenght = Math.Sqrt( Math.Pow((A.OX - B.OX), 2) + Math.Pow((A.OY - B.OY), 2) ); /* * Данное условие провярет на: * -Пересечение двух окружностей не более, чем на половину радиуса каждого круга. * -Размещение одной окружности внутри другой окружности * -Размещение окружностей относительно границ плоскости */ //ToDo проверка на размеры плоскости индивидуально по хромосоме if ( (Convert.ToInt32(radiusLenght) >= ((A.Radius / 2) + (B.Radius / 2))) && !(Convert.ToInt32(radiusLenght) < A.Radius - B.Radius) && ((B.OX - B.Radius) >= (0 - B.Radius) && (B.OX + B.Radius <= (width + B.Radius))) && ((B.OY - B.Radius) >= (0 - B.Radius) && (B.OY + B.Radius <= (height + B.Radius))) ) { return(false); } else { //Недопустимое размещение return(true); } }
private void FuncByPopulationRelationship_Click(object sender, RoutedEventArgs e) { if (SingleSpaceParams.getInstance().RatingByOrder.Count > 0) { new ResultCharts(SingleSpaceParams.getInstance().RatingByOrder).Show(); } }
private void setSumOfPopulationButton_Click(object sender, RoutedEventArgs e) { if (!String.IsNullOrEmpty(sumOfPopulationTextBox.Text)) { SingleSpaceParams.getInstance().SumOfChromosomeInPopulation = int.Parse(sumOfPopulationTextBox.Text); this.Close(); } }
private void setProbabilityOfMutationButton_Click(object sender, RoutedEventArgs e) { if (!String.IsNullOrEmpty(probabilityOfMutationTextBox.Text)) { SingleSpaceParams.getInstance().PropabilityOfMutation = double.Parse(probabilityOfMutationTextBox.Text); this.Close(); } }
public OpenExistProjectPage() { InitializeComponent(); SingleSpaceParams.KillSingle(); if (chooseProjectTextBlock.IsEnabled == false) { chooseProjectTextBlock.Opacity = 0.1; } }
/*Оценка фитнесс-функции*/ public static double EvaluationOfFitenssFunc(Chromosome chromosome) { double sumOfGenesArea = 0; foreach (Gene gene in chromosome.Container) { sumOfGenesArea += gene.CoverageOfArea; } return(sumOfGenesArea / (SingleSpaceParams.getInstance().Width *SingleSpaceParams.getInstance().Height)); }
private void CanvasAreaForSchemeOfRoom_KeyUp(object sender, KeyEventArgs e) { if (_IsRoom) { if (e.Key == Key.Enter) { if (line != null && line2 != null) { RectangleRoom room = new RectangleRoom { X1 = Convert.ToInt32(line.X1), Y1 = Convert.ToInt32(line.Y1), X2 = Convert.ToInt32(line.X2), Y2 = Convert.ToInt32(line.Y2), X3 = Convert.ToInt32(line2.X2), Y3 = Convert.ToInt32(line2.Y2), X4 = Convert.ToInt32(line4.X2), Y4 = Convert.ToInt32(line4.Y2) }; SingleSpaceParams.getInstance().Rooms.Add(room); } line = null; line2 = null; line3 = null; line4 = null; isPaint = false; pressEnterLabel.Visibility = Visibility.Collapsed; } if (e.Key == Key.Escape) { widthRoomTextBlock.Visibility = Visibility.Collapsed; widthRoomTextBox.Visibility = Visibility.Collapsed; lengthRoomTextBlock.Visibility = Visibility.Collapsed; lengthRoomTextBox.Visibility = Visibility.Collapsed; setLengthAndWidthButton.Visibility = Visibility.Collapsed; if (line != null && line2 != null && line3 != null && line4 != null) { CanvasAreaForSchemeOfRoom.Children.Remove(line); CanvasAreaForSchemeOfRoom.Children.Remove(line2); CanvasAreaForSchemeOfRoom.Children.Remove(line3); CanvasAreaForSchemeOfRoom.Children.Remove(line4); } isPaint = false; } } }
public CreateProjectPage() { InitializeComponent(); SingleSpaceParams.KillSingle(); if (createCustomerTextBlock.IsEnabled == false) { createCustomerTextBlock.Opacity = 0.1; } if (chooseCustomerTextBlock.IsEnabled == false) { chooseCustomerTextBlock.Opacity = 0.1; } }
private static bool checkIntersectionWithArea(Gene gene) { int width = SingleSpaceParams.getInstance().Width; int height = SingleSpaceParams.getInstance().Height; if (((gene.OX - gene.Radius) >= 0 && (gene.OX + gene.Radius <= width)) && ((gene.OY - gene.Radius) >= 0 && (gene.OY + gene.Radius <= height))) { return(false); } else { return(true); } }
private void deleteAll_Click(object sender, RoutedEventArgs e) { CanvasAreaForSchemeOfRoom.Children.Clear(); try { SchemeOfBuilding scheme = _Context.Schemes.Where(c => c.ProjectNumber.ProjectId.Equals(_projectId)).First(); List <ControlPoint> points = new List <ControlPoint>(scheme.Point); if (points.Count > 0) { foreach (ControlPoint point in points) { _Context.Points.Remove(point); } } List <Room> rooms = new List <Room>(scheme.Rooms); if (rooms.Count > 0) { foreach (Room room in rooms) { _Context.Rooms.Remove(room); } } List <InstallationPosition> positions = new List <InstallationPosition>(scheme.Positions); if (positions.Count > 0) { foreach (InstallationPosition position in positions) { _Context.InstallationPositions.Remove(position); } } SingleSpaceParams.getInstance().Rooms.Clear(); SingleSpaceParams.getInstance().ControlPoints.Clear(); _Context.SaveChanges(); } catch { MessageBox.Show("Ошибка! Данные не были изменены."); } }
public MainWindowPage(DB_ConnectionContext context, int projectId) { InitializeComponent(); _Context = context; _projectId = projectId; _BackgroundWorker = ((BackgroundWorker)this.FindResource("backgroundWorker")); InitializeAllObjects(); if (SingleSpaceParams.getInstance().SumOfChromosomeInPopulation == 0) { SingleSpaceParams.getInstance().SumOfChromosomeInPopulation = 8; } if (SingleSpaceParams.getInstance().PropabilityOfMutation == 0) { SingleSpaceParams.getInstance().PropabilityOfMutation = 0.5; } SingleSpaceParams.getInstance().TheBestResolve = 1; SingleSpaceParams.getInstance().ModulesRadius.Clear(); }
private void createFirstPopulation() { /*Создаем популяцию из 10 хромосом. Каждая гена имеет уникальное размещение. */ for (int i = 0; i < SingleSpaceParams.getInstance().SumOfChromosomeInPopulation; i++) { Chromosome chromosome = new Chromosome(); int countOfPosition = 0; foreach (int item in _radiusContainer) { Gene gene = new Gene(item, getRandomValue(0, SingleSpaceParams.getInstance().Width), getRandomValue(0, SingleSpaceParams.getInstance().Height), countOfPosition ); chromosome.Container.Add(gene); countOfPosition++; } GeneticAlgorithm.GA.CheckIntersection(chromosome); _populationContainer.GetSetPopulationContainer.Add(chromosome); _BackgroundWorker.ReportProgress(10, "Создана " + (i + 1) + "-я хромосома в первой популяции"); } /*Хромосома с допустимыми координатами размещения*/ /* * Chromosome chromosome = _populationContainer.GetSetPopulationContainer.ElementAt(0); * Coordinate coords; * List<Coordinate> coordsList = new List<Coordinate>(); * foreach (Gene gene in chromosome.Container) * { * coords = new Coordinate(); * coords.CoordX = gene.OX; * coords.CoordY = gene.OY; * coords.Position = gene.NumOfPosition; * coordsList.Add(coords); * }*/ }
private void OpenExistProjectButton_Click(object sender, RoutedEventArgs e) { try { Project project = _ProjectsFromDB.ElementAt(_SelectedItemInCombobox); SchemeOfBuilding scheme = project.Scheme.First(); if (SingleSpaceParams.getInstance() == null) { SingleSpaceParams.getInstance(Convert.ToInt32(scheme.Width), Convert.ToInt32(scheme.Height)); } else { SingleSpaceParams.KillSingle(); SingleSpaceParams.getInstance(Convert.ToInt32(scheme.Width), Convert.ToInt32(scheme.Height)); } MainWindowPage mainWindow = new MainWindowPage(_Context, project.ProjectId); mainWindow.Show(); } catch { MessageBox.Show("Ошибка! Информация не была получена из базы данных!"); } }
/*Метод описывающий процесс мутации*/ public static void Mutation(Chromosome chr) { var random = new Random(); if (random.NextDouble() <= SingleSpaceParams.getInstance().PropabilityOfMutation) { while (CheckIntersection(chr, 0) != null) { int breakPoint = new Random().Next(0, chr.Container.Count - 1); List <Gene> genesMove = new List <Gene>(); int counter = 0; foreach (Gene gene in chr.Container) { if (counter < breakPoint) { genesMove.Add(gene); counter++; } else { break; } } foreach (Gene gene in genesMove) { chr.Container.Remove(gene); chr.Container.Add(gene); } } } else { return; } }
public static void RefactorBadGeneForWidthFrom(Gene gene, int from) { gene.OX = getRandomValue(from, SingleSpaceParams.getInstance().Width); gene.OY = getRandomValue(0, SingleSpaceParams.getInstance().Height); }
private void saveMenuItem_Click(object sender, RoutedEventArgs e) { SchemeOfBuilding scheme = _Context.Schemes.Where(c => c.ProjectNumber.ProjectId.Equals(_projectId)).First(); List <ModelsOfModules> models = _Context.Models.ToList(); try { if (SingleSpaceParams.getInstance().ControlPoints.Count > 0) { foreach (ControlPointInst cp in SingleSpaceParams.getInstance().ControlPoints) { ControlPoint point = new ControlPoint(); point.Coord_X = cp.X1; point.Coord_Y = cp.Y1; bool isExist = false; foreach (ControlPoint c in scheme.Point) { if (c.Coord_X == point.Coord_X && c.Coord_Y == point.Coord_Y) { isExist = true; } } if (!isExist) { scheme.Point.Add(point); } } } if (SingleSpaceParams.getInstance().Rooms.Count > 0) { foreach (RectangleRoom rm in SingleSpaceParams.getInstance().Rooms) { Room room = new Room(); room.Coord_X1 = rm.X1; room.Coord_Y1 = rm.Y1; room.Coord_X2 = rm.X2; room.Coord_Y2 = rm.Y2; room.Coord_X3 = rm.X3; room.Coord_Y3 = rm.Y3; room.Coord_X4 = rm.X4; room.Coord_Y4 = rm.Y4; bool isExist = false; foreach (Room r in scheme.Rooms) { if (r.Coord_X1 == room.Coord_X1 && r.Coord_Y1 == room.Coord_Y1 && r.Coord_X4 == room.Coord_X4 && r.Coord_Y4 == room.Coord_Y4) { isExist = true; } } if (!isExist) { scheme.Rooms.Add(room); } } } if (_Chromosome != null) { foreach (Gene gene in _Chromosome.Container) { PlacmentOfModules pm = new PlacmentOfModules(); pm.ModelId = (from m in models where m.ModelRadius.Equals(gene.Radius.ToString()) select m).First().ModuleId; InstallationPosition position = new InstallationPosition(); position.Coord_X = gene.OX; position.Coord_Y = gene.OY; position.Placment = new List <PlacmentOfModules>(); position.Placment.Add(pm); scheme.Positions.Add(position); } } _Context.SaveChanges(); } catch { MessageBox.Show("Ошибка! Данные не были сохранены в базу данных."); } MessageBox.Show("Результат сохранен."); }
private void InitializeAllObjects() { SchemeOfBuilding scheme = null; try { scheme = _Context.Schemes.Where(c => c.ProjectNumber.ProjectId.Equals(_projectId)).First(); } catch { MessageBox.Show("Ошибка загрузки данных из базы данных"); } List <Room> rooms = null; if (scheme.Rooms != null) { if (scheme.Rooms.Count() > 0) { rooms = scheme.Rooms; foreach (Room room in rooms) { int coord_X1 = room.Coord_X1; int coord_Y1 = room.Coord_Y1; int coord_X2 = room.Coord_X2; int coord_Y2 = room.Coord_Y2; int coord_X3 = room.Coord_X3; int coord_Y3 = room.Coord_Y3; int coord_X4 = room.Coord_X4; int coord_Y4 = room.Coord_Y4; Line lin = new Line { Stroke = color, StrokeThickness = SIZE, X1 = coord_X1, Y1 = coord_Y1, X2 = coord_X2, Y2 = coord_Y2, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round }; Line lin2 = new Line { Stroke = color, StrokeThickness = SIZE, X1 = coord_X1, Y1 = coord_Y1, X2 = coord_X3, Y2 = coord_Y3, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round }; Line lin3 = new Line { Stroke = color, StrokeThickness = SIZE, X1 = coord_X3, Y1 = coord_Y3, X2 = coord_X4, Y2 = coord_Y4, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round }; Line lin4 = new Line { Stroke = color, StrokeThickness = SIZE, X1 = coord_X2, Y1 = coord_Y2, X2 = coord_X4, Y2 = coord_Y4, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round }; CanvasAreaForSchemeOfRoom.Children.Add(lin); CanvasAreaForSchemeOfRoom.Children.Add(lin2); CanvasAreaForSchemeOfRoom.Children.Add(lin3); CanvasAreaForSchemeOfRoom.Children.Add(lin4); RectangleRoom rectRoom = new RectangleRoom(); rectRoom.X1 = room.Coord_X1; rectRoom.Y1 = room.Coord_Y1; rectRoom.X2 = room.Coord_X2; rectRoom.Y2 = room.Coord_Y2; rectRoom.X3 = room.Coord_X3; rectRoom.Y3 = room.Coord_Y3; rectRoom.X4 = room.Coord_X4; rectRoom.Y4 = room.Coord_Y4; SingleSpaceParams.getInstance().Rooms.Add(rectRoom); } } } if (scheme.Point != null) { List <ControlPoint> points = null; if (scheme.Point.Count > 0) { points = scheme.Point; foreach (ControlPoint point in points) { pointLine = new Line { Stroke = new SolidColorBrush { Color = Colors.Red, }, StrokeThickness = 10, X1 = point.Coord_X, Y1 = point.Coord_Y, X2 = point.Coord_X + 1, Y2 = point.Coord_Y + 1, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round, }; CanvasAreaForSchemeOfRoom.Children.Add(pointLine); ControlPointInst controlPoint = new ControlPointInst( Convert.ToInt32(point.Coord_X), Convert.ToInt32(point.Coord_Y)); SingleSpaceParams.getInstance().ControlPoints.Add(controlPoint); } } } if (scheme.Positions != null) { try { List <InstallationPosition> positions = scheme.Positions; foreach (InstallationPosition pos in positions) { PlacmentOfModules placement = pos.Placment.First(); ModelsOfModules model = _Context.Models.Where(mod => mod.ModuleId == placement.ModelId).First(); EllipseGeometry el = new EllipseGeometry { Center = new Point(pos.Coord_X, pos.Coord_Y), RadiusX = double.Parse(model.ModelRadius), RadiusY = double.Parse(model.ModelRadius) }; Path path = new Path(); path.Data = el; path.StrokeThickness = 2; path.Opacity = 0.5; path.Fill = new SolidColorBrush { Color = Colors.LightBlue, Opacity = 0.7 }; path.Stroke = new SolidColorBrush { Color = Colors.Red }; CanvasAreaForSchemeOfRoom.Children.Add(path); } } catch { MessageBox.Show("Ошибка загрузки данных из базы данных"); } } _Models = _Context.Models.ToList(); }
/*Проверка пересечений в процессе работы алгоритма*/ public static Hashtable CheckIntersection(Chromosome chromosome, int val) { Hashtable hashMap = new Hashtable(); int length = chromosome.Container.Count; //Количество контрольных точек int countOfPoint = SingleSpaceParams.getInstance().ControlPoints.Count; //Количество комнат int countofRoom = SingleSpaceParams.getInstance().Rooms.Count; List <ControlPointInst> points = new List <ControlPointInst>(SingleSpaceParams.getInstance().ControlPoints); List <RectangleRoom> rooms = new List <RectangleRoom>(SingleSpaceParams.getInstance().Rooms); Chromosome chr = new Chromosome(chromosome); //Проврека на покрытие сигналом контрольных точек, если все точки уже покрыты, тогда проерка не проводится if (points.Count != 0) { Gene gene = checkOfCoverageOfControlPointForCross(chr.Container, points); if (gene != null) { hashMap.Add("point", points.First()); hashMap.Add("gene", gene); return(hashMap); } } /*Проверка покрытия комнат сигналом. Если все контрольные точки уже покрыты, а комнаты нет, и остались устройства беспроводной связи * тогда последующие гены будут размещается до тех пор, пока комнаты не будут покрыты*/ if (rooms.Count != 0 && points.Count == 0) { Gene gene = checkOfCoverageOfRoomForCross(chr.Container, rooms); if (gene != null) { hashMap.Add("room", rooms.First()); hashMap.Add("gene", gene); return(hashMap); } } for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { //ToDo Самая первая гена не проверяется на пересечения с границами, нужно исправить. if (j != i) { bool resultValue = AlgorithmOfCheckIntersection( chromosome.Container.ElementAt(i), chromosome.Container.ElementAt(j) ); if (resultValue == true) { hashMap.Add("coverage", 1); hashMap.Add("gene", chromosome.Container.ElementAt(j)); return(hashMap); } else { // Самый первый ген (окружность) получает зону покрытия равной своей площади if (i == 0) { Gene gene = chromosome.Container.ElementAt(i); bool resultIntersection = checkIntersectionWithArea(gene); if (resultIntersection == true) { chromosome.Container.ElementAt(i).CoverageOfArea = (Math.PI * (gene.Radius * gene.Radius)) / 2; } else { chromosome.Container.ElementAt(i).CoverageOfArea = Math.PI * (gene.Radius * gene.Radius); } } else { //Условие оценки: Оценивается пересекающая окружность, а не пересекаемая. if (j < i) { //отправляем i=B, j=A AlghoritmOfSettingCovarage(chromosome.Container.ElementAt(j), chromosome.Container.ElementAt(i) ); } } } } } } return(null); }
private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (_IsRoom) { widthRoomTextBlock.Visibility = Visibility.Collapsed; widthRoomTextBox.Visibility = Visibility.Collapsed; lengthRoomTextBlock.Visibility = Visibility.Collapsed; lengthRoomTextBox.Visibility = Visibility.Collapsed; setLengthAndWidthButton.Visibility = Visibility.Collapsed; if (line != null && line2 != null) { RectangleRoom room = new RectangleRoom { X1 = Convert.ToInt32(line.X1), Y1 = Convert.ToInt32(line.Y1), X2 = Convert.ToInt32(line.X2), Y2 = Convert.ToInt32(line.Y2), X3 = Convert.ToInt32(line2.X2), Y3 = Convert.ToInt32(line2.Y2), X4 = Convert.ToInt32(line4.X2), Y4 = Convert.ToInt32(line4.Y2) }; // SingleSpaceParams.getInstance().Rooms.Add(room); } line = null; line2 = null; line3 = null; line4 = null; isPaint = false; } if (_IsPoint) { var point = Mouse.GetPosition(CanvasAreaForSchemeOfRoom); pointLine = new Line { Stroke = new SolidColorBrush { Color = Colors.Red, }, StrokeThickness = 10, X1 = point.X, Y1 = point.Y, X2 = point.X + 1, Y2 = point.Y + 1, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round, }; ControlPointInst controlPoint = new ControlPointInst( Convert.ToInt32(pointLine.X1), Convert.ToInt32(pointLine.Y1)); SingleSpaceParams.getInstance().ControlPoints.Add(controlPoint); CanvasAreaForSchemeOfRoom.Children.Add(pointLine); } }
private void StartAcommButton_Click(object sender, RoutedEventArgs e) { if (SingleSpaceParams.getInstance().ModulesRadius.Count > 0) { try { SchemeOfBuilding scheme = _Context.Schemes.Where(c => c.ProjectNumber.ProjectId.Equals(_projectId)).First(); foreach (ControlPointInst cp in SingleSpaceParams.getInstance().ControlPoints) { ControlPoint point = new ControlPoint(); point.Coord_X = cp.X1; point.Coord_Y = cp.Y1; bool isExist = false; foreach (ControlPoint c in scheme.Point) { if (c.Coord_X == point.Coord_X && c.Coord_Y == point.Coord_Y) { isExist = true; } } if (!isExist) { scheme.Point.Add(point); } } foreach (RectangleRoom rm in SingleSpaceParams.getInstance().Rooms) { Room room = new Room(); room.Coord_X1 = rm.X1; room.Coord_Y1 = rm.Y1; room.Coord_X2 = rm.X2; room.Coord_Y2 = rm.Y2; room.Coord_X3 = rm.X3; room.Coord_Y3 = rm.Y3; room.Coord_X4 = rm.X4; room.Coord_Y4 = rm.Y4; bool isExist = false; foreach (Room r in scheme.Rooms) { if (r.Coord_X1 == room.Coord_X1 && r.Coord_Y1 == room.Coord_Y1 && r.Coord_X4 == room.Coord_X4 && r.Coord_Y4 == room.Coord_Y4) { isExist = true; } } if (!isExist) { scheme.Rooms.Add(room); } } _Context.SaveChanges(); } catch (Exception ex) { MessageBox.Show("Ошибка обновления базы данных!"); } geneticAlgProgressBar.Visibility = Visibility.Visible; progressTextStateLabel.Visibility = Visibility.Visible; StartAcommButton.IsEnabled = false; ExecuteService service = new ExecuteService(SingleSpaceParams.getInstance().ModulesRadius, _BackgroundWorker); _BackgroundWorker.RunWorkerAsync(service); } }
/*Проверка пересечений и вычисление площади покрытия для создания первой популяции. * Проверка покрытия плошади на обязательных точках. Необходимо сделать, что бы сначала выполнялось размещение * с учетом точек*/ public static void CheckIntersection(Chromosome chromosome) { int length = chromosome.Container.Count; //Количество контрольных точек int countOfPoint = SingleSpaceParams.getInstance().ControlPoints.Count; //Количество комнат int countofRoom = SingleSpaceParams.getInstance().Rooms.Count; int counter = 0; List <ControlPointInst> points = new List <ControlPointInst>(SingleSpaceParams.getInstance().ControlPoints); List <RectangleRoom> rooms = new List <RectangleRoom>(SingleSpaceParams.getInstance().Rooms); Chromosome chr = new Chromosome(chromosome); int from = 0; int to = 0; for (int i = 0; i < length; i++) { //Проврека на покрытие сигналом контрольных точек, если все точки уже покрыты, тогда проерка не проводится. countofPoint заменить на проверку кол-ва элементов в списке if (countOfPoint != 0) { if (checkOfCoverageOfControlPoint(chr.Container, points.ElementAt(0))) { countOfPoint--; points.RemoveAt(0); } else { for (int sum = 0; sum < chromosome.Container.Count; sum++) { for (int chrSum = 0; chrSum < chr.Container.Count; chrSum++) { if ((chromosome.Container.ElementAt(sum).OX == chr.Container.ElementAt(chrSum).OX) && (chromosome.Container.ElementAt(sum).OY == chr.Container.ElementAt(chrSum).OY)) { if (chromosome.Container.ElementAt(sum).OX > points.ElementAt(0).X1) { if (to == 0 || chromosome.Container.ElementAt(sum).OX < to) { to = chromosome.Container.ElementAt(sum).OX; } ExecuteService.RefactorBadGeneForWidthTo(chromosome.Container.ElementAt(sum), to); break; } else { //ExecuteService.RefactorBadGene(chromosome.Container.ElementAt(i)); if (from == 0 || chromosome.Container.ElementAt(sum).OX > from) { from = chromosome.Container.ElementAt(sum).OX; } ExecuteService.RefactorBadGeneForWidthFrom(chromosome.Container.ElementAt(sum), from); break; } } } } /* if (chromosome.Container.ElementAt(i).OX> points.ElementAt(i).X1) * { * if (to == 0 || chromosome.Container.ElementAt(i).OX < to) * { to = chromosome.Container.ElementAt(i).OX; } * ExecuteService.RefactorBadGeneForWidthTo(chromosome.Container.ElementAt(i), to); * } * else * { * //ExecuteService.RefactorBadGene(chromosome.Container.ElementAt(i)); * if (from == 0 || chromosome.Container.ElementAt(i).OX > from) * { from = chromosome.Container.ElementAt(i).OX; } * ExecuteService.RefactorBadGeneForWidthFrom(chromosome.Container.ElementAt(i), from); * } */ //ExecuteService.RefactorBadGene(chromosome.Container.ElementAt(i)); if (i == 0) { i = -1; } else { i--; } continue; } } /*Проверка покрытия комнат сигналом. Если все контрольные точки уже покрыты, а комнаты нет, и остались устройства беспроводной связи * тогда последующие гены будут размещается до тех пор, пока комнаты не будут покрыты*/ if (countofRoom != 0 && chr.Container.Count > 0) { if (countOfPoint != 0) { if (checkOfCoverageOfRoom(chromosome.Container.ElementAt(i), rooms.ElementAt(0))) { countofRoom--; rooms.RemoveAt(0); } } if (countOfPoint == 0) { if (checkOfCoverageOfRoomAfterPoints(chr.Container, rooms) == false) { for (int sum = 0; sum < chromosome.Container.Count; sum++) { for (int chrSum = 0; chrSum < chr.Container.Count; chrSum++) { if ((chromosome.Container.ElementAt(sum).OX == chr.Container.ElementAt(chrSum).OX) && (chromosome.Container.ElementAt(sum).OY == chr.Container.ElementAt(chrSum).OY)) { ExecuteService.RefactorBadGene(chromosome.Container.ElementAt(sum)); } } } if (i == 0) { i = -1; } else { i--; } continue; } } } for (int j = 0; j < length; j++) { to = 0; from = 0; //ToDo Самая первая гена не проверяется на пересечения с границами, нужно исправить. if (j != i) { bool resultValue = AlgorithmOfCheckIntersection( chromosome.Container.ElementAt(i), chromosome.Container.ElementAt(j) ); if (resultValue == true) { ExecuteService.RefactorBadGene(chromosome.Container.ElementAt(j)); j = -1; } else { // Самый первый ген (окружность) получает зону покрытия равной своей площади if (i == 0) { Gene gene = chromosome.Container.ElementAt(i); bool resultIntersection = checkIntersectionWithArea(gene); if (resultIntersection == true) { chromosome.Container.ElementAt(i).CoverageOfArea = (Math.PI * (gene.Radius * gene.Radius)) / 2; } else { chromosome.Container.ElementAt(i).CoverageOfArea = Math.PI * (gene.Radius * gene.Radius); } } else { //Условие оценки: Оценивается пересекающая окружность, а не пересекаемая. if (j < i) { //отправляем i=B, j=A AlghoritmOfSettingCovarage(chromosome.Container.ElementAt(j), chromosome.Container.ElementAt(i) ); } } } } } } }
private void SaveDataButton_Click(object sender, RoutedEventArgs e) { if (!String.IsNullOrEmpty(ProjectNameTextBox.Text)) { _ProjectName = ProjectNameTextBox.Text; } if (!String.IsNullOrEmpty(WidthOfAreaTextBox.Text)) { _WidthOfArea = Convert.ToInt32(WidthOfAreaTextBox.Text); } if (!String.IsNullOrEmpty(HeightOfAreaTextBox.Text)) { _HeightOfArea = Convert.ToInt32(HeightOfAreaTextBox.Text); } if (!String.IsNullOrEmpty(ProjectNumberTextBox.Text)) { _ProjectNumber = Convert.ToInt32(ProjectNumberTextBox.Text); } if (!String.IsNullOrEmpty(_ProjectName) && _WidthOfArea != 0 && _HeightOfArea != 0 && _ProjectNumber != 0) { List <Customer> customers = _Context.Customers.ToList(); Customer customer = customers.ElementAt(_SelectedItemInCombobox); Project project = new Project(); project.Customer = customer; project.ProgectName = _ProjectName; project.ProjectNumber = _ProjectNumber; SchemeOfBuilding scheme = new SchemeOfBuilding(); scheme.Width = _WidthOfArea; scheme.Height = _HeightOfArea; scheme.ProjectNumber = project; scheme.Point = new List <ControlPoint>(); scheme.Rooms = new List <Room>(); try { _Context.Schemes.Add(scheme); _Context.SaveChanges(); if (SingleSpaceParams.getInstance() == null) { SingleSpaceParams.getInstance(_WidthOfArea, _HeightOfArea); } else { SingleSpaceParams.getInstance().Width = _WidthOfArea; SingleSpaceParams.getInstance().Height = _HeightOfArea; } nav = NavigationService.GetNavigationService(this); MainWindowPage mainWindow = new MainWindowPage(_Context, project.ProjectId); mainWindow.Show(); } catch { MessageBox.Show("Ошибка! Информация не была сохранена в базу данных!"); } } }
public Hashtable Executing() { /*Создание первой популяции*/ _BackgroundWorker.ReportProgress(0, "Создание первой популяции"); createFirstPopulation(); _result = new List <ResultModel>(); int counter = 0; while (true) { //Условия оценки первой популяции if (counter == 0) { //Оценивание хромосом _BackgroundWorker.ReportProgress(20, "Оцениваем полученныые решения"); foreach (Chromosome chr in _populationContainer.GetSetPopulationContainer) { ResultModel resM = new ResultModel(); resM.Ratio = GeneticAlgorithm.GA.EvaluationOfFitenssFunc(chr); resM.Chromosome = chr; _result.Add(resM); } SingleSpaceParams.getInstance().GlobalResultContainerGetSet.Add(_result.ElementAt(0)); } else { _BackgroundWorker.ReportProgress(30, "Началась селекция"); //Селекция _result.Sort((a, b) => b.Ratio.CompareTo(a.Ratio)); SingleSpaceParams.getInstance().GlobalResultContainerGetSet.Add(_result.ElementAt(0)); SingleSpaceParams.getInstance().RatingByOrder.Add(_result.ElementAt(0).Ratio); if (SingleSpaceParams.getInstance().TheBestResolve != -1) { int countAccessResult = 0; for (int i = 1; i < SingleSpaceParams.getInstance().GlobalResultContainerGetSet.Count; i++) { ResultModel result = SingleSpaceParams.getInstance().GlobalResultContainerGetSet.ElementAt(i); if (result.Ratio == SingleSpaceParams.getInstance().GlobalResultContainerGetSet.ElementAt(i - 1).Ratio) { countAccessResult++; } else { countAccessResult = 0; } if (countAccessResult == 5 || result.Ratio == 1) { _BackgroundWorker.ReportProgress(100, "Готово"); Hashtable hashMap = new Hashtable(); SingleSpaceParams.getInstance().GlobalResultContainerGetSet.Sort((a, b) => b.Ratio.CompareTo(a.Ratio)); hashMap.Add("chromosome", SingleSpaceParams.getInstance().GlobalResultContainerGetSet.ElementAt(0).Chromosome); hashMap.Add("ratio", SingleSpaceParams.getInstance().GlobalResultContainerGetSet.ElementAt(0).Ratio); return(hashMap); } } } //Вычисляем кол-во родителей int count; if ((_result.Count / 2) % 2 == 0) { count = _result.Count / 2; } else { count = (_result.Count / 2) + 1; } //Список хромосом для Кроссинговера List <Chromosome> listForSelection = new List <Chromosome>(); for (int i = 0; i < count; i++) { listForSelection.Add(_result.ElementAt(i).Chromosome); } _BackgroundWorker.ReportProgress(50, "Началась операция кроссинговера"); //Кроссинговер GeneticAlgorithm.GA.CrossingOver(listForSelection); _populationContainer = new Population(); _BackgroundWorker.ReportProgress(60, "Началась операция мутации"); //Мутация и размещение в контейнере foreach (Chromosome chr in listForSelection) { // GeneticAlgorithm.GA.Mutation(chr); _populationContainer.GetSetPopulationContainer.Add(chr); } //ToDo мутация _result = new List <ResultModel>(); _BackgroundWorker.ReportProgress(80, "Оцениваем результаты"); //Оценивание всех хромосом foreach (Chromosome chr in _populationContainer.GetSetPopulationContainer) { ResultModel resM = new ResultModel(); resM.Ratio = GeneticAlgorithm.GA.EvaluationOfFitenssFunc(chr); resM.Chromosome = chr; _result.Add(resM); } } counter++; } }
public static void RefactorBadGeneForWidthTo(Gene gene, int to) { gene.OX = getRandomValue(0, to); gene.OY = getRandomValue(0, SingleSpaceParams.getInstance().Height); }
private void DialogChose_SendSelected(ModelsOfModules module) { SingleSpaceParams.getInstance().ModulesRadius.Add(int.Parse(module.ModelRadius)); selectedModelsOfModulesLabel.Text += "\n\t" + module.ModelName; }
public static void RefactorBadGene(Gene gene) { gene.OX = getRandomValue(0, SingleSpaceParams.getInstance().Width); gene.OY = getRandomValue(0, SingleSpaceParams.getInstance().Height); }