Exemplo n.º 1
0
        public static (double, double) GetABRange(ParametersForDefined parameters)
        {
            double minA = double.MaxValue, maxA = double.MinValue, minB = double.MaxValue, maxB = double.MinValue;

            for (var i = 0; i < parameters.A.Length; i++)
            {
                if (parameters.A[i] < minA)
                {
                    minA = parameters.A[i];
                }

                if (parameters.A[i] > maxA)
                {
                    maxA = parameters.A[i];
                }

                if (parameters.B[i] < minB)
                {
                    minB = parameters.B[i];
                }

                if (parameters.B[i] > maxB)
                {
                    maxB = parameters.B[i];
                }
            }

            return(((minA + minB) / 2), ((maxA + maxB) / 2));
        }
Exemplo n.º 2
0
        public static (double, double) GetCsRange(ParametersForDefined parameters)
        {
            double averMin = 0.0, averMax = 0.0;

            foreach (var c in parameters.Cs)
            {
                var min = double.MaxValue;
                var max = double.MinValue;
                foreach (var x in c)
                {
                    if (x < min)
                    {
                        min = x;
                    }

                    if (x > max)
                    {
                        max = x;
                    }
                }
                averMin += min;
                averMax += max;
            }
            return((averMin / parameters.Cs.Length), (averMax / parameters.Cs.Length));
        }
        public FullSolution Run()
        {
            Solver solver = new Solver();
            Random rand   = new Random();

            if (A is null)
            {
                if (_generator is null)
                {
                    throw new System.InvalidOperationException("Generating values parameters in GeneratorTaskCondition must be assigned to Problem");
                }
                (A, B) = _generator.GenerateAB(N, rand);
                L      = _generator.GenerateL(R, rand);
                Alpha  = _generator.GenerateAlpha(R);
                Cs     = new double[R][];
                for (var i = 0; i < R; i++)
                {
                    Cs[i] = _generator.GenerateMatrix(N, rand);
                }
            }

            (double[][] xs, double[] fsForXs) = solver.GetSolutions(Cs, A, B);
            (double[] solution, _)            = solver.SolveSeveral(Cs, A, B, L, Alpha, fsForXs);
            double[] newAlpha = new double[R];
            Alpha.CopyTo(newAlpha, 0);
            double[] optimalX      = solver.UpdateX(Cs, A, B, L, ref newAlpha, fsForXs, solution);
            double[] fsForX        = solver.CalculateFs(Cs, optimalX);
            double[] deltas        = solver.CalculateDeltas(fsForX, fsForXs);
            double[] ys            = solver.CalculateYs(deltas, L);
            double   functionValue = solver.CalculateOptimalFunc(ys, newAlpha);

            double[] distances = solver.CalculateDistances(xs, optimalX);

            Solution solutionWithoutChange = new Solution(optimalX, functionValue, Alpha, newAlpha, Cs, fsForX, xs, fsForXs, deltas, ys, distances, B.Length);

            double[][] newCs = new double[R][];
            PercentFinder.CopyMultidimensional(Cs, ref newCs);

            ParametersForDefined parameters = new ParametersForDefined(optimalX, newCs, A, B, L, Alpha, _cChangeParameters);

            ParametersForDefined = parameters;

            double persentOfChange = PercentFinder.FindPercentOfChange(parameters, solver, rand);

            //double persentOfChange = PercentFinder.SearchMeanPercent(PercentFinder.FindPercentOfChange, parameters, 0.01, solver, rand);
            double[] newX        = parameters.NewX;
            double[] newNewAlpha = new double[R];
            newAlpha.CopyTo(newNewAlpha, 0);
            (double[][] newXs, double[] newFsForXs) = solver.GetSolutions(newCs, A, B);
            newX = solver.UpdateX(newCs, A, B, L, ref newNewAlpha, newFsForXs, newX);
            double[] newfsForX        = solver.CalculateFs(newCs, newX);
            double[] newDeltas        = solver.CalculateDeltas(newfsForX, newFsForXs);
            double[] newYs            = solver.CalculateYs(newDeltas, L);
            double   newFunctionValue = solver.CalculateOptimalFunc(newYs, newNewAlpha);

            double[] newDistances       = solver.CalculateDistances(newXs, newX);
            Solution solutionWithChange = new Solution(newX, newFunctionValue, newAlpha, newNewAlpha, newCs, newfsForX, newXs, newFsForXs, newDeltas, newYs, newDistances, B.Length);

            return(new FullSolution(A, B, L, solutionWithoutChange, persentOfChange, solutionWithChange));
        }
Exemplo n.º 4
0
        public static (double, double) GetLRange(ParametersForDefined parameters)
        {
            double min = double.MaxValue, max = double.MinValue;

            foreach (var l in parameters.L)
            {
                if (l < min)
                {
                    min = l;
                }

                if (l > max)
                {
                    max = l;
                }
            }

            return(min, max);
        }
        private int GetPercentOfChange(SearchParameters parameters, Solver solver, Random random)
        {
            if (!(parameters is ParametersForRandom))
            {
                throw new ArgumentException("Wrong parameters type in method Experiment.GetPercentOfChange. Need to be ParametersForRandom.");
            }
            var param = (ParametersForRandom)parameters;
            int percent;

            double[]   x     = new double[param.Size * param.Size];
            double[][] cs    = new double[param.MatrixQuantity][];
            double[]   a     = new double[param.Size];
            double[]   b     = new double[param.Size];
            double[]   l     = new double[param.MatrixQuantity];
            double[]   alpha = new double[param.MatrixQuantity];
            double[]   solutions;

            bool success = false;

            while (!success)
            {
                (a, b) = _generator.GenerateAB(param.Size, random);
                l      = _generator.GenerateL(param.MatrixQuantity, random);
                alpha  = _generator.GenerateAlpha(param.MatrixQuantity);
                for (int i = 0; i < param.MatrixQuantity; i++)
                {
                    cs[i] = _generator.GenerateMatrix(param.Size, random);
                }
                (_, solutions) = solver.GetSolutions(cs, a, b);
                (x, _)         = solver.SolveSeveral(cs, a, b, l, alpha, solutions);
                x = solver.DivideX(solver.RoundVector(x), param.MatrixQuantity);
                if (!solver.CheckABConstraints(x, a, b))
                {
                    continue;
                }
                success = true;
            }
            var parametersForDefined = new ParametersForDefined(x, cs, a, b, l, alpha, _cChangeParameters);

            percent = PercentFinder.FindPercentOfChange(parametersForDefined, solver, random);
            return(percent);
        }