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

Кочура_lab1 / gershkovich-yu-b-shirokov-k-a-primenenie-paketa-matlab-dlya-resheniya-

.pdf
Скачиваний:
288
Добавлен:
12.04.2015
Размер:
519 Кб
Скачать
☆

Табл.1.

Метод

Отклоне

Число

 

ние

итераций

Покоординатный спуск

0.0030555

20

«По всем координатам сразу» с постоянным шагом

0.0035189

22

«По всем координатам сразу» с дроблением шага

0.0040109

14

Метод наискорейшего спуска

0.0013446

12

2. Градиентные методы в задачах с ограничениями

Градиентные методы в задачах с ограничениями являются основным математическим аппаратом в блочных алгоритмах, использующих особенности класса задач, к которому принадлежит решаемая задача. Здесь рассматриваются два случая. Первый относится к задачам с нелинейной вогнутой целевой функцией и линейными ограничениями. К такому классу относятся, например, задачи квадратичного программирования. Второй класс задач – общие задачи вогнутого программирования. Общепринятым правилом останова является выполнение условия «возрастание целевой функции на двух смежных итерациях не превосходит заданного значения δ », δ характеризует точность решения.

Задачи первого класса решаются методом линеаризации целевой функции, задачи второго класса – методом штрафных функций.

2.1. Метод линеаризации целевой функции (Франка – Вульфа)

Дана задача вогнутого программирования:

f (x1 ,...xn ) → max,(6)

∑n

aij x j ≤bi ,i =1,...m,(7)

j=1

 

x j

≥ 0, j =1,...n,(8)

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

′

′

,... n,0 )

(9)

