Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.41 KB | None | 0 0
  1. OutputM[matr_, count_, vec_] := Module[{displayMatrix = matr},
  2. For[i = 1, i <= count + 1, i++,
  3. displayMatrix[[i]] = Append[displayMatrix[[i]], vec[[i]]]];
  4. Print[MatrixForm[displayMatrix]]];
  5.  
  6.  
  7. (*М-метод*)
  8. MMethod[MatrCoef_, RightPartB_, varsCount_, eqCount_, BeginBasis_,
  9. firstFakeVarLine_, lastFakeVarLine_] :=
  10. Module[{matrM = MatrCoef, vecB = RightPartB, Basis = BeginBasis},
  11. (*Переменная штрафа*)
  12. M = 5000;
  13. (*Вывод на экран исходной системы в виде \
  14. квадратной матрицы*)
  15. OutputM[matrM, eqCount, vecB];
  16. (*Зануляем коээфиценты при искусственных \
  17. переменных в целевой функции*)
  18. For[i = firstFakeVarLine, i <= lastFakeVarLine, i++,
  19. vecB[[1]] += vecB[[i]]*M;
  20. For[j = 1, j <= varsCount, j++,
  21. matrM[[1, j]] += matrM[[i, j]]*M
  22. ]];
  23.  
  24. OutputM[matrM, eqCount, vecB];
  25. (*Служебная переменная флага зацикливания*)
  26. doLoop = 1;
  27. (*Счётчик итераций*)
  28. iteration = 1;
  29. (*Для хранения значений ведущего столбца \
  30. потребуется отдельный массив,
  31. т.к.значения исходной матрицы M изменяются в процессе вычислений*)
  32. leadColumn = Table[0, {i, eqCount + 1}];
  33. (*Цикл,
  34. пока не останется отрицательных коэффициентов в строке целевой \
  35. функции для max*)
  36. (*Цикл,пока не останется положительных коэффициентов в строке \
  37. целевой функции для min*)
  38. While[doLoop == 1,
  39. (*Найти максимальный по модулю отрицательный \
  40. коэффициент среди небазисных переменных для max
  41. minKoefficient=0;*)
  42. (*Найти максимальный положительный коэффициент \
  43. среди небазисных переменных для min*)
  44. maxKoefficient = 0;
  45. varToAdd = 0;
  46. For[i = 1, i <= varsCount, i++,
  47. If[! MemberQ[Basis, i] && matrM[[1, i]] > maxKoefficient,
  48. maxKoefficient = matrM[[1, i]];
  49. varToAdd = i]];(*нашли ведущий столбец*)
  50. If[maxKoefficient > 0,
  51. (*Найти удаляемую переменную,то есть ту,
  52. у которой отношение правой части к коэффициенту минимально*)
  53. Print["Итерация # " <> ToString[iteration++]];
  54. Print["Ввести в базис переменную номер " <> ToString[varToAdd]];
  55.  
  56. varToRemove = 0;
  57. minRatio = -1;
  58. For[i = 2, i <= eqCount + 1,
  59. i++, (*начинаем со строк ограничений*) \
  60. (*ищем минимальное соотношенние коэфф и правой части*) (*нашли \
  61. ведущую строку*)
  62. If[matrM[[i, varToAdd]] >
  63. 0 && (vecB[[i]]/matrM[[i, varToAdd]] < minRatio ||
  64. minRatio < 0),
  65. minRatio = vecB[[i]]/matrM[[i, varToAdd]];
  66. varToRemove = i]];
  67.  
  68. Print[
  69. "Удалить из базиса переменную номер " <>
  70. ToString[Basis[[varToRemove - 1]]]];
  71. leadElement = matrM[[varToRemove, varToAdd]];
  72. Print["Ведущий элемент = " <> ToString[leadElement]];
  73. For[i = 1, i <= eqCount + 1, i++,
  74. leadColumn[[i]] =
  75. matrM[[i, varToAdd]]]; (*меняем ведущий столбец*)
  76.  
  77. For[i = 1, i <= varsCount, i++,
  78. (*Сформировать новую ведущую \
  79. строку*) (*делаем 1 при вед элементе,
  80. а остальные просто делим на коэф при нем*)
  81. matrM[[varToRemove, i]] =
  82. matrM[[varToRemove, i]]/leadElement; (*Новая ведущая строка=
  83. Текущая ведущая строка/ведущий элемент*)
  84. (*Сформировать новую Z-строку матрицу коэффициентов*)
  85. (*Новая строка=
  86. Текущая строка\[Dash](Ее коэффициент в ведущем столбце х Новая \
  87. ведущая строка)*)
  88. For[j = 1, j <= eqCount + 1, j++,
  89. If[j != varToRemove,
  90. matrM[[j, i]] =
  91. matrM[[j, i]] - leadColumn[[j]] matrM[[varToRemove, i]]]]];
  92. (*Обновить правые части*)
  93. vecB[[varToRemove]] = vecB[[varToRemove]]/leadElement;
  94. For[i = 1, i <= eqCount + 1, i++,
  95. If[i != varToRemove,
  96. vecB[[i]] = vecB[[i]] - leadColumn[[i]] vecB[[varToRemove]]]];
  97. (*Обновить базис*)
  98. Basis[[varToRemove - 1]] = varToAdd;
  99. Print["Базис " <> ToString[Basis]];
  100. (*Вывести матрицу на \
  101. очередной итерации*)
  102. OutputM[matrM, eqCount, vecB];
  103. doLoop = 1, doLoop = 0]];
  104. Print["Рассчёт закончен!"];
  105. Return[{matrM, vecB, Basis}]]
  106.  
  107.  
  108.  
  109. (*Ввод входных данных*)
  110. Clear[M];
  111. (*1-я строка матрицы M представляет собой \
  112. Z-уравнение,последующие строки-ограничения в виде равенств*)
  113. Matr = {{-10, -4, -8, -6, -2, -3, -8, -2, -6, -6, 0, 0, 0, 0, 0, 0, 0,
  114. 0, 0, 0, 0, 0, 0, 0, 0, -M, -M, -M}, {1, 1, 1, 1, 0, 0, 0, 0, 0,
  115. 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  116. {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  117. 0, 0, 0, 0, 0, 0},
  118. {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
  119. 0, 0, 0, 0, 0, 0},
  120. {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
  121. 0, 0, 0, 0, 0, 0},
  122. {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
  123. 0, 0, 0, 0, 0, 0},
  124. {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
  125. 0, 0, 0, 0, 0, 0},
  126. {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
  127. 0, 0, 0, 0, 0, 0},
  128. {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
  129. 0, 0, 0, 0, 0, 0},
  130. {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
  131. 0, 0, 0, 0, 0, 0},
  132. {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
  133. 0, 0, 0, 0, 0, 0},
  134. {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  135. 1, 0, 0, 0, 0, 0},
  136. {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  137. 0, 1, 0, 0, 0, 0},
  138. {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  139. 0, 0, 1, 0, 0, 0},
  140. {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  141. 0, 0, 0, 1, 0, 0},
  142. {10, 4, 8, 6, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  143. 0, 0, 0, 0, 0, 1, 0},
  144. {10, 4, 8, 6, 0, 0, -8, -2, -6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  145. 0, 0, 0, 0, 0, 0, 0, 1}};
  146.  
  147. (*B-массив правых частей равенств,его 1-ый \
  148. элемент равен значению целевой функции*)
  149. B = {0, 400, 800, 600, 700, 700, 700, 700, 700, 700, 700, 700, 700,
  150. 700, 1000, 600, 600};
  151. (*Кол-во переменных задачи,необходимо указывать \
  152. для каждого конкретного случая*)
  153. varsCount = Length[Matr[[1]]];
  154. (*Кол-во ограничений задачи,необходимо \
  155. указывать для каждого конкретного случая*)
  156. eqCount = Length[Matr] - 1;
  157. (*Начальное допустимое базисное \
  158. решение,необходимо указывать*)
  159. Basis = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
  160. 26, 27, 28};
  161. Print["M-метод НАЧАЛ РАБОТУ"];
  162. MMethod[Matr, B, varsCount, eqCount, Basis, 15, 17];
  163. Print["M-метод ЗАКОНЧИЛ работу"];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement