Exemple #1
0
        private static void UpdateData(double[] increment, double tettaMax, int index)
        {
            var result = new double[basis_indexes.Count];

            for (int i = 0; i < basis_indexes.Count; i++)
            {
                result[i] = zero_point[0, basis_indexes[i]];
            }

            result = result.Subtract(MoiuLib.MultiplyMatrixAndScalar(increment, tettaMax));
            var min_ind = result.IndexOf(result.Min());

            for (int i = 0; i < basis_indexes.Count; i++)
            {
                zero_point[0, basis_indexes[i]] = result[i];
            }
            zero_point[0, index] = tettaMax;


            non_basis_indexes[non_basis_indexes.IndexOf(index)] = basis_indexes[min_ind];
            basis_indexes[min_ind] = index;

            changeIndex  = min_ind;
            changeVector = MoiuLib.TranposeMatrix(matrix.GetCol(index).Make2DArray());
        }
Exemple #2
0
        public static double[,] FindDiv(
            double[,] Cn,
            double[,] Cb,
            double[,] Ab_inv,
            double[,] An)
        {
            var step1  = MoiuLib.MultiplyMatrix(Cb, Ab_inv);
            var step2  = MoiuLib.MultiplyMatrix(step1, matrix);
            var step3  = MoiuLib.MultiplyMatrixAndScalar(targetVector, -1);
            var result = MoiuLib.SumMatrix(step2, step3);

//            var step2 = MoiuLib.MultiplyMatrix(step1, An);
//            var step3 = MoiuLib.MultiplyMatrixAndScalar(step2, -1);
//            var result = MoiuLib.SumMatrix(Cn, step3);
            return(result);
        }
Exemple #3
0
        public static void Main(string[] args)
        {
            Console.WriteLine("Enter the dimension:");
            var dims = int.Parse(Console.ReadLine() ?? throw new Exception());

            Console.WriteLine("Enter the target function's coefs:");
            targetVector = MoiuLib.FillMatrix(1, dims);

            Console.WriteLine("Enter count of conditions:");
            var rows = int.Parse(Console.ReadLine() ?? throw new Exception());

            if (rows > dims)
            {
                throw new Exception("count of conditions must be less or equal than dimension");
            }

            Console.WriteLine("Fill the matrix:");
            matrix = MoiuLib.FillMatrix(rows, dims);

            Console.WriteLine("Enter zero point:");
            zero_point = MoiuLib.FillMatrix(1, dims);

            basis_indexes     = zero_point.GetRow(0).Select(((d, i) => new { d, i })).Where((arg => arg.d > 0)).Take(rows).Select((arg => arg.i)).ToList();
            non_basis_indexes = zero_point.GetRow(0).Select(((d, i) => i)).ToList().Except(basis_indexes).ToList();

            for (int i = 1; ; i++)
            {
                Console.WriteLine($"№{i} ITERATION");
                if (!BringZeroPoint())
                {
                    break;
                }
            }
            Console.WriteLine("zero point is satisfying the requirements");
            Console.ReadKey();
        }
Exemple #4
0
        private static bool BringZeroPoint()
        {
            Console.WriteLine("basis");
            foreach (var ind in basis_indexes)
            {
                Console.WriteLine(ind);
            }
            matrix_B = GetSubMatrixByCols(matrix, basis_indexes.ToArray());
            matrix_N = GetSubMatrixByCols(matrix, non_basis_indexes.ToArray());

            Console.WriteLine("matrix_B");
            MoiuLib.PrintMatrix(matrix_B);

            inverse_matrix_B = inverse_matrix_B != null?MoiuLib.Algorithm(matrix_B, inverse_matrix_B, changeVector, changeIndex) : matrix_B.Inverse();

            Console.WriteLine("inverse matrix_b");
            MoiuLib.PrintMatrix(inverse_matrix_B);

//            double[,] Cn = targetVector.GetRow(0).Where((d, i) => non_basis_indexes.Contains(i)).ToList().Make2DArray();
//            double[,] Cb = targetVector.GetRow(0).Where((d, i) => basis_indexes.Contains(i)).ToList().Make2DArray();
            var Cn = new double[non_basis_indexes.Count];

            for (int i = 0; i < non_basis_indexes.Count; i++)
            {
                Cn[i] = targetVector[0, non_basis_indexes[i]];
            }
            var Cb = new double[basis_indexes.Count];

            for (int i = 0; i < basis_indexes.Count; i++)
            {
                Cb[i] = targetVector[0, basis_indexes[i]];
            }
            var div = FindDiv(Cn.Make2DArray(), Cb.Make2DArray(), inverse_matrix_B, matrix_N);

            Console.WriteLine("div");
            MoiuLib.PrintMatrix(div);
            var c_indexes_more_zero = div.GetRow(0).Select(((d, i) => new { d, i }))
                                      .Where((arg => arg.d < 0 && non_basis_indexes.Contains(arg.i)))
                                      .Select((arg => arg.i))
                                      .ToList();

            if (c_indexes_more_zero.Count > 0)
            {
                var c_index   = c_indexes_more_zero[0];
                var c_column  = matrix.GetColumn(c_index);
                var increment = inverse_matrix_B.Dot(c_column);
                var tettas    = new Dictionary <int, double>();
                for (int i = 0; i < increment.Length; i++)
                {
                    if (increment[i] > 0)
                    {
                        tettas[i] = zero_point[0, basis_indexes[i]] / increment[i];
                    }
                }
                var tetta_max = tettas.Min((pair => pair.Value));

                UpdateData(increment, tetta_max, c_index);
                Console.WriteLine("Updated zero point vector");
                MoiuLib.PrintMatrix(zero_point);
                return(true);
            }

            return(false);
        }