/// <summary> /// Рассчитывает новую таблицу /// </summary> /// <param name="oldTable">Предыдущая таблица</param> /// <returns>Новая таблица</returns> private StepTable NextTable(StepTable oldTable) { var n = oldTable.UnknownQuantity; var m = oldTable.RestrictionQuantity; var q = oldTable.Q; var p = oldTable.P; var mainElement = oldTable.RestrictionCoefficient[q][p]; //Копирование значений var c = new double[n]; oldTable.MainCoefficient.CopyTo(c, 0); var basis = new int[m]; oldTable.BasisIndex.CopyTo(basis, 0); var b = new double[m]; oldTable.FreeMember.CopyTo(b, 0); var a = new double[m][]; var i = 0; foreach (var row in oldTable.RestrictionCoefficient) { row.CopyTo(a[i++] = new double[n], 0); } //Изменение значений по формулам basis[q] = p; a[q] = a[q].Select(e => e / mainElement).ToArray(); b[q] = oldTable.FreeMember[q] / mainElement; for (i = 0; i < m; i++) { if (i == q) { continue; } b[i] = b[i] - b[q] * oldTable.RestrictionCoefficient[i][p]; for (int j = 0; j < n; j++) { a[i][j] = a[i][j] - a[q][j] * oldTable.RestrictionCoefficient[i][p]; } } return(new StepTable(c, basis, b, a)); }
public Solution(StepTable zeroTable) { //добавляем нулевую таблицу в список Steps.Add(zeroTable); //рассчитываем новые таблицы, пока не достигнем оптимального решения while (!Steps.Last().FinalTable) { Steps.Add(NextTable(Steps.Last())); } var lastTable = Steps.Last(); //Заполняем значение функции и переменных Value = lastTable.Value; Unknowns = new double[lastTable.UnknownQuantity]; int i = 0; foreach (var basisIndex in lastTable.BasisIndex) { Unknowns[basisIndex] = lastTable.FreeMember[i++]; } }