黄金分割に基づく修正Powellアルゴリズム
3988 ワード
1.目標関数
2.改訂されたPowellアルゴリズム
3.一次元検索ポリシー(金分割、数値解法)
4.運転コード及び結果
<span style="font-size:14px;">function y= TextF(x)
%
% x[x1,x2];
% y
y = x(1)*x(1)+2*x(2)*x(2)-4*x(1)-2*x(1)*x(2);
end</span>
2.改訂されたPowellアルゴリズム
f<span style="font-size:14px;">unction [Matrix,Value] = Powell
%--------------------------------Step1-------------------------------------
% k=1; :Err; ; ;
Err = 0.01;
X0 = [1,1];
Dir = [1,0;
0,1];
num = 2;
while(1)
%----------------------------------Step2-----------------------------------
% :
%
[X(1,:),JZ(1)] = OneDimensionSearch(X0,Dir(1,:),Err);
% 2 num
for k = 2:num
dir(k,:) = Dir(k,:);
[X(k,:),JZ(k)] = OneDimensionSearch(X(k-1,:),dir(k,:),Err);
end
% X0 , ,
dir(num+1,:) = X(num,:)-X0;
[X(num+1,:),JZ(num+1)] = OneDimensionSearch(X0,dir(num+1,:),Err);
%----------------------------------Step3-----------------------------------
%
delta = X(num+1,:)-X0;
if( sqrt(sum(delta.*delta))<=Err )
Matrix = X(num+1,:);
Value = TextF(Matrix); %
break;
else
%----------------------------------Step4-----------------------------------
MuInfoVal_0 = TextF(X0);
%
Diff(1) = MuInfoVal_0-JZ(1);%
for k = 2:num
Diff(k) = JZ(k-1)-JZ(k);
end
%
[maxDiff,m] = max(Diff);
%----------------------------------Step5-----------------------------------
%
Xmap = 2*X(num,:)-X0;
% Powell
Val_0 = TextF(X0);
Val_1 = TextF(X(num,:));
Val_2 = TextF(Xmap);
% Powell
if(Val_2>Val_0 && ...
(Val_0-2*Val_1+Val_2)*(Val_0-Val_1-maxDiff)<0.5*maxDiff(Val_0-Val_2)^2 )
%----------------------------------Step6-----------------------------------
% , %
X0 = X(num+1,:);
% m
Dir(m,:) = dir(num+1,:);
%----------------------------------Step7-----------------------------------
else % , ,% ,
if(Val_1 < Val_2)
X0 = X(num,:);
else
X0 = X(num+1,:);
end
end
end
end
end</span>
3.一次元検索ポリシー(金分割、数値解法)
<span style="font-size:14px;">%% : %%
function [ExtremePos,ExtremeVal] = OneDimensionSearch(x1,Dir,err)
% X0 ,
% Dir: 。
% err: 。
% ExtremeVal, ExtremePos
%------------------------Step1: ------------------------------
% x1, , x2
y1 = TextF(x1);
x2 = x1+Dir;
y2 = TextF(x2);
%
if y1 < y2 %
Dir = -Dir;
temp = x1;
x1 = x2;
x2 = temp;
x3 = x2+Dir;
y3 = TextF(x3);
else %
Dir = 2*Dir;
x3 = x2+Dir;
y3 = TextF(x3);
end
while(1)
if (y2<=y3) %
a = min(x1,x3);
b = max(x1,x3);
break;
else
x1 = x2;
x2 = x3;
y2 = y3;
x3 = x2+Dir;
y3 = TextF(x3);
end
end
%--------------------------Step2: ----------------------------------
g1 = 0.382; g2 = 0.618;
xx1 = a+g1*(b-a);
yy1 = TextF(xx1);
xx2 = a+g2*(b-a);
yy2 = TextF(xx2);
delta = sqrt(sum(abs(b-a).*abs(b-a)));
while( delta>=err)
if(yy1 < yy2)
b = xx2;
xx2 = xx1;
yy2 = yy1;
xx1 = a+g1*(b-a);
yy1 = TextF(xx1);
else
a = xx1;
xx1 = xx2;
yy1 = yy2;
xx2 = a+g2*(b-a);
yy2 = TextF(xx2);
end
delta = sqrt(sum(abs(b-a).*abs(b-a)));
end
ExtremePos = 0.5*(a+b);
ExtremeVal = TextF(ExtremePos);
end</span>
4.運転コード及び結果
<span style="font-size:14px;">[m,n]=Powell
m =
3.9969 1.9985
n =
-8.0000</span>