コード例 #1
0
ファイル: SimplexTable.cs プロジェクト: 1823244/university
        /*
         * Составляем новую симплекс таблицу для решения задачи методом больших штрафов
         * вводим базисные переменные в уравнения, в которых их нет, вычисляем новую целевую
         * функцию
         */
        private Fraction[,] TableForMSolution(Fraction M)
        {
            //Проходимся по массиву с базисными переменными не затрагивая последний элемент(целевая функция)
            //считаем, сколько нам понадобится добавлять переменных
            int count = 0;

            for (int k = 0; k < basic.Length - 1; k++)
            {
                if (basic[k] == 0)
                {
                    count++;
                }
            }

            //Добавлять новые переменные будем начиная с номера
            int countN = table.GetLength(1);

            //Создаем таблицу нового размера, чтобы добавить новые переменные
            Fraction[,] newTable = new Fraction[table.GetLength(0), countN + count];
            //обнуляем таблицу
            for (int i = 0; i < newTable.GetLength(0); i++)
            {
                for (int j = 0; j < newTable.GetLength(1); j++)
                {
                    newTable[i, j] = new Fraction();
                }
            }

            //поднимаемся по таблице снизу
            for (int i = table.GetLength(0) - 1; i >= 0; i--)
            {
                //Копируем строку из старой таблицы
                for (int j = 0; j < table.GetLength(1); j++)
                {
                    newTable[i, j] = table[i, j];
                }
                if (i < basic.Length - 1)
                {
                    //Если мы уже проходимся по строке с базовым элементом
                    Fraction mnojitel;

                    if (basic[i] == 0)
                    {
                        //Если не было базовой переменной, то добавляем ее и множитель будет равен М
                        basic[i]            = countN;
                        newTable[i, countN] = new Fraction(1);
                        mnojitel            = M;
                        countN++;
                    }
                    else
                    {
                        //Иначе, множитель будет равен коэффициенту при данной переменной в начальной целевой функции
                        mnojitel = table[table.GetLength(0) - 1, basic[i]];
                    }

                    //Умножаем строку на множитель и отнимаем от новой целевой функции
                    for (int j = 0; j < table.GetLength(1); j++)
                    {
                        newTable[table.GetLength(0) - 1, j] -= mnojitel * newTable[i, j];
                    }
                }
            }

            return(newTable);
        }
コード例 #2
0
ファイル: SimplexTable.cs プロジェクト: 1823244/university
        //Двойственный метод для игр
        public void DvoistvMethodForGame(StreamWriter streamWriter)
        {
            //Строим двойственную задачу
            streamWriter.WriteLine("Строим двойственную задачу");
            Fraction[,] tableDvoistv = DV();
            int[] basicDvoistv = new int[tableDvoistv.GetLength(0)];
            PrintSimplexTable(table, streamWriter);
            PrintSimplexTable(tableDvoistv, streamWriter);

            //Уравниваем неравенства
            streamWriter.WriteLine("Уравниваем неравенства");
            newTableDV(ref table, ref basic, true);
            newTableDV(ref tableDvoistv, ref basicDvoistv, false);
            PrintSimplexTable(table, streamWriter);
            PrintSimplexTable(tableDvoistv, streamWriter);

            //Массив соответствий иксам игриков
            streamWriter.WriteLine("Массив соответствий");
            int[] sootv = new int[table.GetLength(1) - 1];
            int   start = table.GetLength(0) - 1;

            for (int i = 0; i < sootv.Length; i++)
            {
                sootv[i] = start % sootv.Length;
                start++;
            }
            streamWriter.Write("{0,4}", "y");
            for (int i = 0; i < sootv.Length; i++)
            {
                streamWriter.Write("{0,4}", i + 1);
            }
            streamWriter.WriteLine();
            streamWriter.Write("{0,4}", "x");
            for (int i = 0; i < sootv.Length; i++)
            {
                streamWriter.Write("{0,4}", sootv[i] + 1);
            }
            streamWriter.WriteLine(); streamWriter.WriteLine();

            //Решаем исходную задачу
            streamWriter.WriteLine("Решаем исходную задачу");
            PrintSimplexTable(streamWriter);
            SimplexMethod(streamWriter);

            //Выводим ответ
            streamWriter.WriteLine("Ответ");
            bool xy = false;

            for (int i = 0; i < sootv.Length; i++)
            {
                if (sootv[i] == 0)
                {
                    xy = true;
                    streamWriter.WriteLine();
                }
                if (xy)
                {
                    streamWriter.WriteLine("\tx{0} = {1}", sootv[i] + 1, (String)table[table.GetLength(0) - 1, i + 1]);
                }
                else
                {
                    int index = -1;
                    for (int j = 0; j < basic.Length; j++)
                    {
                        if (basic[j] == (i + 1))
                        {
                            index = j;
                            break;
                        }
                    }
                    streamWriter.WriteLine("\ty{0} = {1}", i + 1, index == -1 ? "0" : (String)table[index, 0]);
                }
            }
            streamWriter.WriteLine();

            //Находим седловую точку
            //Значение целевой функции
            Fraction ZnachCellFunc = table[table.GetLength(0) - 1, 0];

            //q (седловая точка по игрикам)
            for (int i = 0; i < table.GetLength(0) - 1; i++)
            {
                bool     flag = false;
                Fraction fra  = null;
                for (int j = 0; j < basic.Length; j++)
                {
                    if (basic[j] == i + 1)
                    {
                        fra  = table[j, 0];
                        flag = true;
                    }
                }
                streamWriter.Write("q[{0}]={1}\t", i + 1, (!flag) ? "0" : ((string)(fra / ZnachCellFunc)));
            }
            streamWriter.WriteLine();
            //p (седловая точка по иксам)
            int jj = 1;

            for (int i = table.GetLength(1) - table.GetLength(0) + 1; i < table.GetLength(1); i++)
            {
                streamWriter.Write("p[{0}]={1}\t", jj++, (string)(table[table.GetLength(0) - 1, i] / ZnachCellFunc));
            }
            streamWriter.WriteLine();
        }
