/* Конструктор на основе задачи, */ public SimplexMethodM1(Task a1, Zadacha f1) { SimplexTableM table; double s = 0; a = new List <List <double> >(); b = new List <double>(); c = new List <double>(); m = a1.b.Count; n = a1.c.Count; n1 = n + m; List <double> u = new List <double>(); for (int i = 0; i < m; i++) { u = new List <double>(); b.Add(a1.b[i]); for (int j = 0; j < n; j++) { u.Add(a1.a[i][j]); } a.Add(u); } for (int i = 0; i < n; i++) { c.Add(a1.c[i]); c1.Add(0); } f = f1; z = 0; z1 = 0; for (int i = 0; i < m; i++) { z1 = z1 + b[i]; } z1 = z1 * ((f == Zadacha.Max) ? -1 : 1); for (int i = 0; i < m; i++) { c.Add(0); c1.Add(f == Zadacha.Max ? -1 : 1); Cb.Add(0); Cb1.Add(f == Zadacha.Max ? -1 : 1); basis.Add(n + i); for (int j = 0; j < m; j++) { a[i].Add((i == j) ? 1 : 0); } } for (int i = 0; i < n1; i++) { x.Add(0); delta.Add(-1 * c[i]); } for (int i = 0; i < n; i++) { s = 0; for (int j = 0; j < m; j++) { s = s + a[j][i]; } delta1.Add((f == Zadacha.Max?-1:1) * s); } for (int i = 0; i < m; i++) { delta1.Add(0); } for (int i = 0; i < n; i++) { name.Add(string.Format("x{0}", i + 1)); } for (int i = 0; i < m; i++) { name.Add(string.Format("y{0}", i + 1)); } table = new SimplexTableM( a, b, Cb, Cb1, name, basis, m1, delta, delta1, z, z1); steps.Add(table); CreateSolution(); }
/* Решение задачи, */ private void CreateSolution() { int i1 = 0; int j1 = 0; int k = 0; SimplexTableM table; while (!IsOptimal() && IsExists() == Solution.Exists) { j1 = ResolvingColumn(); i1 = ResolvingRow(j1); k = steps.Count; steps[k - 1].ResolvingRowColumn(i1, j1); NewSimplexTable(i1, j1); information1.Add(string.Format( "Из базиса выводится переменная {0} и " + "в базис вводится переменная {1}, ", name[basis[i1]], name[j1])); basis[i1] = j1; Cb[i1] = c[j1]; Cb1[i1] = c1[j1]; if (m1 == 2) { m1 = 1; for (int i = 0; i < n1; i++) { if (f == Zadacha.Max && delta1[i] < 0 || f == Zadacha.Min && delta1[i] > 0) { m1 = 2; break; } } } table = new SimplexTableM( a, b, Cb, Cb1, name, basis, m1, delta, delta1, z, z1); steps.Add(table); } solution = IsExists(); if (solution == Solution.Exists) { information = string.Format( "Z{0}={1}, \r\nколичество шагов решения {2}, ", (f == Zadacha.Max) ? "max" : "min", z, steps.Count); information1.Add("Получено оптимальное решение,"); for (int i = 0; i < m; i++) { x[basis[i]] = b[i]; } } else { information = "Задача не имеет решения, так как " + " функция не ограничена на многограннике решений, "; information1.Add( "В столбце, который может быть разрешающим, " + " все элементы неположительны, " + " то есть отрицательны или равны 0, " + "задача не имеет решения,"); } }