Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / doc92 / Отчет №1.doc
Скачиваний:
29
Добавлен:
03.08.2013
Размер:
290.82 Кб
Скачать
  1. Осуществление перехода от многокритериальной задачи к однокритериальной с использованием следующих подходов:

Б) Свертка критериев

Свертка критериев имеет вид:

здесь .

Так же справедлива формула с нормированными критериями:

здесь , где - оптимальное решение задачи по каждому критерию в отдельности.

Проделаем описанные операции для нашей задачи. Вначале опишем функции вычисления каждого из критериев соответственно для стоимости, последствий и удовольствия. Сформируем граничные условия: количество всего провианта меньше 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 дали несколько лучший результат для критерия “удовольствие”, зато увеличили стоимость.

Соседние файлы в папке doc92