コード例 #3
0
ファイル: Calc.cs プロジェクト: Nslice/CSharp
 public static double Polynomial(Fraction point, params Fraction[] coefficients)
 {
     //https://planetcalc.ru/7716/  проверка
     return(coefficients.Reverse().Select((t, i) => (double)t * Math.Pow((double)point, i)).Sum());
 }
コード例 #4
0
ファイル: Program.cs プロジェクト: 1823244/university
        public static void convert(StreamReader inp, StreamWriter outp)
        {
            int m, n;

            string[] line = inp.ReadLine().Split(' ');
            m = Int32.Parse(line[0]);
            n = Int32.Parse(line[1]);
            outp.WriteLine("{0} {1}", m, n);

            for (int i = 0; i <= m; i++)
            {
                outp.Write("{0}", 0);
                if (i != n)
                {
                    outp.Write(" ");
                }
            }
            outp.WriteLine();

            Fraction[,] table = new Fraction[n, m];

            Fraction min = new Fraction(1);

            for (int i = 0; i < n; i++)
            {
                string l = inp.ReadLine();

                if (l != null && l.Length > 0)
                {
                    string[] part = l.Split(' ');

                    for (int j = 0; j < m; j++)
                    {
                        if (part[j].Contains("/"))
                        {
                            string[] tmp = part[j].Split('/');
                            table[i, j] = new Fraction(Int32.Parse(tmp[0]), Int32.Parse(tmp[1]));
                        }
                        else
                        {
                            table[i, j] = new Fraction(Int32.Parse(part[j]));
                        }

                        if (table[i, j] < min)
                        {
                            min = table[i, j];
                        }
                    }
                }
            }

            if (min != 1)
            {
                min *= -1;
                Fraction d = new Fraction(1);
                min += d;

                for (int i = 0; i < table.GetLength(0); i++)
                {
                    for (int j = 0; j < table.GetLength(1); j++)
                    {
                        table[i, j] += min;
                    }
                }
            }

            for (int i = 0; i < table.GetLength(1); i++)
            {
                outp.Write("1 ");
                for (int j = 0; j < table.GetLength(0); j++)
                {
                    outp.Write("{0} ", (String)table[j, i]);
                }
                outp.WriteLine();
            }

            outp.Write("{0} ", 0);
            for (int i = 0; i < n; i++)
            {
                outp.Write("{0}", -1);
                if (i != n - 1)
                {
                    outp.Write(" ");
                }
            }
            outp.WriteLine();
        }
コード例 #5
0
ファイル: Calc.cs プロジェクト: Nslice/CSharp
        public static List <Fraction> GaussElimination(int equations, Fraction[][] a)
        {
            //https://matworld.ru/calculator/gauss-method-online.php    проверка

            int n = equations;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n - i - 1; j++)
                {
                    if (Fraction.Abs(a[j][0]) < Fraction.Abs(a[j + 1][0]))
                    {
                        Fraction[] tmp = a[j];
                        a[j]     = a[j + 1];
                        a[j + 1] = tmp;
                    }
                }
            }


            for (int i = 0; i < n - 1; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    Fraction t = -a[j][i] / a[i][i];
                    for (int k = 0; k <= n; k++)
                    {
                        a[j][k] = a[j][k] + t * a[i][k];
                    }
                }
            }

            #region show

            //            Console.WriteLine("\n\nThe matrix after gauss-elimination is as follows:\n");
            //            for (int i = 0; i < n; i++) //print the new matrix
            //            {
            //                for (int j = 0; j <= n; j++)
            //                    Console.Write("{0,16}", a[i][j]);
            //                Console.WriteLine();
            //            }

            #endregion


            Fraction[] x = new Fraction[n];

            for (int i = n - 1; i >= 0; i--)
            {
                x[i] = a[i][n];
                for (int j = i + 1; j < n; j++)
                {
                    if (j != i)
                    {
                        x[i] = x[i] - a[i][j] * x[j];
                    }
                }

                x[i] = x[i] / a[i][i];
            }

            return(new List <Fraction>(x));
        }