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); }
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); }
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)); }