コード例 #1
0
        private void CanvasAreaForSchemeOfRoom_Initialized(object sender, EventArgs e)
        {
            Canvas canvas = (Canvas)sender;

            canvas.Width  = SingleSpaceParams.getInstance().Width;
            canvas.Height = SingleSpaceParams.getInstance().Height;
        }
コード例 #2
0
ファイル: GA.cs プロジェクト: labrador116/DegreeWork
        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);
            }
        }
コード例 #3
0
 private void FuncByPopulationRelationship_Click(object sender, RoutedEventArgs e)
 {
     if (SingleSpaceParams.getInstance().RatingByOrder.Count > 0)
     {
         new ResultCharts(SingleSpaceParams.getInstance().RatingByOrder).Show();
     }
 }
コード例 #4
0
 private void setSumOfPopulationButton_Click(object sender, RoutedEventArgs e)
 {
     if (!String.IsNullOrEmpty(sumOfPopulationTextBox.Text))
     {
         SingleSpaceParams.getInstance().SumOfChromosomeInPopulation = int.Parse(sumOfPopulationTextBox.Text);
         this.Close();
     }
 }
コード例 #5
0
 private void setProbabilityOfMutationButton_Click(object sender, RoutedEventArgs e)
 {
     if (!String.IsNullOrEmpty(probabilityOfMutationTextBox.Text))
     {
         SingleSpaceParams.getInstance().PropabilityOfMutation = double.Parse(probabilityOfMutationTextBox.Text);
         this.Close();
     }
 }
コード例 #6
0
        public OpenExistProjectPage()
        {
            InitializeComponent();
            SingleSpaceParams.KillSingle();

            if (chooseProjectTextBlock.IsEnabled == false)
            {
                chooseProjectTextBlock.Opacity = 0.1;
            }
        }
コード例 #7
0
ファイル: GA.cs プロジェクト: labrador116/DegreeWork
        /*Оценка фитнесс-функции*/
        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));
        }
コード例 #8
0
        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;
                }
            }
        }
コード例 #9
0
        public CreateProjectPage()
        {
            InitializeComponent();
            SingleSpaceParams.KillSingle();

            if (createCustomerTextBlock.IsEnabled == false)
            {
                createCustomerTextBlock.Opacity = 0.1;
            }

            if (chooseCustomerTextBlock.IsEnabled == false)
            {
                chooseCustomerTextBlock.Opacity = 0.1;
            }
        }
コード例 #10
0
ファイル: GA.cs プロジェクト: labrador116/DegreeWork
        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);
            }
        }
コード例 #11
0
        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("Ошибка! Данные не были изменены.");
            }
        }
コード例 #12
0
        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();
        }
コード例 #13
0
        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);
             * }*/
        }
コード例 #14
0
        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("Ошибка! Информация не была получена из базы данных!");
            }
        }
コード例 #15
0
ファイル: GA.cs プロジェクト: labrador116/DegreeWork
        /*Метод описывающий процесс мутации*/
        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;
            }
        }
コード例 #16
0
 public static void RefactorBadGeneForWidthFrom(Gene gene, int from)
 {
     gene.OX = getRandomValue(from, SingleSpaceParams.getInstance().Width);
     gene.OY = getRandomValue(0, SingleSpaceParams.getInstance().Height);
 }
コード例 #17
0
        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("Результат сохранен.");
        }
コード例 #18
0
        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();
        }
コード例 #19
0
ファイル: GA.cs プロジェクト: labrador116/DegreeWork
        /*Проверка пересечений в процессе работы алгоритма*/
        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);
        }
コード例 #20
0
        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);
            }
        }
コード例 #21
0
        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);
            }
        }
コード例 #22
0
ファイル: GA.cs プロジェクト: labrador116/DegreeWork
        /*Проверка пересечений и вычисление площади покрытия для создания первой популяции.
         * Проверка покрытия плошади на обязательных точках. Необходимо сделать, что бы сначала выполнялось размещение
         * с учетом точек*/
        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)
                                                               );
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #23
0
        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("Ошибка! Информация не была сохранена в базу данных!");
                }
            }
        }
コード例 #24
0
        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++;
            }
        }
コード例 #25
0
 public static void RefactorBadGeneForWidthTo(Gene gene, int to)
 {
     gene.OX = getRandomValue(0, to);
     gene.OY = getRandomValue(0, SingleSpaceParams.getInstance().Height);
 }
コード例 #26
0
 private void DialogChose_SendSelected(ModelsOfModules module)
 {
     SingleSpaceParams.getInstance().ModulesRadius.Add(int.Parse(module.ModelRadius));
     selectedModelsOfModulesLabel.Text += "\n\t" + module.ModelName;
 }
コード例 #27
0
 public static void RefactorBadGene(Gene gene)
 {
     gene.OX = getRandomValue(0, SingleSpaceParams.getInstance().Width);
     gene.OY = getRandomValue(0, SingleSpaceParams.getInstance().Height);
 }