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

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

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

nodes: 27 time: 1.6875

algorithm: 'LP-based branch-and-bound' branchStrategy: 'maximum integer infeasibility' nodeSrchStrategy: 'best node search'

message: 'Optimization terminated.'

Отчет показывает, что решение найдено за 25 итераций алгоритмом ветвей и границ, основанным на решении ЛП-задач. При этом просмотрено 27 узлов, использованы стратегии ветвления maxinfeas и выбора узлов bn.

151

8. КВАДРАТИЧНОЕ ПРОГРАММИРОВАНИЕ.

ФУНКЦИЯ QUADPROG

Задачи, в которых целевая функция является квадратичной, а все ограничения линейные, называют задачами квадратичного программирования (КП). Для их решения в Toolbox Optimization имеется функция quadprog.

Задача КП ставится в виде

12 xTHx+f Tx min

при условиях

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

где H – квадратная матрица (гессиан), остальные обозначения не требуют пояснений.

В зависимости от размера задачи и свойств матриц функция quadprog применяет Large Scale или Medium Scale алгоритм.

Первый алгоритм предназначен для задач большой размерности при наличии только ограничений на переменные или только ограниче- ний-равенств. При этом матрицы H и Aeq должны быть разреженными, а линейные равенства независимыми (число равенств не может быть больше числа переменных). Этот алгоритм установлен по умолчанию, но если задача не соответствует условиям его применимости, происходит автоматический переход на алгоритм Medium Scale.

Алгоритм Large Scale построен по методу подпрастранства доверительной области (subspace trust-region method), описанному в предыдущих главах. Напомним, что на каждой итерации решается подзадача минимизации на выделенном подпространстве S, в результате чего находится очередной шаг к строго допустимому решению задачи. Определение двумерного подпространства S требует решения большой положительно определенной линейной системы Hp = –g. Решение этой системы находится методом предобусловленных сопряженных градиентов (PCG). Предобусловливатель (preconditioner) для H – это симметричная положительно определенная матрица M такая, что M = C2 и C-1HC –1 – хорошо обусловленная матрица или матрица с

152

кластеризованными собственными значениями. Итерации PCG выполняются на каждой итерации основного алгоритма (по умолчанию). Второй способ решения линейной системы основан на прямой факторизации матрицы H (direct solver).

Алгоритм Medium Scale реализует метод активного набора (ac- tive-set), известного также как метод проекций. Его описание приведено в предыдущих разделах. Алгоритм состоит из двух этапов: на первом этапе находится допустимая начальная точка, на втором генерируется последовательность допустимых точек, сходящаяся к решению.

Для решения квадратичной задачи с параметрами, установленными по умолчанию, достаточно ввести данные задачи и вызвать функцию quadprog в соответствующем задаче синтаксисе:

x = quadprog(H,f,A,b)

x = quadprog(H,f,A,b,Aeq,beq)

x = quadprog(H,f,A,b,Aeq,beq,lb,ub)

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)

x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) x = quadprog(problem)

[x,fval] = quadprog(...) [x,fval,exitflag] = quadprog(...) [x,fval,exitflag,output] = quadprog(...)

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

Здесь обозначения имеют тот же смысл, что и в ранее рассмотренных функциях. Заметим только, что еcли границы противоречивы, то в качестве решения х выводится х0 (компонентам, нарушающим границу, придается допустимое значение), а в качестве fval – []. Значения индикатора exitflag указывают на причину останова алгоритма:

1 – получена сходимость к решению х; 3 – изменение значения целевой функции стало меньше допусти-

мого; 4 – найден локальный минимум;

0 – число итераций превысило допустимое MaxIter; -2 – условия противоречивы; -3 – критерий неограничен;

-4 – в текущем направлении поиска нельзя улучшить функцию; -7 – модуль направления поиска стал слишком мал.

153

Выходная структура output содержит поля: число итераций, название алгоритма, общее число итераций PCG в Large Scale (cgiterations), меру оптимальности 1-го порядка для Large Scale (firstorderopt), величину нарушения ограничений в Medium Scale

(constrviolation).

На процесс минимизации можно влиять через параметры функции quadprog. Изменение значений параметров производится, как и раньше, с помощью функции optimset. Часть парметров являются общими для обоих алгоритмов. К ним относятся Display, Diagnostics, Large Scale и MaxIter. Параметры, присущие только алгоритму Large Scale, приведены в прил. 8. Параметром MaxPCGIter можно ограничивать число итераций PCG на одну итерацию основного алгоритма. Уменьшение этого параметра приводит к увеличению числа основных итераций. Установка параметра PrecondBandWidth в Inf означает замену PCG прямой факторизацией Чолеску.

