Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- OutputM[matr_, count_, vec_] := Module[{displayMatrix = matr},
- For[i = 1, i <= count + 1, i++,
- displayMatrix[[i]] = Append[displayMatrix[[i]], vec[[i]]]];
- Print[MatrixForm[displayMatrix]]];
- (*М-метод*)
- MMethod[MatrCoef_, RightPartB_, varsCount_, eqCount_, BeginBasis_,
- firstFakeVarLine_, lastFakeVarLine_] :=
- Module[{matrM = MatrCoef, vecB = RightPartB, Basis = BeginBasis},
- (*Переменная штрафа*)
- M = 5000;
- (*Вывод на экран исходной системы в виде \
- квадратной матрицы*)
- OutputM[matrM, eqCount, vecB];
- (*Зануляем коээфиценты при искусственных \
- переменных в целевой функции*)
- For[i = firstFakeVarLine, i <= lastFakeVarLine, i++,
- vecB[[1]] += vecB[[i]]*M;
- For[j = 1, j <= varsCount, j++,
- matrM[[1, j]] += matrM[[i, j]]*M
- ]];
- OutputM[matrM, eqCount, vecB];
- (*Служебная переменная флага зацикливания*)
- doLoop = 1;
- (*Счётчик итераций*)
- iteration = 1;
- (*Для хранения значений ведущего столбца \
- потребуется отдельный массив,
- т.к.значения исходной матрицы M изменяются в процессе вычислений*)
- leadColumn = Table[0, {i, eqCount + 1}];
- (*Цикл,
- пока не останется отрицательных коэффициентов в строке целевой \
- функции для max*)
- (*Цикл,пока не останется положительных коэффициентов в строке \
- целевой функции для min*)
- While[doLoop == 1,
- (*Найти максимальный по модулю отрицательный \
- коэффициент среди небазисных переменных для max
- minKoefficient=0;*)
- (*Найти максимальный положительный коэффициент \
- среди небазисных переменных для min*)
- maxKoefficient = 0;
- varToAdd = 0;
- For[i = 1, i <= varsCount, i++,
- If[! MemberQ[Basis, i] && matrM[[1, i]] > maxKoefficient,
- maxKoefficient = matrM[[1, i]];
- varToAdd = i]];(*нашли ведущий столбец*)
- If[maxKoefficient > 0,
- (*Найти удаляемую переменную,то есть ту,
- у которой отношение правой части к коэффициенту минимально*)
- Print["Итерация # " <> ToString[iteration++]];
- Print["Ввести в базис переменную номер " <> ToString[varToAdd]];
- varToRemove = 0;
- minRatio = -1;
- For[i = 2, i <= eqCount + 1,
- i++, (*начинаем со строк ограничений*) \
- (*ищем минимальное соотношенние коэфф и правой части*) (*нашли \
- ведущую строку*)
- If[matrM[[i, varToAdd]] >
- 0 && (vecB[[i]]/matrM[[i, varToAdd]] < minRatio ||
- minRatio < 0),
- minRatio = vecB[[i]]/matrM[[i, varToAdd]];
- varToRemove = i]];
- Print[
- "Удалить из базиса переменную номер " <>
- ToString[Basis[[varToRemove - 1]]]];
- leadElement = matrM[[varToRemove, varToAdd]];
- Print["Ведущий элемент = " <> ToString[leadElement]];
- For[i = 1, i <= eqCount + 1, i++,
- leadColumn[[i]] =
- matrM[[i, varToAdd]]]; (*меняем ведущий столбец*)
- For[i = 1, i <= varsCount, i++,
- (*Сформировать новую ведущую \
- строку*) (*делаем 1 при вед элементе,
- а остальные просто делим на коэф при нем*)
- matrM[[varToRemove, i]] =
- matrM[[varToRemove, i]]/leadElement; (*Новая ведущая строка=
- Текущая ведущая строка/ведущий элемент*)
- (*Сформировать новую Z-строку матрицу коэффициентов*)
- (*Новая строка=
- Текущая строка\[Dash](Ее коэффициент в ведущем столбце х Новая \
- ведущая строка)*)
- For[j = 1, j <= eqCount + 1, j++,
- If[j != varToRemove,
- matrM[[j, i]] =
- matrM[[j, i]] - leadColumn[[j]] matrM[[varToRemove, i]]]]];
- (*Обновить правые части*)
- vecB[[varToRemove]] = vecB[[varToRemove]]/leadElement;
- For[i = 1, i <= eqCount + 1, i++,
- If[i != varToRemove,
- vecB[[i]] = vecB[[i]] - leadColumn[[i]] vecB[[varToRemove]]]];
- (*Обновить базис*)
- Basis[[varToRemove - 1]] = varToAdd;
- Print["Базис " <> ToString[Basis]];
- (*Вывести матрицу на \
- очередной итерации*)
- OutputM[matrM, eqCount, vecB];
- doLoop = 1, doLoop = 0]];
- Print["Рассчёт закончен!"];
- Return[{matrM, vecB, Basis}]]
- (*Ввод входных данных*)
- Clear[M];
- (*1-я строка матрицы M представляет собой \
- Z-уравнение,последующие строки-ограничения в виде равенств*)
- Matr = {{-10, -4, -8, -6, -2, -3, -8, -2, -6, -6, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, -M, -M, -M}, {1, 1, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0},
- {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0},
- {10, 4, 8, 6, -2, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0},
- {10, 4, 8, 6, 0, 0, -8, -2, -6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1}};
- (*B-массив правых частей равенств,его 1-ый \
- элемент равен значению целевой функции*)
- B = {0, 400, 800, 600, 700, 700, 700, 700, 700, 700, 700, 700, 700,
- 700, 1000, 600, 600};
- (*Кол-во переменных задачи,необходимо указывать \
- для каждого конкретного случая*)
- varsCount = Length[Matr[[1]]];
- (*Кол-во ограничений задачи,необходимо \
- указывать для каждого конкретного случая*)
- eqCount = Length[Matr] - 1;
- (*Начальное допустимое базисное \
- решение,необходимо указывать*)
- Basis = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
- 26, 27, 28};
- Print["M-метод НАЧАЛ РАБОТУ"];
- MMethod[Matr, B, varsCount, eqCount, Basis, 15, 17];
- Print["M-метод ЗАКОНЧИЛ работу"];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement