Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Оптимизация в среде MATLAB

..pdf
Скачиваний:
185
Добавлен:
15.11.2022
Размер:
2.81 Mб
Скачать

5 – величина производной по направлению меньше допустимой и нарушение ограничений меньше допустимого TolCon,

0 – число итераций или число вычислений функции превысило максимально установленное,

–1 – алгоритм остановлен функцией вывода, –2 – не найдено допустимой точки.

Структура output содержит поля: iterations – число итераций, funcCount число вычислений функции, lssteplength – размер шага линейного поиска, stepsize – конечное смещение по x, algorithm – примененный алгоритм, firstorderopt – мера оптимальности первого порядка, constrviolation – максимум функций ограничений, message – конечное сообщение. Последний выходной аргумент lambda содержит значения множителей Лагранжа по всем ограничениям: lower, upper, ineqlin, eqlin, ineqnonlin, eqnonlin.

Пример 20.

 

 

 

 

 

 

 

 

 

При двух целевых функциях

 

 

 

 

 

 

f (1 x )4

(x x )2

,

f

2

(4 x )4

(x x )2

1

1

2

1

 

 

2

2

1

и при условии –0,9 x1 + x2 0,5 достигнуть целевых значений goal1 = = 1,5, goal2 = 3.

Составимm-файл для вычисленияцелевыхфункцийиихградиентов:

function [f,g] = multifun1(x); f(1)=(1-x(1))^4+(x(2)-x(1))^2; f(2)=(4-x(2))^4+(x(2)-x(1))^2; g=[-4*(1-x(1))^3-2*(x(2)-x(1)) -2*(x(2)-x(1));

2*(x(2)-x(1)) -4*(4-x(2))^3+2*(x(2)-x(1))];

end

Начнем поиск решения с начальной точки (3 3) и весов, равных целям. Предварительно укажем на использование в вычислениях аналитических выражений целевых функций. В итоге последовательность команд имеет вид

>>x0=[3 3]; A=[0.9 -1]; b=[-0.5];

goal=[1.5 3]; w=goal;

131

options=optimset('GradObj','on'); [x,fval,attainfactor,exit,output]=fgoalattain(...

@multifun1,x0,goal,w,A,b,[],[],[],[],[],options)

В результате их выполнения получаем

x =

1.8671 2.8083

fval =

1.4512 2.9025 attainfactor =

-0.0325

exit =

4 output =

iterations: 8 funcCount: 40 lssteplength: 1 stepsize: 4.9593e-007

algorithm: 'goal attainment SQP, Quasi-Newton, line_search' firstorderopt: []

constrviolation: 5.7775e-007 message: [1x771 char]

Решение получено за восемь итераций комбинацией трех алгоритмов. Поставленные цели превышены: значения обеих целевых функций меньше целей. Об этом же свидетельствует отрицательное значение аргумента attainfactor (γ).

Теперь добавим требование точного достижения первой цели options=optimset('GradObj','on','GoalsExactAchieve',1);

Исполнение команд дает x =

1.7778 2.8427

fval =

1.5000 2.9277 attainfactor =

2.5824e-023

exit =

4 output =

iterations: 9

132

funcCount: 44 lssteplength: 1 stepsize: 6.5882e-012

algorithm: 'goal attainment SQP, Quasi-Newton, line_search' firstorderopt: []

constrviolation: 5.0931e-012 message: [1x771 char]

Как видим, первая цель достигнута точно. Значение первой целевой функции на очень малую величину больше 1,5, поэтому attainfactor оказался положительной, но практически равной нулю величиной. При этом и вторая цель достигается с большей точностью.

Пример 21.

При трех целевых функциях

f

(1 x )4

(x

x )2

,

f

2

(5 x )4

(2,5x

x )2

,

f

3

(4 x

)4 (x

x )2

1

1

2

1

 

 

1

2

1

 

 

2

2

1

достигнуть целевых значений goal1 = 15, goal2 = 13, goal3 = 19.

Запишем m-файл функций: function f = multifun2(x);

f(1)=(1-x(1))^4+(x(2)-x(1))^2; f(2)=(5-x(1))^4+(2.5*x(2)-x(1))^2; f(3)=(4-x(2))^4+(x(2)-x(1))^2;

end

Выполним команды

>> x0=[1 3];goal=[15 13 19]; w=goal; [x,fval,attainfactor,exit,output]=fgoalattain(@multifun2,x0,goal,w) x =

3.0506 1.8147 fval =

19.2103 16.6489 24.3330 attainfactor =

0.2807 exit =

4 output =

iterations: 7 funcCount: 28 lssteplength: 1 stepsize: 1.1515e-007

algorithm: 'goal attainment SQP, Quasi-Newton, line_search'

133

firstorderopt: [] constrviolation: 2.6497e-007 message: [1x771 char]

Как видно из полученного отчета, значения всех целевых функций больше желаемых, максимальное отклонение составляет 28 % (см. attainfactor). При этом все целевые ограничения оказались активными, что является признаком недоминируемости полученного решения. Стремясь улучшить значения первых двух целевых функций, введем опцию 'GoalsExactAchieve',2. После выполнения измененной программы имеем