Пример 25.

Найти минимум функции

F(x) 10x1 12x2 2x12 4x22 4x1x2

при условиях

x1 + 3x2 12, x1 + x2 3,

–x1 + x2 2, x1 0, x2 0.

Для решения задачи составляем программу, в которой задаем начальную точку в допустимой области, заносим данные задачи в виде H, f, A, b и обращаемся к функции quadprog с указанием в ней нулевых нижних границ.

>> x0=[4 1];H=[4 -4;-4 8];f=[10;-12];A=[1 3;-1 -1;-1 1];b=[12;-3;2]; [x,fval,exitflag,output] = quadprog(H,f,A,b,[],[],[0 0],[],x0)

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

Warning: Large-scale algorithm does not currently solve this problem formulation, using medium-scale algorithm instead.

Optimization terminated. x =

154

0.7000

2.3000 fval =

-4.9000 exitflag = 1

output =

iterations: 2

constrviolation: -4.4409e-016 algorithm: 'medium-scale: active-set' firstorderopt: []

cgiterations: []

message: 'Optimization terminated.'

В начальном сообщении поясняется, что постановка задачи не соответствует принятой для алгоритма Large Scale и потому он заменен на алгоритм Medium Scale. Этим алгоритмом решение найдено за две итерации при практически точном соблюдении ограничений (см. constrviolation). Если не задавать начальную точку, то результат не изменится. В этом случае алгоритм сам определяет начальную допустимую точку.

Теперь возьмем начальную точку вне допустимой области:

>> x0=[0 4];H=[4 -4;-4 8];f=[10;-12];A=[1 3;-1 -1;-1 1];b=[12;-3;2]; [x,fval,exitflag,output] = quadprog(H,f,A,b,[],[],[0 0],[],x0)

Optimization terminated. x =

0.7000

2.3000 fval =

-4.9000 exitflag =

1

output =

iterations: 3

constrviolation: -4.4409e-016 algorithm: 'medium-scale: active-set' firstorderopt: []

cgiterations: []

message: 'Optimization terminated.'

155

Как видно, получено такое же решение, но за три итерации. Очевидно, первая (дополнительная) итерация потребовалась для вхождения в допустимую область.

Обе начальные точки и точка найденного минимума (обозначена *) показаны на рис. 40 на фоне линий уровня. Как и следовало ожидать, оптимум лежит на границе.

Рис. 40. Решение квадратичной задачи из примера 25

Чтобы увидеть работу алгоритма Large Scale, изменим условия рассмотренной задачи, удалив линейные неравенства и добавив верхние ограничения на переменные:

>> x0=[4 1];H=[4 -4;-4 8];f=[10;-12];

[x,fval,exitflag,output] = quadprog(H,f,[],[],[],[],[0 0],[5 5],x0)

x =

0.0000

1.5000 fval =

-9.0000 exitflag =

3

output =

iterations: 8 constrviolation: 0

156

algorithm: 'large-scale: reflective trust-region' firstorderopt: 1.5419e-013

cgiterations: 7 message: [1x87 char]

Решение снова получено на границе допустимой области. На поиск минимума затрачено восемь основных итераций и семь итераций PCG. Алгоритм reflective trust-region оказался очень трудоемким. Действительно, если в этом же примере выключить Large Scale, то получим

>> options= optimset('LargeScale','off');x0=[4 1];H=[4 -4;-4 8];f=[10;-12]; [x,fval,exitflag,output] = quadprog(H,f,[],[],[],[],[0 0],[5 5],x0,options)

x =

0

1.5000 fval =

-9 exitflag =

1

output =

iterations: 2 constrviolation: 0

algorithm: 'medium-scale: active-set' firstorderopt: []

cgiterations: []

message: 'Optimization terminated.'

Как видим, здесь такое же решение получено за две итерации. Поэтому рекомендуется начинать решение и больших задач с использования алгоритмов Medium Scale.

Лабораторная работа № 7 Решение задач математического программирования

Задания:

1. Ознакомиться с функциями linprog, bintprog и quadprog и методами, используемыми в них. Уяснить назначение основных параметров функций.

157

2. Двумя методами Medium Scale решить задачу линейного программирования

