Ejemplo n.º 1
0
        public void Find(double eps = 0)
        {
            region.Clear();
            R.Coor size = new R.Coor(); // Размер области размещения.
            R.Coor coor = new R.Coor(); // Точка размещения объекта.

            for (int i = 1; i < rects.Length; i++) // 0-ой объект, с нулевыми координатами и размерами, необходим для поиска точек размещения связанных с областью размещения.
            {
                Rect rect = rects[i];

                double obj_func = double.PositiveInfinity; // Значение функции цели при размещении текущего объекта.

                Perm perm = new Perm(Rect.Dim, i);
                do
                {
                    #region Заполнение возможной точки размещения новыми координатами.
                    for (int j = 0; j < Rect.Dim; j++)
                        rect.Min(j, rects[perm[j]].Max(j));
                    #endregion

                    #region Проверка попадания текущего объекта размещения в текущей точке размещения в область размещения.
                    if (region.IsContaine(rect, eps))
                        #region Проверка непересечения текущего объекта размещения в текущей точке размещения со всеми размещёнными объектами.
                        if (!rect.IsCollideWith(rects, i, eps))
                        {
                            #region Определение функции цели в текущей точке размещения.
                            double obj_func_temp = 1;
                            for (int j = 0; j < Rect.Dim; j++)
                                if (!region.Freez(j))
                                    obj_func_temp *= Math.Max(region.Size(j), rect.Max(j));
                            #endregion

                            #region Определение того, является ли текущая точка размещения лучше сохранённой (оптимальной).
                            double delta = obj_func - obj_func_temp;
                            for (int j = 0; j < Rect.Dim && Math.Abs(delta) <= eps; j++)
                                delta = coor[j] - rect.Min(j);
                            #endregion

                            #region Сохранение лучших значения функции цели, точки размещения и размеров области размещения.
                            if (delta - eps > 0)
                            {
                                obj_func = obj_func_temp;
                                
                                rect.CopyCoorTo(coor);

                                for (int j = 0; j < Rect.Dim; j++)
                                    size[j] = Math.Max(region.Size(j), rect.Max(j));
                            }
                            #endregion
                        }
                        #endregion
                    #endregion
                } while (perm.NextPerm());

                rect.CopyCoorFrom(coor); // Установка объекта в найденную точку.
                region.CopySizeFrom(size); // Установка новых размеров области.
            }
        }
Ejemplo n.º 2
0
        public bool FindBetter(double eps = 0)
        {
            #region Сохранение значения функции цели.
            double obj_func = region.ObjFunc();
            #endregion

            #region Сохранение размера области размещения.
            R.Coor size = new R.Coor();
            region.CopySizeTo(size);
            #endregion

            #region Сохранение координат размещения геометрических объектов.
            R.Coor[] coors = new R.Coor[rects.Length];
            for (int i = 0; i < rects.Length; i++)
            {
                coors[i] = new R.Coor();
                rects[i].CopyCoorTo(coors[i]);
            }
            #endregion

            Find(eps);

            #region Получение нового значения функции цели.
            double obj_func_temp = region.ObjFunc();
            #endregion

            #region Если старое значение функции цели лучще нового, то...
            if (obj_func <= obj_func_temp)
            {
                #region Востановление старого размера области размещения.
                region.CopySizeFrom(size);
                #endregion

                #region Востановление старых координат объектов размещения.
                for (int i = 0; i < rects.Length; i++)
                    rects[i].CopyCoorFrom(coors[i]);
                #endregion
            }
            #endregion

            return obj_func > obj_func_temp;
        }