public void MuGridsFixedPartition8x8Test() { const string f = "Logs.txt"; if (File.Exists(f)) { File.Delete(f); } Trace.Listeners.Add(new TextWriterTraceListener(f)); var settings = new PartitionSettings { SpaceSettings = new SpaceSettings { MinCorner = VectorUtils.CreateVector(0, 0), MaxCorner = VectorUtils.CreateVector(10, 10), GridSize = new List <int> { 80, 80 }, DensityType = DensityType.Everywhere1, MetricsType = MetricsType.Euclidean, CustomDensityFunction = null, CustomDistanceFunction = null }, CentersSettings = new CentersSettings { CentersCount = 2, CenterDatas = new List <CenterData> { new CenterData { A = 0, W = 1, Position = VectorUtils.CreateVector(1, 1), IsFixed = true }, new CenterData { A = 0, W = 1, //Position = VectorUtils.CreateVector(2, 4), Position = VectorUtils.CreateVector(9, 1), IsFixed = true }, } }, FuzzyPartitionFixedCentersSettings = new FuzzyPartitionFixedCentersSettings { GradientEpsilon = 0.001, GradientStep = 10, MaxIterationsCount = 400 }, FuzzyPartitionPlacingCentersSettings = new FuzzyPartitionPlacingCentersSettings { GaussLegendreIntegralOrder = 4 } }; var calculator = new FuzzyPartitionFixedCentersAlgorithm(settings); var partition = calculator.BuildPartition(out var psiGrid); Trace.WriteLine($"PerformedIterationsCount = {calculator.PerformedIterationsCount}"); var muValueGetters = partition.Select(v => new GridValueInterpolator(settings.SpaceSettings, new MatrixGridValueGetter(v))).ToList(); var targetFunctionalCalculator = new TargetFunctionalCalculator(settings); var targetFunctionalValue = targetFunctionalCalculator.CalculateFunctionalValue(muValueGetters); Trace.WriteLine($"Target functional value = {targetFunctionalValue}\n"); var dualFunctionalCalculator = new DualFunctionalCalculator(settings, psiGrid.ToGridValueInterpolator(settings)); var dualFunctionalValue = dualFunctionalCalculator.CalculateFunctionalValue(); Trace.WriteLine($"Dual functional value = {dualFunctionalValue}\n"); Trace.WriteLine("Center #1 Mu matrix:"); MatrixUtils.WriteMatrix(partition[0], WriteLine, 3); Trace.WriteLine("Center #2 Mu matrix:"); MatrixUtils.WriteMatrix(partition[1], WriteLine, 3); var sum = partition.Aggregate((a, b) => a + b); Trace.WriteLine("Sum mu matrix:"); MatrixUtils.WriteMatrix(sum, WriteLine, 3); Trace.Flush(); Assert.AreEqual(targetFunctionalValue, dualFunctionalValue, 1d); var q = 5; }
public void Grid3x3PlacingPartitionTest() { var f = "Logs.txt"; if (File.Exists(f)) { File.Delete(f); } Trace.Listeners.Add(new TextWriterTraceListener(f)); var settings = new PartitionSettings { IsCenterPlacingTask = false, SpaceSettings = new SpaceSettings { MinCorner = VectorUtils.CreateVector(0, 0), MaxCorner = VectorUtils.CreateVector(10, 10), GridSize = new List <int> { 8, 8 }, DensityType = DensityType.Everywhere1, MetricsType = MetricsType.Euclidean, CustomDensityFunction = null, CustomDistanceFunction = null }, CentersSettings = new CentersSettings { CentersCount = 2, CenterDatas = new List <CenterData> { new CenterData { A = 0, W = 1, Position = VectorUtils.CreateVector(2, 5), IsFixed = true }, new CenterData { A = 0, W = 1, Position = VectorUtils.CreateVector(8, 5), IsFixed = true }, } }, FuzzyPartitionFixedCentersSettings = new FuzzyPartitionFixedCentersSettings { GradientEpsilon = 0.01, GradientStep = 0.1, MaxIterationsCount = 400 }, FuzzyPartitionPlacingCentersSettings = new FuzzyPartitionPlacingCentersSettings { CentersDeltaEpsilon = 0.1, GaussLegendreIntegralOrder = 32 }, RAlgorithmSettings = new RAlgorithmSettings { SpaceStretchFactor = 2, H0 = 1, MaxIterationsCount = 30 } }; var zeroTaus = new List <Vector <double> > { //VectorUtils.CreateVector(2, 5), //VectorUtils.CreateVector(8, 5) VectorUtils.CreateVector(1, 1), VectorUtils.CreateVector(10, 10) }; var calculator = new FuzzyPartitionFixedCentersAlgorithm(settings); var partition = calculator.BuildPartition(); var muValueGetters = partition.Select(v => new GridValueInterpolator(settings.SpaceSettings, new MatrixGridValueGetter(v))).ToList(); var placingAlgorithm = new FuzzyPartitionPlacingCentersAlgorithm(settings, zeroTaus, muValueGetters); while (true) { placingAlgorithm.DoIteration(muValueGetters); var centers = placingAlgorithm.GetCenters(); var targetFunctionalCalculator = new TargetFunctionalCalculator(settings); var targetFunctionalValue = targetFunctionalCalculator.CalculateFunctionalValue(muValueGetters); Trace.WriteLine($"Target functional value = {targetFunctionalValue}\n"); for (int i = 0; i < settings.CentersSettings.CentersCount; i++) { settings.CentersSettings.CenterDatas[i].Position = centers[i].Clone(); Trace.WriteLine($"Center #{i + 1}: {centers[i][0]:0.00} {centers[i][1]:0.00}"); } calculator = new FuzzyPartitionFixedCentersAlgorithm(settings); partition = calculator.BuildPartition(); if (placingAlgorithm.IsStopConditionSatisfied()) { break; } } var list = placingAlgorithm.GetCenters(); for (var index = 0; index < list.Count; index++) { var center = list[index]; Trace.WriteLine($"Center #{index + 1}: {center[0]:0.00} {center[1]:0.00}"); } Trace.Flush(); var vec = VectorUtils.CreateVector(44, 4, 4, 4, 4); var x = 4; }