static void DecodeTest(Person p1)
        {
            PP.Refresh();

            for (int j = 0; j < DataStorage.N; j++)
            {
                DataStorage.cm[j].Refresh();
            }

            for (int j = 0; j < DataStorage.N; j++)
            {
                switch (p1.Chromosome.Genes[j]) //декодирование гена и размещение по эвристикам
                {
                case 1:
                {
                    int index = IndexOfMaxKM(p1);                                   //Самый большой из неразмещенных элементов
                    if (DataStorage.cm[index].Height > DataStorage.cm[index].Width) //горизонтально
                    {
                        Rotate(index);
                    }
                    FindPlace(index);         //разместить элемент
                    break;
                }

                case 2:
                {
                    int index = IndexOfMaxKM(p1);
                    if (DataStorage.cm[index].Height < DataStorage.cm[index].Width)
                    {
                        Rotate(index);
                    }
                    FindPlace(index);
                    break;
                }

                case 3:
                {
                    int index = IndexOfMinKM(p1);
                    if (DataStorage.cm[index].Height > DataStorage.cm[index].Width)
                    {
                        Rotate(index);
                    }
                    FindPlace(index);
                    break;
                }

                case 4:
                {
                    int index = IndexOfMinKM(p1);
                    if (DataStorage.cm[index].Height < DataStorage.cm[index].Width)
                    {
                        Rotate(index);
                    }
                    FindPlace(index);
                    break;
                }
                }
            }
            FMin();
        }
        public static void Decode(Person p1)
        {
            int plateHeight = 0;

            PP.Refresh();

            for (int j = 0; j < DataStorage.N; j++)
            {
                DataStorage.cm[j].Refresh();
            }
            int index = -1;

            for (int j = 0; j < DataStorage.N; j++)
            {
                switch (p1.Chromosome.Genes[j]) //декодирование гена и размещение по эвристикам
                {
                case 1:
                {
                    index = IndexOfMaxKM(p1);                                       //Самый большой из неразмещенных элементов

                    if (DataStorage.cm[index].Height > DataStorage.cm[index].Width) //горизонтально
                    {
                        Rotate(index);
                    }

                    FindPlace(index);         //разместить элемент
                    break;
                }

                case 2:
                {
                    index = IndexOfMaxKM(p1);
                    if (DataStorage.cm[index].Height < DataStorage.cm[index].Width)
                    {
                        Rotate(index);
                    }
                    FindPlace(index);
                    break;
                }

                case 3:
                {
                    index = IndexOfMinKM(p1);
                    if (DataStorage.cm[index].Height > DataStorage.cm[index].Width)
                    {
                        Rotate(index);
                    }
                    FindPlace(index);
                    break;
                }

                case 4:
                {
                    index = IndexOfMinKM(p1);
                    if (DataStorage.cm[index].Height < DataStorage.cm[index].Width)
                    {
                        Rotate(index);
                    }
                    FindPlace(index);
                    break;
                }
                }
                if (DataStorage.cm[index].isVertical)
                {
                    if (plateHeight < DataStorage.cm[index].y + DataStorage.cm[index].Height)
                    {
                        plateHeight = DataStorage.cm[index].y + DataStorage.cm[index].Height;
                    }
                }
                else
                {
                    if (plateHeight < DataStorage.cm[index].y + DataStorage.cm[index].Width)
                    {
                        plateHeight = DataStorage.cm[index].y + DataStorage.cm[index].Width;
                    }
                }
            }
            PP.Height   = plateHeight;
            p1.F        = F();
            SumFitness += 1 / p1.F;

            if (p1.F < DataStorage.Best)
            {
                DataStorage.Best       = p1.F;
                DataStorage.BestPerson = p1;
            }
        }