1.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. let constraints = new Array(n).fill(null).map(() => new Array(k + p + 1));
  2. let objectiveFunctionCoefficients = new Array(k + p + 1);
  3. for (let i = 0; i < k; i++) {
  4. console.log("Введите отрицательные коэффициенты");
  5. objectiveFunctionCoefficients[i] = parseInt(prompt());
  6. }
  7. for (let i = k; i < objectiveFunctionCoefficients.length; i++) {
  8. objectiveFunctionCoefficients[i] = 0;
  9. }
  10. let m = constraints.length; // Количество ограничений
  11. let n = constraints[0].length - 1; // Количество переменных
  12. let table = new Array(m + 1).fill(null).map(() => new Array(n + 1)); // Создаем таблицу для симплекс метода
  13. // Заполняем таблицу с учетом ограничений и целевой функции
  14. for (let i = 0; i < m; i++) {
  15. for (let j = 0; j < n; j++) {
  16. table[i][j] = constraints[i][j];
  17. }
  18. table[i][n] = constraints[i][n]; // Значения правой части ограничений
  19. }
  20. for (let j = 0; j < n; j++) {
  21. table[m][j] = objectiveFunctionCoefficients[j]; // Коэффициенты целевой функции
  22. }
  23. while (true) {
  24. // Находим входящий разрешающий столбец
  25. let pivotColumn = -1;
  26. for (let j = 0; j < n; j++) {
  27. let min = table[m][0];
  28. if (table[m][j] < 0) {
  29. if (min > table[m][j]) {
  30. min = table[m][j];
  31. pivotColumn = j;
  32. } else {
  33. pivotColumn = j;
  34. }
  35. }
  36. }
  37. if (pivotColumn == -1) { // Если все коэффициенты целевой функции неотрицательны, завершаем метод
  38. break;
  39. }
  40. // Находим исходящую строку по минимальному отношению
  41. let pivotRow = -1;
  42. let minRatio = Number.MAX_VALUE;
  43. for (let i = 0; i < m; i++) {
  44. if (table[i][pivotColumn] > 0) {
  45. let ratio = table[i][n] / table[i][pivotColumn];
  46. if (ratio < minRatio) {
  47. minRatio = ratio;
  48. pivotRow = i;
  49. }
  50. }
  51. }
  52. if (pivotRow == -1) { // Если отношение не существует, задача неограничена
  53. throw new Error("Решение неограничено");
  54. }
  55. let pivotElement = table[pivotRow][pivotColumn];
  56. for (let j = 0; j < n + 1; j++) {
  57. table[pivotRow][j] /= pivotElement; // Делим строку на опорный элемент
  58. }
  59. // Обновляем таблицу
  60. for (let i = 0; i < m + 1; i++) {
  61. if (i !== pivotRow) {
  62. let multiplier = table[i][pivotColumn];
  63. for (let j = 0; j < n + 1; j++) {
  64. table[i][j] -= multiplier * table[pivotRow][j]; // Вычитаем из всех строк кроме опорной
  65. }
  66. }
  67. }
  68. }
  69. console.log("Решение симплекс-методом:");
  70. console.log("Значение целевой функции: " + table[m][n]);
  71. for (let i = 0; i < table.length; i++) {
  72. for (let j = 0; j < table[0].length; j++) {
  73. console.log(table[i][j] + " ");
  74. }
  75. console.log();
  76. }