-
Осуществление перехода от многокритериальной задачи к однокритериальной с использованием следующих подходов:
Б) Свертка критериев
Свертка критериев имеет вид:
здесь .
Так же справедлива формула с нормированными критериями:
здесь , где - оптимальное решение задачи по каждому критерию в отдельности.
Проделаем описанные операции для нашей задачи. Вначале опишем функции вычисления каждого из критериев соответственно для стоимости, последствий и удовольствия. Сформируем граничные условия: количество всего провианта меньше 100, а так же для каждого из видов укажем, что он не может быть больше 100(или 3 и 5 для водки и коньяка) и любой из продуктов не может весить отрицательно(соков с коктелями минимум по 3 и 2).
function [money] = money(x)
if (0.3*x(1)+x(2)+x(3)+x(4)+x(5)+0.5*x(6)) <= 25
money = 50*x(1)+30*x(2)+30*x(3)+50*x(4)+70*x(5)+20*x(6);
else
money = 50*x(1)+30*x(2)+30*x(3)+50*x(4)+70*x(5)+20*x(6) + (0.3*x(1)+x(2)+x(3)+x(4)+x(5)+0.5*x(6)-25)*100;
end
end
function [aftermath] = aftermath(x)
aftermath= 0.9*x(1)+8*x(2)+2*x(5);
end
function [pleasure] = pleasure(x)
pleasure= -(0.5*x(1)+2*x(2)+5*x(5)) - (0.3*x(1)+5*x(3)+4*x(4)+x(5)+5*x(6));
end
%шампанское водка сок коктейли коньяк салаты
% min F(X) subject to: A*X <= B, Aeq*X = Beq (linear constraints)
% C(X) <= 0, Ceq(X) = 0 (nonlinear constraints)
% LB <= X <= UB (bounds)
x0=[0;0;3;2;0;0]; %начальное предположение о решении
A=[1 1 1 1 1 1];
B=100;
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x1, fval1] = fmincon(@pleasure, x0, A, B, [], [], LB, UB); %оптимальное решение задачи по первому критерию
[x2, fval2] = fmincon(@aftermath, x0, A, B, [], [], LB, UB); %оптимальное решение задачи по второму критерию
[x3, fval3] = fmincon(@money, x0, A, B, [], [], LB, UB); %оптимальное решение задачи по третьему критерию
Исходя из полученных оптимальных решений нужно сформировать функцию, сочетающую в себе все три критерия, пронормированных по их оптимальному значению, а так же с учетом коэффициента важности.
function [final] = final(x, fval, weight)
zero = fval == 0;
fval(zero) = 1;
final= pleasure(x)*weight(1)/fval(1) + aftermath(x)*weight(2)/fval(2) + money(x)*weight(3)/fval(3);
end
fval = [abs(fval1) abs(fval2) fval3] %преобразуем решения в массив(что бы легче передавать в функцию было.
ѺѺѺ fval = 503 0 190
weight = [0.3 0.2 0.5]; %тоже самое, но с весами. веса выбираются эмпирически.
[x4, F] = fmincon(@(x)final(x, fval, weight), x0, A, B, [], [], LB, UB)
ѺѺѺ x4 = 0
ѺѺѺ 0
ѺѺѺ 3
ѺѺѺ 2
ѺѺѺ 0
ѺѺѺ 0
В результате свертки получены очень не точные данные. Дело в том, что решения, полученные для критериев в отдельности, в задаче не применимы. К примеру, минимум последствий без ограничения на минимум, необходимый купить сводит задачу к минимизации затрат, а следовательно выгоднее всего ничего не покупать. Поэтому я ввел экспертные оценки для критериев: можно заметить, что цена примерно в 10 раз больше, нежели остальные параметры, поэтому я ввел такие усредняющие коэффициенты:
fval = [1 1 10];
[x5, F2] = fmincon(@(x)final(x, fval, weight), x0, A, B, [], [], LB, UB)
ѺѺѺ x5 = 0
ѺѺѺ 0
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0
ѺѺѺ 40.0000
Исходя из последнего вычисления, нам выгоднее всего взять 40 штук салата, 3 обязательных сока и 2 обязательных коктейля. Что интересно, можно изменять в больших пределах и веса, с которыми берем параметры, и усредняющие оценки. К примеру при изменении усредняющей оценки в промежутке от [1 1 7] до [1 1 23] мы получим один и тот же ответ. А на верхних и нижних границах происходит скачек в решении: либо 0 салатов, либо 95 соответственно. Про коэффициенты тоже самое и про веса: к примеру, при весе weight = [0.5 0.1 0.4] ответ будет таким же. Это свидетельствует о чрезвычайно высокой сходимости решения.
А) Выделение главного критерия
В данном методе выбирается один из критериев, например Сi, который наиболее полно отражает цель принятия решений. Остальные критерии учитываются только с точки зрения возможного указания их нижних границ Сj(a) ≥ γi, ji. Таким образом, исходная задача многокритериального принятия решений заменяется однокритериальной задачей с критерием Ci, т.е.
при ограничениях
В условии задачи сказано: «Естественно, необходимо потратить как можно меньше денег». В связи с этим, выбираем в качестве главного критерия стоимость. А для оставшихся целевых функций указываем нижние границы. Исходя из проведенной свертки, мы можем их вычислить и получить соответственно нуль для «последствий» и 223 для «удовольствия». Добавим к задаче эти ограничения:
0.5x1 + 2x2 + 5x5 + 0.3x1 + 5x3 + 4x4 + x5 + 5x6 > 223
0.9x1 + 8x2 + 5x5 > 0
x0=[0;0;3;2;0;0]; %начальное предположение о решении
A=[1 1 1 1 1 1; -0.9 -8 -0 -0 -2 -0; -0.8 -2 -5 -4 -6 -5];
B=[100; -10; -223];
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x, fval] = fmincon(@money, x0, A, B, [], [], LB, UB)
Получаем:
ѺѺѺ x = 0
ѺѺѺ 0
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0
ѺѺѺ 40.0000
Изменив нижнюю границу «удовольствия» получим похожее распределение, только количество салатов уменьшится:
x0=[0;0;3;2;0;0]; %начальное предположение о решении
A=[1 1 1 1 1 1; -0.9 -8 -0 -0 -2 -0; -0.8 -2 -5 -4 -6 -5]; B=[100; -0; -123];
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x, fval] = fmincon(@money, x0, A, B, [], [], LB, UB)
Получаем:
ѺѺѺ x = 0
ѺѺѺ 0
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0
ѺѺѺ 20.0000
Интересно, что если поставить нижнюю границу для «последствий» отличной от нуля, на небольших значениях выгоднее добирать водки нежели коньяка или шампанского:
x0=[0;0;3;2;0;0]; %начальное предположение о решении
A=[1 1 1 1 1 1; -0.9 -8 -0 -0 -2 -0; -0.8 -2 -5 -4 -6 -5]; B=[100; -20; -223];
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x, fval] = fmincon(@money, x0, A, B, [], [], LB, UB)
ѺѺѺ x = 0
ѺѺѺ 2.5000
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0
ѺѺѺ 39.0000
А на больших, распределение строится очень необычным способом:
x0=[0;0;3;2;0;0]; %начальное предположение о решении
A=[1 1 1 1 1 1; -0.9 -8 -0 -0 -2 -0; -0.8 -2 -5 -4 -6 -5]; B=[100; -100; -223];
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x, fval] = fmincon(@money, x0, A, B, [], [], LB, UB)
ѺѺѺ x = 66.3009
ѺѺѺ 3.3460
ѺѺѺ 13.6003
ѺѺѺ 1.6540
ѺѺѺ 5.3460
ѺѺѺ 10.6003
Таким образом, задача выделения главного критерия сильно зависит от оценок, которые мы вводим для вторичных критериев. Если брать оценки, полученные при свертке, полученный ответ совпадает с ответом данным методом свертки: 3 литра сока, 2 литра коктейлей и 40 штук салата.
В) Максимин или минимакс (он же метод максиминной свертки)
Максиминная свертка имеет вид:
Решение является наилучшим, если для всех a выполняется условие , или
Составим функцию, содержащую все функции, однако нужно не забыть пронормировать их так же, как мы делали в свертке.
function minmax = minmax(x)
minmax(1)=(-(0.5*x(1)+2*x(2)+5*x(5)) - (0.3*x(1)+5*x(3)+4*x(4)+x(5)+5*x(6)));
minmax(2)=0.9*x(1)+8*x(2)+2*x(5);
if (0.3*x(1)+x(2)+x(3)+x(4)+x(5)+0.5*x(6)) <= 25
minmax(3) = (50*x(1)+30*x(2)+30*x(3)+50*x(4)+70*x(5)+20*x(6))/10;
else
minmax(3) = (50*x(1)+30*x(2)+30*x(3)+50*x(4)+70*x(5)+20*x(6) + (0.3*x(1)+x(2)+x(3)+x(4)+x(5)+0.5*x(6)-25)*100)/10;
end
end
Теперь возьмем граничные условия, сформированные ранее и запустим функцию fminimax. Однако надо учесть, что в Matlab реализована только функция fminimax, которая минимизирует наихудшие значения системы функций нескольких переменных, начиная со стартовой оценки и для реализации максиминной свертки необходимо передавать функции обратные целевым
x0=[1;2;3;4;5;6]; %начальное предположение о решении
A=[1 1 1 1 1 1];
B=100;
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x, fval] = fminimax(@minmax, x0, A, B, [], [], LB, UB)
ѺѺѺ Optimization terminated: magnitude of search direction less than
ѺѺѺ 2*options.TolX
ѺѺѺ and maximum constraint violation is less than options.TolCon.
ѺѺѺ Active inequalities (to within options.TolCon = 1e-006):
ѺѺѺ x = 0
ѺѺѺ -0.0000
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0.0000
ѺѺѺ 0
В результате выполнения этого метода был получен минимальный возможный результат в задаче, причем никакими средствами не удалось с помощью функции fminimax получить другой. Mathlab всегда выдает сообщение «Optimization terminated: magnitude of search direction less than…» и выводит ответ. Я пытался это лечить указанием различных начальных приближений(так рекомендуют на сайте Mathlab) и назначением различных коэффициентов нормирования, но все тщетно. Я не смог адекватно решить данную задачу методом fmminimax. Ответ всегда получается 3 литра соков и 2 литра коктейлей.
Г) Метод последовательных уступок
В этом методе последовательно решается задача минимизации для каждого из критериев, и в ограничение вносится окно с некоторым доверительным интервалом, основанном на прошлом решении. Я взял уступку равную 20%. Так как выделение главным критерием стоимости уже было, на этот раз я решил взять главным критерием «удовольствие».
Сперва возьмем те же граничные условия что и раньше, и решим задачу оптимизации для критерия «удовольствие».
x0=[0;0;3;2;0;0];
A=[1 1 1 1 1 1];
B=100;
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x1, fval1] = fmincon(@pleasure, x0, A, B, [], [], LB, UB)
Получили:
ѺѺѺ x1 = -0.0000
ѺѺѺ 0.0000
ѺѺѺ 48.0000
ѺѺѺ 2.0000
ѺѺѺ 5.0000
ѺѺѺ 45.0000
ѺѺѺ fval1 = -503
Теперь, решим задачу минимизации «последствий», и укажем что наше решение должно находится на отдалении не больше 20% по «удовольствию» от только что найденного решения.
A=[1 1 1 1 1 1;-0.8 -2 -5 -4 -6 -5;0.8 2 5 4 6 5];
B=[100; fval1*0.8; abs(fval1)*0.8];
[x2, fval2] = fmincon(@aftermath, x0, A, B, [], [], LB, UB)
Получили:
ѺѺѺ x2 = 0
ѺѺѺ -0.0000
ѺѺѺ 31.7415
ѺѺѺ 24.9963
ѺѺѺ 0
ѺѺѺ 28.7415
ѺѺѺ fval2 =-1.6186e-016
После решения этой задачи, мы смогли свести «последствия» к нулю, не сильно изменив «удовольствие» от провианта.
A=[1 1 1 1 1 1;-0.8 -2 -5 -4 -6 -5;0.8 2 5 4 6 5; -0.9 -8 -0 -0 -2 -0; 0.9 8 0 0 2 0];
B=[100; fval1*0.8; -fval1*0.8; -fval2*0.8; fval2*0.8];
[x3, fval3] = fmincon(@money, x0, A, B, [], [], LB, UB)
Получили:
ѺѺѺ x3 = 0
ѺѺѺ 0
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0.0000
ѺѺѺ 75.8800
ѺѺѺ fval3 = 3.5016e+003
Таким образом, в результате решения мы нашли оптимальный вариант закупки провианта, а именно 3 литра сока, 2 литра коктейлей, и 76 килограмм салата. Общей стоимостью 3520.
Д) fgoalattain
fgoalattain решает задачу достижения цели, которая является одной из формулировок задач для векторной оптимизации.
Синтаксис:
x = fgoalattain(fun,x0,goal,weight), где
fun – целевая функция,
х0 – начальные значения,
goal – целевые значения,
weight – веса.
Так же, как и в предыдущих вариантах, сначала формируем граничные условия. Затем формируем вектор goal,заполняя его предельными значениями для каждого из критериев, и формируем вектор weight как модуль всех значений вектора goal.
x0=[0;0;3;2;0;0];
A=[1 1 1 1 1 1];
B=100;
LB=[0;0;3;2;0;0];
UB=[100;3;100;100;5;100];
[x1, fval1] = fmincon(@pleasure, x0, A, B, [], [], LB, UB);
goal(1) = fval1;
[x2, fval2] = fmincon(@aftermath, x0, A, B, [], [], LB, UB);
goal(2) = fval2;
[x3, fval3] = fmincon(@money, x0, A, B, [], [], LB, UB);
goal(3) = fval3;
weight = abs(goal);
После формирования векторов веса и цели, можем запустить функцию fgoalattain. Так же, как и функция fminimax, она требует в качестве параметра передать адрес функции, содержащей вектор всех критериев.
[x, fval, attf] = fgoalattain(@minmax, x0, goal, weight, A, B, [], [], LB, UB)
Получим:
ѺѺѺ x = -0.0000
ѺѺѺ -0.0000
ѺѺѺ 3.0000
ѺѺѺ 2.0000
ѺѺѺ 0.0000
ѺѺѺ 62.1367
ѺѺѺ fval = -333.6833 -0.0000 253.9566
В результате, получили решение, в котором нам рекомендуют взять по 2 и 3 литра соков и коктейлей соответственно, а так же 62 штуки салата.
Для достоверности этого метода, так же немаловажно узнать значение attain_factor
ѺѺѺ attf = 0.3366
Аттейн фактор положителен, это значит что наше решение оказалось чуть хуже, нежели мы предполагали, но так как значение фактора невысокое, это не вносит большой ошибки в решение.
Сравнительная таблица результатов
Решение |
Ответ |
Вес |
Цена |
|||||
Выделение главного критерия |
0 |
0 |
3 |
2 |
0 |
40 |
25 |
990 |
Свертка критериев |
0 |
0 |
3 |
2 |
0 |
40 |
25 |
990 |
Минимакс |
0 |
0 |
3 |
2 |
0 |
0 |
5 |
190 |
Метод последовательных уступок |
0 |
0 |
3 |
2 |
0 |
76 |
43 |
3520 |
fgoalattain |
0 |
0 |
3 |
2 |
0 |
62 |
36 |
2530 |
Выводы:
Из результатов видно, что все методы, кроме minmax, дали примерно одинаковый результат. Метод последовательных уступок и fgoalattain дали несколько лучший результат для критерия “удовольствие”, зато увеличили стоимость.