/* * Составляем новую симплекс таблицу для решения задачи методом больших штрафов * вводим базисные переменные в уравнения, в которых их нет, вычисляем новую целевую * функцию */ 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); }
//Двойственный метод для игр 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(); }
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()); }
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(); }
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)); }