0 =( f1 (x0 ),... fn (x0 )) =( 1,0

и строят вспомогательную линейную целевую функцию

11

~

= 1,0 x1 +... + n,0 xn →max .

(10)

f

Далее решают вспомогательную задачу линейного программирования симплекс-методом. Точка решения линейной задачиz =(z j ), j =1,...n является входом нелинейного блока, в котором вычисляется значение «выходной» точки текущей 1-ой итерации по правилу

x j ,1 = x j ,0 +γ0 (z j ,0 − x j ,0 ), j =1,...n .

(11)

Величина шага γ 0 вычисляется так же, как в методе наискорейшего спуска:

f(x1,1 ,...xn,1 ) =ϕ(γ0 ) →max

γ0

dϕ

=0;

(12)

 

dγ0

 

0 ≤γ0 ≤1

 

Далее проверяют правило останова для точки х1. Если оно не выполняется, переходим к 2-ой итерации. Она начинается с вычисления вектора-градиента в точке х1 в линейном блоке, входом на который и является точка х1.

Итак, алгоритм решения задачи (6)-(8) методом Франка-Вульфа включает следующие этапы [3]:

1.Определяют исходную точку х0. 2.Находят вектор-градиент в точке х0.

3.Строят функцию (10) и решают задачу линейного программирования (10)-(7)-(8) симплекс-методом; точка z0 – решение этой задачи.

4.По формулам (12) определяют шаг поиска новой точки х1.

5.По формулам (11) находят новую точку х1.

6.Проверка правила останова:

f (xk +1 ) − f (xk ) ≤δ , к = 0,1,….- номер итерации.

Если оно не выполняется, переход к пункту 2.

12

Пример реализации метода в среде MATLAB:

%Коэффициенты c1 = 2;

c2 = 4;

c3 = -1;

c4 = -2;

%Целевая функция

f = @(x1, x2)(c1*x1 + c2*x2 + c3*x1^2 + c4*x2^2);

% Ограничения в форме Ax <= b A = [-1 2

2 1]; b = [3; 4];

lb = zeros(2, 1); % Ограничение неотрицательности

d = 0.00001;

% Начальная точка x1 = 0;

x2 = 0;

k = 1; % Счетчик шагов

kmax = 100; % Предельное число шагов,

%задается для предотвращения зацикливания

%Массивы для хранения промежуточных координат

x1trace = [x1]; x2trace = [x2]; i = 2;

while k < kmax;

%Вычисление градиентов gr1 = c1 + 2*c3*x1;

gr2 = c2 + 2*c4*x2;

%Поиск максимума функции gr1*x1 + gr2*x2.

%Подробнее см. справку по функции linprog. Z = linprog([-gr1; -gr2], A, b, [], [], lb);

%Вычисляем коэффициент шага

g = -((c1 + 2*c3*x1)*(Z(1) - x1) + ...

(c2 + 2*c4*x2)*(Z(2) - x2))/ ...

(2*c3*(Z(1) - x1)^2 + 2*c4*(Z(2) - x2)^2);

%Вычисление новых координат new_x1 = x1 + g*(Z(1) - x1); new_x2 = x2 + g*(Z(2) - x2); new_f = f(new_x1, new_x2); old_f = f(x1, x2);

%Сохранение координат x1trace(i) = new_x1; x2trace(i) = new_x2;

i = i + 1; x1 = new_x1; x2 = new_x2;

13

% Проверка условия останова

if (new_f - old_f) / old_f <= d;

break; % Выход из цикла в случае выполнения условия

end

k = k + 1;

end

%Построение графика x = 0:0.1:2;

y = 0:0.1:2;

[X, Y] = meshgrid(x, y);

%Отображение допустимого множества

plot([0 1], [1.5 2], 'r-', 'LineWidth', 3); hold on;

plot([1 2], [2 0], 'r-', 'LineWidth', 3); % Отображение линий уровня

Z =

c1*X

+ c2*Y + c3*X.^2 + c4*Y.^2;

[C,

h] =

contour(X, Y, Z);

clabel(C, h);

% Отображение меток на линиях уровня

%Отображение "траектории" алгоритма plot(x1trace, x2trace, '-');

%Вывод начальной точки на график text(x1trace(1) - 0.1, x2trace(1) - 0.1, 'M0');

%Вывод решения на график

text(x1 + 0.1, x2 + 0.1, ...

strvcat(['x1 = ' num2str(x1)], ...

['x2 = ' num2str(x2)], ...

['k = ' num2str(k)]));

На Рис.7 изображено движение из начальной точки (0,0) в точку абсолютного максимума, которая лежит внутри допустимого множества.

На Рис. 8 изображено движение из начальной точки к точке условного максимума (1,254;1,4693) на границе допустимого множества. Очевидно, что во втором случае потребовалось больше итераций.

14

Рис. 7.

Рис.8.

15

2.2. Метод штрафных функций.

Метод штрафных функций применяется для решения общей задачи вогнутого программирования (13)-(15):

f (x1 ,...xn ) →max(13)

gi (x1 ,...xn ) ≤bi ,i =1,...m,(14) x j ≥0, j =1,...n.(15)

Система выпуклых ограничений (14) представляется в виде

ϕi (x) =bi − gi (x) . (16)

Если ϕi (x) ≥0, то точка х принадлежит допустимому множеству, в

противном случае – нет. За это целевая функция должна быть «наказана» штрафом – уменьшена так, чтобы не выполнилось правило останова, и счет должен быть продолжен до тех пор, пока точка х не «вползет» в допустимое множество, и целевая функция начнет снова увеличиваться. В соответствии с этой идеей составляется вспомогательная целевая функция – аналог функции Лагранжа:

m

 

L(x) = f (x) + ∑αiϕi (x)

(17).

i=1

Здесь αi - коэффициент штрафа, приписываемый каждому ограничению. Методы штрафных функций отличаются друг от друга способом выбора коэффициента штрафа. Общим является следующее свойство:

αi =0, если х Х, т.е. ϕi (x) ≥0, и целевая функция (17) совпадает с исходной целевой функцией (13);

αi >0, если ϕi (x) <0 . В этом случае целевая функция (17) уменьшается.

Переход от точки к точке осуществляется по основной формуле градиентных методов для задач без ограничений:

16

x j ,k +1 = x j ,k +γk [∂f (xk

) + ∑αi

∂ϕi (xk )] .

(18)

 

 

 

m

 

 

 

 

∂x j ,k

 

i=1

∂x j ,k

 

 

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

эти значения постепенно увеличивают.

Выбор αi можно упорядочить в соответствии с методом Эрроу-

Гурвица [3]. На каждой итерации коэффициенты штрафа вычисляются по формуле:

αi ,k = max{0;αi ,k −1 −γkϕi ,k (xk )} .

(19)

Процесс нахождения решения методом штрафных функций описывается следующим алгоритмом:

1.Определяют начальную точку, принадлежащую допустимому множеству.

2.Выбирают величину шага γ градиентного метода.

3.Переход от точки к точке осуществляют по формуле (18).

4.Проверяют, удовлетворяют ли координаты новой точки системе ограничений. Если новая точка принадлежит допустимому множеству, проверяют правило останова, и если оно не выполняется, возвращаются к пункту 3. Если правило останова выполнено, полученная точка и есть решение задачи.

5.Если точка, найденная в пункте 3, не принадлежит допустимому множеству, то выбирают коэффициент штрафа для того ограничения, которое нарушено. При этом коэффициент штрафа

17

либо назначают заранее, либо рассчитывают по формуле (19) как в методе Эрроу-Гурвица [1]. После этого возвращаются к пункту 3.

Решение сложных задач нелинейного программирования градиентными методами связано с большим объемом вычислений и целесообразно только с использованием современных компьютерных технологий.

Пример реализации метода в среде MATLAB:

% Значения коэффициентов c1 = -1;

c2 = -1; a = 7; b = 7; R = 18;

d = 0.001; % дельта

% Начальная точка x1 = 6;

x2 = 7;

k = 1; % Счетчик шагов

kmax = 100; % Предельное число шагов,

%задается для предотвращения зацикливания

%Массивы для хранения промежуточных координат

x1trace = [x1]; x2trace = [x2]; i = 2;

% Штрафная функция

g = @(x1, x2)(R - (x1 - a)^2 - (x2 - b)^2); % Производные

dfdx1 = @(x1, x2)(2*c1*x1); dfdx2 = @(x1, x2)(2*c2*x2); dgdx1 = @(x1, x2)(-2*x1 + 2*a); dgdx2 = @(x1, x2)(-2*x2 + 2*b); % Коэффициенты

gamma = 0.1; alpha = 1.9; while k < kmax;

% Вычисление шага по каждой координате if g(x1, x2) > 0;

% Текущая точка принадлежит области допустимых решений step_x1 = dfdx1(x1, x2);

step_x2 = dfdx2(x1, x2); else

18

% Текущая точка не принадлежит области допустимых

решений

step_x1 = dfdx1(x1, x2) + alpha*dgdx1(x1, x2); step_x2 = dfdx2(x1, x2) + alpha*dgdx2(x1, x2);

end

% Вычисление новых координат

new_x1 = max(0, x1 + gamma*step_x1); new_x2 = max(0, x2 + gamma*step_x2);

%Сохранение координат x1trace(i) = new_x1; x2trace(i) = new_x2;

i = i + 1; x1 = new_x1; x2 = new_x2;

%Проверка условия останова

if (dfdx1(x1, x2)/dgdx1(x1, x2)) - (dfdx2(x1, x2)/dgdx2(x1, x2)) <= d;

break; % Выход из цикла в случае выполнения условия

end;

k = k + 1;

end

%Построение графика x = 0:0.1:10;

y = 0:0.1:10;

[X, Y] = meshgrid(x, y);

%Отображение допустимого множества

Zl = (X - a).^2 + (Y - b).^2;

[C, h] = contour(X, Y, Zl, [R R], 'LineWidth', 2); hold on;

%Отображение линий уровня

Z =

c1*X.^2 + c2*Y.^2;

Z);

