123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- let constraints = new Array(n).fill(null).map(() => new Array(k + p + 1));
- let objectiveFunctionCoefficients = new Array(k + p + 1);
- for (let i = 0; i < k; i++) {
- console.log("Введите отрицательные коэффициенты");
- objectiveFunctionCoefficients[i] = parseInt(prompt());
- }
- for (let i = k; i < objectiveFunctionCoefficients.length; i++) {
- objectiveFunctionCoefficients[i] = 0;
- }
- let m = constraints.length; // Количество ограничений
- let n = constraints[0].length - 1; // Количество переменных
- let table = new Array(m + 1).fill(null).map(() => new Array(n + 1)); // Создаем таблицу для симплекс метода
- // Заполняем таблицу с учетом ограничений и целевой функции
- for (let i = 0; i < m; i++) {
- for (let j = 0; j < n; j++) {
- table[i][j] = constraints[i][j];
- }
- table[i][n] = constraints[i][n]; // Значения правой части ограничений
- }
- for (let j = 0; j < n; j++) {
- table[m][j] = objectiveFunctionCoefficients[j]; // Коэффициенты целевой функции
- }
- while (true) {
- // Находим входящий разрешающий столбец
- let pivotColumn = -1;
- for (let j = 0; j < n; j++) {
- let min = table[m][0];
- if (table[m][j] < 0) {
- if (min > table[m][j]) {
- min = table[m][j];
- pivotColumn = j;
- } else {
- pivotColumn = j;
- }
- }
- }
- if (pivotColumn == -1) { // Если все коэффициенты целевой функции неотрицательны, завершаем метод
- break;
- }
- // Находим исходящую строку по минимальному отношению
- let pivotRow = -1;
- let minRatio = Number.MAX_VALUE;
- for (let i = 0; i < m; i++) {
- if (table[i][pivotColumn] > 0) {
- let ratio = table[i][n] / table[i][pivotColumn];
- if (ratio < minRatio) {
- minRatio = ratio;
- pivotRow = i;
- }
- }
- }
- if (pivotRow == -1) { // Если отношение не существует, задача неограничена
- throw new Error("Решение неограничено");
- }
- let pivotElement = table[pivotRow][pivotColumn];
- for (let j = 0; j < n + 1; j++) {
- table[pivotRow][j] /= pivotElement; // Делим строку на опорный элемент
- }
- // Обновляем таблицу
- for (let i = 0; i < m + 1; i++) {
- if (i !== pivotRow) {
- let multiplier = table[i][pivotColumn];
- for (let j = 0; j < n + 1; j++) {
- table[i][j] -= multiplier * table[pivotRow][j]; // Вычитаем из всех строк кроме опорной
- }
- }
- }
- }
- console.log("Решение симплекс-методом:");
- console.log("Значение целевой функции: " + table[m][n]);
- for (let i = 0; i < table.length; i++) {
- for (let j = 0; j < table[0].length; j++) {
- console.log(table[i][j] + " ");
- }
- console.log();
- }
|