x =

3.0506 1.8147

fval =

19.2103 16.6489 24.3330 attainfactor =

0.2807

Решение не изменилось, т.е. повысить точность достижения двух целей таким путем не удалось. Попробуем улучшить только первую цель, задав 'GoalsExactAchieve' равным 1. Исполнение команд показало, что и в этом случае решение не меняется. Тогда проверим влияние весов: изменим вес 1-й цели с 15 до 5, оставив остальные веса без изменения, и исключим 'GoalsExactAchieve'.

>> x0=[1 3];goal=[15 13 19]; w=[5 13 19]; [x,fval,attainfactor]=fgoalattain(@multifun2,x0,goal,w).

В результате выполнения этих команд получаем x =

2.9863 1.7553 fval =

17.0805 18.4092 26.9058 attainfactor =

0.4161

Таким образом, уменьшение веса первой цели привело к лучшему значению первой целевой функции, но это стало возможным за счет ухудшения двух других функций. Интересно отметить, что в полученном решении все целевые ограничения снова оказались активными (все отклонения равны ). Это позволяет утверждать, что решение является паретовским по функциям, являющимся относительными отклонениями при данных весах.

134

5.3. Функция fminimax

Второй метод решения многокритериальной задачи заключается в минимизации наибольшего значения из всех целевых функций. Он реализован в функции fminimax и предназначен для решения задач вида

max fi (x) min,

i

x

A·x b, Aeq·x = beq,

C(x) ≤ 0, ceq(x) = 0, lb x ub.

Критерий в представленной форме не является гладким, что вызывает большие трудности. Поэтому в алгоритме исходная задача сначала преобразуется в обычную общую задачу нелинейного программирования добавлением неравенств fi(x) < γ и переходом к минимизации γ. В результате получается частный случай задачи достижения цели, когда все целевые значения равны 0 и все веса равны 1. Далее новая задача решается алгоритмом последовательного квадратичного программирования (SQP) с теми же модификациями, что и в функции fgoalattain.

Для установки значений параметров, отличных от принятых по умолчанию, применяется та же функция optimset. Список параметров функций fminimax и fgoalattain отличается только одним параметром (см. прил. 7). Вместо параметра GoalsExactAchieve в fminimax добавлен параметр MinAbsMax. Его значение, которое не может быть больше числа целевых функций, показывает число целевых функций, по которым при минимизации берутся их абсолютные значения. Такие функции в m-файле должны находиться перед остальными. Как и в предыдущем методе, при наличии нелинейных ограничений использовать аналитические выражения градиентов имеет смысл только в случае их задания как для целевых функций, так и для нелинейных ограничений.

Синтаксис обращения к функции fminimax представляется в разных вариантах в зависимости от числа входных и выходных аргументов.

135

x = fminimax(fun,x0)

x = fminimax(fun,x0,A,b)

x = fminimax(fun,x,A,b,Aeq,beq)

x = fminimax(fun,x,A,b,Aeq,beq,lb,ub)

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) x = fminimax(problem)

[x,fval] = fminimax(...) [x,fval,maxfval] = fminimax(...) [x,fval,maxfval,exitflag] = fminimax(...)

[x,fval,maxfval,exitflag,output] = fminimax(...) [x,fval,maxfval,exitflag,output,lambda] = fminimax(...)

Обозначения входных аргументов и их смысл описаны в предыдущих главах. Как и раньше, целевые функции должны быть непрерывными. Все выходные аргументы и их содержание идентичны таким же в функции fgoalattain, за исключение аргумента maxfval, который содержит максимальное значение из всех целевых функций в полученном решении (значение γ).

Результатом решения может быть локальный минимум. Пример 22.

Найти решение, минимизирующее максимальное значение четырех функций

f1 (x) 2x12 x22 48x1 40x2 304,

f2 (x) x12 3x22 ,

f3 (x) x1 3x2 18, f4 (x) x1 x2 .

Сначала записываем функции в m-файл: function f=fourobj(x) f(1)=2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304; f(2)=-x(1)^2-3*x(2)^2; f(3)=x(1)+3*x(2)-18;

f(4)=-x(1)-x(2); end

Затем обращаемся к функции fminimax

>> x0=[0.2 0.1];...

[x,fval,maxfval]=fminimax(@fourobj,x0)

и получаем результаты решения:

136

Local minimum possible. Constraints satisfied.

x =

8.8458 1.0746

fval =

-5.9305 -81.7118 -5.9305 -9.9204 maxfval =

-5.9305

Очевидно, что значения целевых функций сильно отличаются по абсолютной величине: размах 81,7118 – 5,9305 = 75,7813. Если желательно уменьшить эти различия, то можно, например, потребовать, чтобы в минимизации участвовали абсолютные значения первых трех функций. Это требование выражаем через параметр MinAbsMax, присваивая ему значение 3:

>> x0 = [0.2; 0.1];

options = optimset('MinAbsMax',3);