f(x) = 1050x11 + 1740x12 + 1395x13 + 644x14 + 840x21 + 1320x22 + + 1260x23 + 529x24 + 770x31 + 1440x32 + 900x33 + 414x34 + 840x41 + + 1380x42 + 945x43 + 621x44 min,

x11 + x21 + x31 + x41 = 2, x12 + x22 + x32 + x42 = 1, x13 + x23 + x33 + x43 = 2, x14 + x24 + x34 + x44 = 1,

35x11 + 60x12 + 45x13 + 23x14 62, 35x21 + 60x22 + 45x23 + 23x24 90, 35x31 + 60x32 + 45x33 + 23x34 50, 35x41 + 60x42 + 45x43 + 23x44 120,

xij 0.

Повторить решение из разных начальных точек. Сравнить результаты решения.

3.Задачу из предыдущего пункта решить при условии бинарности всех переменных. Сравнить показатели решений при различных стратегиях ветвления и перехода. Повторить решение для нахождения максимума целевой функции.

4.Алгоритмами Large Scale и Medium Scale решить задачу квадратичного программирования

F(x) 3x

5x

10x

8x2

2x2

5x2 x x

6x x

2x

x min,

1

2

3

1

2

3

1

2

1

3

2

3

 

–0,5 x1 5,

0 x2 5,

–1 x3 5.

 

Выяснить, какую информацию дают значения lambda.

5. Решить задачу квадратичного программирования из предыду-

щего пункта, добавив линейные неравенства

 

 

 

 

 

 

 

 

2x1 + 3x2

+ x3 15,

 

 

 

 

 

 

 

 

x1 + x2 + x3 –0,2.

 

 

 

 

 

Объяснить значения lambda.

 

 

 

 

 

 

 

 

158

9. ДРУГИЕ ФУНКЦИИ ПАКЕТА TOOLBOX OPTIMIZATION

Помимо функций, предназначенных для решения общих задач безусловной оптимизации и математического программирования, пакет Toolbox Optimization включает функции для решения ряда специальных задач, которые ставятся как оптимизационные. В частности, это задачи решения уравнений и задачи на методы наименьших квадратов и аппроксимации (подбора кривых). Соответствующие функции будут рассмотрены без описания алгоритмов и несущественных деталей.

9.1. Нахождение корней функции одной переменной

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

Синтаксис вызова функции fzero:

x = fzero(fun,x0)

x = fzero(fun,x0,options) x = fzero(problem) [x,fval] = fzero(...)

[x,fval,exitflag] = fzero(...) [x,fval,exitflag,output] = fzero(...)

Как и в предыдущих разделах, аргумент fun задает функцию в виде имени m-файла или анонимно. x0 – точка, вблизи которой предполагается корень, или вектор с двумя элементами, задающими интервал. Последний всегда должен быть конечным. За корень х принимается значение вблизи точки, где функция меняет знак. Только при exitflag=1 найденная точка является корнем функции. Структура output помимо общего числа итераций, числа вычислений функции и алгоритма содержит число итераций для нахождения интервала, со-

держащего корень (intervaliterations).

Функция fzero имеет параметры, позволяющие подключать функции вывода и графики (OutputFcn, PlotFcns), изменять уровень выводимой информации (Display) и допустимое значение по х

159

(TolX). Кроме того, при включении параметра FunValCheck ('on') будет выдаваться ошибка, когда значение целевой функции окажется комплексным, Inf или NaN.

Пример 26.

1. Найти корень функции

f(x) = x2 + x – 1.

Решение при задании точки

>>[x,fval]=fzero('x.^2+x-1',0.6)

x=

0.6180 / это отношение золотого сечения

fval =

-1.1102e-016

Решение при задании интервала

>> [x,fval]=fzero('x.^2+x-1',[0 1]) x =

0.6180 fval =

0

2. Найти корень функции

f(x) = 2x3 – 7 x – 6.

Решение

>> [x,fval]=fzero('2*x.^3-7*x-6',[1 5]) x =

2.2047 fval =

-1.7764e-015

9.2. Решение системы нелинейных уравнений

Задача определяется выражением

F(x) = 0,

где x – вектор переменных; F(x) – векторная нелинейная функция. Таким образом, речь идет о нахождении корня системы нелиней-

ных уравнений. Для решения такой задачи предназначена функция fsolve. В ней реализованы три алгоритма: Trust-region dogleg,

Trust-region-reflective и Levenberg-Marquardt. Все они спо-

собны решать задачи большой размерности (Large Scale). Trustregion dogleg установлен по умолчанию, но он может использо-

160