Ejemplo n.º 1
0
        public static void GreedyIterationPrintResult(ResultGreedyMethode data, int countFloor, bool flagIsNotFinish, Label resultGreedyLabel)
        {
            if (flagIsNotFinish)
            {
                resultGreedyLabel.Text +=
                    string.Format(MessagesText.ResultIterationHeuristicAlgorithm, data.NumIter).ToString(CultureInfo.InvariantCulture);
            }
            else
            {
                resultGreedyLabel.Text += MessagesText.NextLine;
                resultGreedyLabel.Text +=
                    MessagesText.ResultTotalHeuristicAlgorithm.ToString(CultureInfo.InvariantCulture);
            }

            resultGreedyLabel.Text +=
                string.Format(MessagesText.ValueFunctionalF, data.Fine).ToString(CultureInfo.InvariantCulture);

            if (!flagIsNotFinish)
            {
                for (var numberFloor = 0; numberFloor < countFloor; ++numberFloor)
                {
                    resultGreedyLabel.Text += MessagesText.DividingLine;
                    PrintFloor(data.FinalPlaceOneFlat, resultGreedyLabel);
                    resultGreedyLabel.Text += MessagesText.DividingLine;
                    PrintFloor(data.FinalPlaceTwoFlat, resultGreedyLabel);
                    PrintStroke(data.FinalPlaceTwoFlat.Count, numberFloor, countFloor, resultGreedyLabel);
                }
            }
            if (flagIsNotFinish)
            {
                return;
            }
            PrintExceedFlat(data.ListLenExceedOneFlat, resultGreedyLabel, MessagesText.RectanglesAiNotList);
            PrintExceedFlat(data.ListLenExceedTwoFlat, resultGreedyLabel, MessagesText.RectanglesBiNotList);
        }
Ejemplo n.º 2
0
        private void PerformHAlg(InputSectionDataAlg inSectionData)
        {
            ValidateConditions.Validate(inSectionData, true);

            realizat_label.Text     = "".ToString(CultureInfo.InvariantCulture);
            lossesOne_label.Text    = "".ToString(CultureInfo.InvariantCulture);
            resultGreedy_label.Text = "".ToString(CultureInfo.InvariantCulture);

            var flatCount = inSectionData.ListLenOneFlat.Count + inSectionData.ListLenTwoFlat.Count;

            realizat_label.Text +=
                string.Format(MessagesText.RealizationForRectangles, flatCount).ToString(CultureInfo.InvariantCulture);
//            lossesOne_label.Text += string.Format(MessagesText.SummarizeAdditionLengthForH, inData.SumDelta.ToString(CultureInfo.InvariantCulture));

            var dataAlg = new DataPerformAlgorithm();

            var resultDataAfterGrouping = GroupingOnTheFloors.GroupingFlat(inSectionData);

            dataAlg.ListLenOneFlat =
                PreparationSquares.FlatsWithTheAdditiveLength(resultDataAfterGrouping.ListResultOneFlat);
            dataAlg.ListLenTwoFlat =
                PreparationSquares.FlatsWithTheAdditiveLength(resultDataAfterGrouping.ListResultTwoFlat);
            dataAlg.FineAfterGrouping = resultDataAfterGrouping.Fine;


            //for print in txt-file

            /*
             * var str1 = new StringBuilder();
             * var str2 = new StringBuilder();
             * foreach (var elem in dataAlg.ListLenOneFlat)
             * {
             *  str1.Append(elem + " ");
             * }
             *
             * foreach (var elem in dataAlg.ListLenTwoFlat)
             * {
             *  str2.Append(elem + " ");
             * }
             *
             * File.WriteAllText(@"C:\Users\marchenko.a\Downloads\Модифицированная Статья\ExampleTwoFirstList.txt", str1.ToString());
             * File.WriteAllText(@"C:\Users\marchenko.a\Downloads\Модифицированная Статья\ExampleTwoSecondList.txt", str2.ToString());
             */
            var myStopWatchGreedy = new Stopwatch();

            myStopWatchGreedy.Start();

            var resultList = new ResultListGreedyMethode();

            foreach (var flag in resultList.PositionStart)
            {
                var allIterationsResult = new ResultGreedyMethode[Constraints.NumberOfIteration];
                var totalOptimalResult  = new ResultGreedyMethode(double.MaxValue);
                var firstOneFlat        = 0.0; // в RGreedyMethode
                var numberIteration     = 1;
                while (numberIteration <= Constraints.NumberOfIteration)
                {
                    var resultGreedyIter =
                        GreedyMethodeSect.GreedyMethode(
                            new DataMethode(dataAlg.ListLenOneFlat, dataAlg.ListLenTwoFlat, inSectionData.OptCountFlatOnFloor),
                            firstOneFlat, flag);
                    firstOneFlat             = resultGreedyIter.NewFirstOneFlat;
                    resultGreedyIter.NumIter = numberIteration;
                    resultGreedyIter.Fine    = Math.Round(resultGreedyIter.Fine * inSectionData.CountFloor, 1);
                    resultGreedyIter.Fine    = Math.Round(resultGreedyIter.Fine + dataAlg.FineAfterGrouping, 1);
                    resultGreedyIter.ListLenExceedOneFlat = resultDataAfterGrouping.ListExcessOneFlat;
                    resultGreedyIter.ListLenExceedTwoFlat = resultDataAfterGrouping.ListExcessTwoFlat;

                    allIterationsResult[numberIteration - 1] = resultGreedyIter;

                    if (resultGreedyIter.Fine < totalOptimalResult.Fine)
                    {
                        totalOptimalResult = resultGreedyIter;
                    }
                    //Вывод результата по итерациям
                    //PrintResult.GreedyIterationPrintResult(resultGreedyIter, inData.CountFloor, true, resultGreedy_label);
                    numberIteration++;
                    if (numberIteration > Constraints.NumberOfIteration)
                    {
                        resultList.Results.Add(totalOptimalResult);
                    }
                }
            }

            myStopWatchGreedy.Stop();
            PrintResult.GreedyIterationPrintResult(resultList.Results.OrderBy(a => a.Fine).First(), inSectionData.CountFloor,
                                                   false, resultGreedy_label);

            resultGreedy_label.Text +=
                string.Format(MessagesText.WorkTimeHeuristicAlgoruthm,
                              myStopWatchGreedy.ElapsedMilliseconds / 1000.0).ToString(CultureInfo.InvariantCulture).ToString(CultureInfo.InvariantCulture);
        }