[C,

h] = contour(X, Y,

clabel(C, h);

% Отображение меток на линиях уровня

%Отображение "траектории" алгоритма plot(x1trace, x2trace, '-+');

%Вывод начальной точки на график text(x1trace(1) + 0.1, x2trace(1), 'M0');

%Вывод решения на график

text(x1 + 0.7, x2, ...

strvcat(['x1 = ' num2str(x1)], ...

['x2 = ' num2str(x2)], ...

['k = ' num2str(k)]));

На Рис. 9 представлено движение точки из начального положения (6;7) к решению (4;4) на границе допустимого множества. По тексту программы можно проследить, как включаются коэффициенты штрафа на итерациях, при которых точки выходят из допустимого множества.

19

Рис.9.

2.3. Метод Эрроу-Гурвица

Пример реализации метода в среде MATLAB:

% Значения коэффициентов c1 = -1;

c2 = -1; a = 7; b = 7; R = 18;

d = 0.01; % дельта

% Начальная точка x1 = 6;

x2 = 7;

k = 1; % Счетчик шагов

kmax = 100; % Предельное число шагов,

%задается для предотвращения зацикливания

%Массивы для хранения промежуточных координат

x1trace = [x1]; x2trace = [x2]; i = 2;

% Штрафная функция

g = @(x1, x2)(R - (x1 - a)^2 - (x2 - b)^2);

20

Соседние файлы в папке Кочура_lab1