[x,fval,maxfval] = fminimax(@fourobj,x0,[],[],[],[],[],[],[],options)

x =

4.9256 2.0796 fval =

37.2356 -37.2356 -6.8357 -7.0052

maxfval =

37.2356

Учет нового требования существенно уменьшил разброс абсолютных значений целевых функций (размах уменьшился до 30,4).

Лабораторная работа № 6 Решение многокритериальных задач

Задания:

1.Рассмотреть особенности решения многокритериальных задач. Уяснить смысл решения, множества и границы Парето.

2.Найти множество и границу Парето для двух функций без ограничений:

f1 (x) x14 10x12 x1x2 x24 x12 x22 , f2 (x) x24 x12 x22 x14 x1x2 .

137

3.Исследовать влияние на решение п. 2 значений параметра CrossoverFraction и размера популяции, а также смены кроссовера (факультативно).

4.Повторить п. 2 при условии 2/3x1 x2 3.

5.Найти решение по функциям из п. 2 при заданных целевых значениях –30 и 4. Попытаться достигнуть точно одну из этих целей. Повторить для целевых значений –25 и 10.

6.Найти решение по функциям из п. 2 с помощью fminimax. Повторить при требовании минимизации максимальных абсолютных значений.

7.Найти решение для целевых функций из примера 22 с наименьшим размахом абсолютных значений всех функций.

138

6. ЛИНЕЙНОЕ ПРОГРАММИРОВАНИЕ. ФУНКЦИЯ LINPROG

Если целевая функция и все функции ограничений задачи линейные относительно x, а переменные x непрерывны, имеем задачу линейного программирования. Функция linprog предназначена для решения линейных задач общего вида:

f Tx min,

A x b, Aeq x = beq, lb x ub,

где f – вектор коэффициентов целевой функции (линейной формы) размерности n. Для решения таких задач в функции linprog имеется три алгоритма: один для задач большой размерности (Large Scale) и два для средних задач (Medium Scale).

Алгоритм Large Scale реализует прямо-двойственный метод внутренней точки. Важно подчеркнуть, что он ориентирован на задачи с разреженными матрицами A и Aeq. На предварительных шагах алгоритм выполняет преобразование исходной задачи:

все переменные ограничиваются снизу нулем;

все условия приводятся к равенствам;

фиксированные переменные, равные своим границам, удаляются;

строки и столбцы матрицы ограничений из нулей удаляются;

матрица ограничений приобретает полный структурный ранг;

при значительном числе единичных строк матрицы условий соответствующие переменные вычисляются и строки удаляются.

Модель преобразованной задачи, являющейся далее прямой задачей, имеет вид

f Tx min, A x = b, 0 x u.

После введения в прямые ограничения переменных s, называемых дополнительными или слабыми (slack), получаем

f Tx min, A x = b, x + s = u, x 0, s 0.

Этой задаче соответствует двойственная задача

bTy – uTw max, AT y w + z = f, z 0, w 0,

где y и w – двойственные переменные, а z – слабая переменная двойственной задачи.

139

Условия оптимальности обеих задач представляют собой систему равенств

A x b

 

 

 

 

s u

 

 

 

x

 

 

 

F(x, y, z, s, w) AT y w z f

0,

x 0, z 0, s 0, w 0,

 

 

 

 

 

xi zi

 

 

 

s

w

 

 

 

i

i

 

 

 

в которой первые три линейных равенства являются условиями допустимости, а последние два квадратичных равенства – условиями дополняющей нежесткости. Сумму xTz + sTw называют интервалом (зазором) двойственности (duality gap), она характеризует невязку условий дополняющей нежесткости.

Алгоритм решает одновременно прямую и двойственную задачи, применяя к линейно-квадратичной системе F(x, y, z, s, w) = F(v) = 0 ньютоноподобный метод при сохранении положительности x, z, s, и w (отсюда название «метод внутренней точки»). Сначала алгоритм вычисляет направление предсказания

vp = –(FT(v))–1F(v),

которое является направлением Ньютона, затем корректирующее направление

vc = (FT(v))–1F(v + vp) – eˆ,

где > 0 – центрирующий параметр (подбирается); eˆ – вектор из нулей и двух единиц, соответствующих двум квадратичным уравнениям в F. Новое значение v вычисляется по формуле

v+ = v + a( vp + vc),

где a > 0 – параметр длины шага, выбираемый так, чтобы [x+; z+; s+; w+] > 0. При определении направлений используется факторизация матрицы A (декомпозиция в произведение более удобных матриц). В зависимости от свойств матрицы выполняется факторизация по Чолеску (Cholesky), Шермону – Моррисону или LDL. Шаги повторяются до установления сходимости итераций. Условием останова алгоритма является выполнение неравенства

 

r

 

 

 

 

 

 

 

 

 

rf

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

f T x bT y uT w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

u

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tol,

max

1,

 

 

b

 

 

max

1,

 

f

 

 

max

 

 

 

1,

 

 

 

 

u

 

 

max

1,

 

f T x

 

,

 

bT y uT w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

140