Ejemplo n.º 3
0
        public static ResultGreedyMethode GreedyMethode(DataMethode dataGrM, double firstOneFlat, string positionStart)
        {
            var listLenOneFlat = new List <double>(dataGrM.ListLenOneFlat);
            var listLenTwoFlat = new List <double>(dataGrM.ListLenTwoFlat);

            var resultGreedy          = new ResultGreedyMethode();
            var finalPlacementOneFlat = new double[dataGrM.OptCountFlatOnFloor];
            var finalPlacementTwoFlat = new double[dataGrM.OptCountFlatOnFloor];

            var maxFine = 0.0;
            var index1  = 0; // индексы нужны для удаления из второго списка
            var index2  = 0;

            for (var n = 0; n < dataGrM.OptCountFlatOnFloor; n = n + 2)             // цикл заполнения секций
            {
                //Если есть ненулевое значение и оно встретилось в первый раз, то записываем его
                double choiceOneFlat;
                switch (positionStart)
                {
                case "First":
                    choiceOneFlat = Math.Abs(firstOneFlat) > 1e-9 && resultGreedy.IsFlagFirstEntry
                         ? firstOneFlat
                         : listLenOneFlat[0];
                    break;

                case "Middle":
                    choiceOneFlat = Math.Abs(firstOneFlat) > 1e-9 && resultGreedy.IsFlagFirstEntry
                       ? firstOneFlat
                       : listLenOneFlat[listLenOneFlat.Count / 2];
                    break;

                case "Penultimate":
                    choiceOneFlat = Math.Abs(firstOneFlat) > 1e-9 && resultGreedy.IsFlagFirstEntry
                        ? firstOneFlat
                        : listLenOneFlat[listLenOneFlat.Count - 2];
                    break;

                default:
                    throw new Exception();
                }
                resultGreedy.IsFlagFirstEntry = false;

                var sortedListOneFlat = new List <double>(listLenOneFlat);
                sortedListOneFlat.Remove(choiceOneFlat);
                var fine = double.MaxValue;

                finalPlacementOneFlat[n] = choiceOneFlat;
                var arraySortedTwoFlat = listLenTwoFlat.ToArray();

                for (var i = 0; i < listLenTwoFlat.Count; ++i)
                {
                    for (var j = i + 1; j < listLenTwoFlat.Count; ++j)
                    {
                        foreach (var t in sortedListOneFlat)
                        {
                            double[] currentMassiv;
                            Array.Copy(arraySortedTwoFlat,
                                       currentMassiv = new double[arraySortedTwoFlat.Length],
                                       arraySortedTwoFlat.Length);

                            ApartureLen resultPackSectReverse;
                            switch (dataGrM.OptCountFlatOnFloor - n)
                            {
                            case 2:
                            {
                                resultPackSectReverse =
                                    MethodsForApartureLen.CalculateOptimalPackContainer(
                                        new ApartureLen(choiceOneFlat, t, currentMassiv[j],
                                                        currentMassiv[i]), dataGrM.WallsWidth);
                                break;
                            }

                            default:
                                resultPackSectReverse = new ApartureLen(double.MaxValue);
                                break;
                            }
                            var resultPackSect =
                                MethodsForApartureLen.CalculateOptimalPackContainer(
                                    new ApartureLen(choiceOneFlat, t, currentMassiv[i],
                                                    currentMassiv[j]), dataGrM.WallsWidth);

                            //Todo change expression 2.4 = parameters: p1 p2

                            /*
                             * var currentFineReverse =
                             *  Math.Abs(Math.Round(
                             *      resultPackSectReverse.DataContainer.B1 + resultPackSectReverse.DataContainer.B2 + dataGrM.AddingB -
                             *      (resultPackSectReverse.DataContainer.A1 + resultPackSectReverse.DataContainer.A2 + dataGrM.AddingA)
                             + resultPackSectReverse.ExtraSquare, 1));
                             +
                             + var currentFine =
                             +  Math.Abs(Math.Round(
                             +      resultPackSect.DataContainer.B1 + resultPackSect.DataContainer.B2 + dataGrM.AddingB -
                             +      (resultPackSect.DataContainer.A1 + resultPackSect.DataContainer.A2 + dataGrM.AddingA)
                             + resultPackSect.ExtraSquare, 1));
                             */
                            var currentFineReverse =
                                Math.Abs(Math.Round(
                                             resultPackSectReverse.DataContainer.B1 - 2.4 + resultPackSectReverse.DataContainer.B2 - 2.4
                                             + dataGrM.EntrywayPlusCorridor + 2 * dataGrM.WallsWidth -
                                             (resultPackSectReverse.DataContainer.A1 + 2.4 + resultPackSectReverse.DataContainer.A2 + 2.4
                                              + 2 * dataGrM.WallsWidth)
                                             + resultPackSectReverse.ExtraSquare, 1));

                            var currentFine =
                                Math.Abs(Math.Round(
                                             resultPackSect.DataContainer.B1 - 2.4 + resultPackSect.DataContainer.B2 - 2.4
                                             + dataGrM.EntrywayPlusCorridor + 2 * dataGrM.WallsWidth -
                                             (resultPackSect.DataContainer.A1 + 2.4 + resultPackSect.DataContainer.A2 + 2.4
                                              + 2 * dataGrM.WallsWidth)
                                             + resultPackSect.ExtraSquare, 1));
                            if (currentFineReverse < currentFine)
                            {
                                currentFine    = currentFineReverse;
                                resultPackSect = resultPackSectReverse;
                            }

                            if (!(currentFine < fine))
                            {
                                continue;
                            }
                            fine = currentFine;
                            finalPlacementTwoFlat[n] = resultPackSect.DataContainer.B1;
                            index1 = i;
                            finalPlacementTwoFlat[n + 1] = resultPackSect.DataContainer.B2;
                            index2 = j;
                            finalPlacementOneFlat[n + 1] = resultPackSect.DataContainer.A2;
                        }
                    }
                }
                //удаление занятых вариантов из списка и суммирование штрафа
                resultGreedy.Fine = Math.Round(resultGreedy.Fine + fine, 1);

                if (maxFine < fine)
                {
                    maxFine = fine;
                    resultGreedy.NewFirstOneFlat = finalPlacementOneFlat[n]; // Запись контейнера с наибольшим штрафом
                }
                listLenOneFlat.Remove(finalPlacementOneFlat[n]);
                listLenOneFlat.Remove(finalPlacementOneFlat[n + 1]);
                if (index1 > index2)
                {
                    listLenTwoFlat.RemoveAt(index1);
                    listLenTwoFlat.RemoveAt(index2);
                }
                else
                {
                    listLenTwoFlat.RemoveAt(index2);
                    listLenTwoFlat.RemoveAt(index1);
                }
            }
            //приведение длин для конечного отображения
            for (var k = 0; k < finalPlacementOneFlat.Length; k = k + 2)
            {
                var resultAddingPlace =
                    ResultAddingPlace.CalculateAddingPlace(new DataContainer
                {
                    A1 = finalPlacementOneFlat[k],
                    A2 = finalPlacementOneFlat[k + 1],
                    B1 = finalPlacementTwoFlat[k],
                    B2 = finalPlacementTwoFlat[k + 1]
                },
                                                           0.3);
                finalPlacementOneFlat[k]     = resultAddingPlace.A1;
                finalPlacementOneFlat[k + 1] = resultAddingPlace.A2;
            }
            return(new ResultGreedyMethode(resultGreedy.Fine, finalPlacementOneFlat.ToList(), finalPlacementTwoFlat.ToList(),
                                           resultGreedy.NewFirstOneFlat));
        }