Получение оптимального решения в Mathcad
Также для решения задачи будет иcпользоваться Mathcad - система компьютерной алгебры из класса систем автоматизированного проектирования.
Для того чтобы решить задачу линейного программирования в Mathcad, нужно сначала объявить целевую функцию.
В данном случае она имеет вид f(x1, x2, x3) .
Затем, при помощи оператора := запишем ЦФ.
Далее, укажем начальные значения переменных, также через оператор :=
После написания ЦФ, создаем блок ограничений при помощи слова Given. Укажем все ограничения, наложенные на ЦФ.
Далее, создадим матрицу из одного столбца, в строках которой будут перечислены переменные x1..x3.
Этой матрице присвоим (:=) значение функции Maximize(f, x1, x2, x3) и поставим знак =.
В матрице выведутся значения x1..x3, при которых ЦФ достигает максимума.
Чтобы найти максимум ЦФ, напишем f(x1, x2, x3) = и Mathcad выведем максимальное значение при заданных ограничениях.
Все, написанные действия проиллюстрированы на рисунке ниже.
Рисунок 4 Задание начальных приближений
Рисунок 5 Задание ограничений
Рисунок 6 Получение решений
Как мы можем видеть, решатель выдал нам следующее оптимальное решение:
Значения матрицы – это значения количества тканей трех артикулов
(1000, 6*10^3 = 6000, 2,5 * 10^3 = 2500)
Значение функции – это максимальная общая стоимость тканей = 7.3 * 10^4 = 73000
Получение оптимального решения в Scilab
Еще одна программа, которая отлично подойдет для решения данной задачи – Scilab — пакет прикладных математических программ, предоставляющий открытое окружение для инженерных (технических) и научных расчётов.
Для решения задач линейного программирования в пакете Scilab существует библиотека Quapro Toolbox.
Quapro Toolbox предоставляет три функции:
linpro – функция для решения задач ЛП.
mps2linpro – функция перевода данных из формата MPS(специальный формат для задач ЛП) в формат для функции linpro.
quapro – функция для линейно-квадратичной оптимизации.
Нам понадобится только функция linpro.
Функция решает задачу:
x = 〖(x1,..,xn)〗^T
1. 〖ci〗_j≤x_j≤〖cs〗_j,j∈[1,n]
2. 〖(C*x)〗_j≤b_j,j∈[1,n]
3. f(x)= p^T*x→min
Данная функция имеет следующий вид:
[x,lagr,f]=linpro(p,C,b[,ci,cs]),
Адаптирую ее для своей задачи:
Так как функция linpro ищет минимум функции, то изменим некоторые параметры функции linpro:
[x,lagr,f]=linpro(-p,C,b,ci,cs);
Теперь создадим новый sce- файл(для этого подойдёт любое приложение типа блокнот), где запишем следующую программу:
C=[0.02,0,0.04;0.04,0.03,0.01;0.03,0.02,0.025;1,1.5,2]; //зададим матрицу С
b=[200;500;450;15000]; // зададим вектор b
ci=[1000;2000;2500]; // нижняя граница переменных
cs=[5000;9000;4000]; // верхняя граница переменных
p=[5;8;8]; // коэффициенты при целевой функции
[x,lagr,f]=linpro(-p,C,b,ci,cs); // сама функция
x // вывести значения переменных для оптимального решения
f // вывести значение ЦФ для оптимального решения
Запустим этот файл на исполнение и получаем следующее
Рисунок 7 Результат
Мы можем увидеть решение:
В начале программа выводит количество метров ткани, которое нужно произвести:
Затем выводится максимальное значение функции:
Выводы
При значениях переменных x1, x2, x3, полученных при помощи различных пакетов, мы получили максимальное значение целевой функции. С экономической точки зрения, значения переменных – ткань в метрах, а значение целевой функции – это стоимость тканей. Затраты будут максимальными с учетом введенных ограничений.
Таким, образом мы получили оптимальное решение: необходимо произвести 1000м ткани 1 артикула, 6000м ткани 2 артикула и 2500м ткани 3 артикула, чтобы общая стоимость была максимальна – 73000.