matlab解決差分進化演算法解決一元函式的最優值的問題
阿新 • • 發佈:2021-02-02
技術標籤:matlab程式設計演算法matlab機器學習差分法序列最小化優化演算法
差分進化演算法是一種全域性最優演算法,在差分演化演算法當中需要注意的幾個點為變異率F、交叉率Cr、基向量的選擇r0,r1,r2的選擇等問題。在研究差分演化演算法的過程之中有許多的改進,對基向量的改進、變異概率、交叉概率的改進。這裡提供的是經典的差分演化演算法,利用經典差分演化演算法解決一元函式的最優值問題。
經典的差分演化演算法步驟:
(1)初始化:x[i][j]=xmin+(xmax-xmin)*rand(D,Np);
xmin–變數的上界;xmax–變數的下界;D–種群數;Np–個體數;
(2)變異:v[i][j]=x[r0][j]+(x[r1][j]-x[r2][j])*F
(3)交叉:u[i][j]=v[i][j]----Cr<rand()
u[i][j]=x[i][j]-----else
(4)選擇:x[i][j]=u[i][j]—f(u)<f(x);
xg[i][j]=x[i][j]—else;g指的是子代數
-----這裡是決定選最大值還是最小值
下面給出利用差分演化演算法求解一元函式最小值的案列:
% DE演算法的應用----針對一元函式
% 求解函式的最大值/最小值
% 解決問題:求解函式f(x)=x.*sin(10*x.*pi)+2
% 時間:2020.12.23
% 工具:matlab2018a
% 注意點:對於迴圈最好採用分步迴圈,最好做一個大迴圈,原因在於多次子迴圈將導致部分精度丟失
clc
clear
% 定義初始值
D=50;
Np=1;
Ft=0.5; %後期對其進行改進
Cr=0.8;
xmax=2;
xmin=-1;
K=100; %迭代次數
%種群初始化
x=xmin+(xmax-xmin)*rand(D,1);
F=Ft+0.001*(rand(D,1)-0.5); %改進後的變異因子
best=x(1,:); %選取其中一個最為最優值,為後面選取最優值做準備
tx=[xmin:0.01:xmax];
f=fun_DE(tx);
figure( 1)
plot(tx,f,'b')
hold on
f0=fun_DE(best);
plot(best,f0,'ro','linewidth',2);
%儲存最優子代
for i=2:D
if fun_DE(best)>fun_DE(x(i,:))
best=x(i,:);
end
end
fi=fun_DE(best); %把最優值傳遞給fi
% 進行變異、交叉、選擇
for n=1:K
time(n)=n; %做這一步的原因在於顯示在哪個位置進行收斂
% %變異
for i=1:D
r0=0;r1=0;r2=0;
while( r0==i||r1==i||r2==i||r0==r1||r0==r2||r1==r2)
r0=ceil(D*rand(1));
r1=ceil(D*rand(1));
r2=ceil(D*rand(1));
end
v(i,:)=x(r0,:)+F(i,:)*(x(r1,:)-x(r2,:));
for j=1:Np %檢查是否越界
if(v(i,j)<xmin(j))
v(i,j)=xmin(j);
elseif(v(i,j)>xmax(j))
v(i,j)=xmax(j);
end
end
%交叉
for j=1:Np
if rand(1)<Cr
u(i,j)=v(i,j);
else
u(i,j)=x(i,j);
end
end
%選擇
if fun_DE(u(i,:))<fun_DE(x(i,:))
x(i,:)=u(i,:);
end
if fun_DE(x(i,:))<fi
% fi=fun_DE1(x(i,:));
end
best=x(i,:);
best_f(n)=fun_DE(best);
end
end
plot(best,best_f(n),'ro','linewidth',2)
xlabel('x');ylabel('J');
title('函式最小值');
fprintf('最優解結果為%f,%f',best);
fprintf('最小函式值為%f',best_f(n)); %列印最優
figure(2)
plot(time,best_f(time),'r-');
xlabel('迭代次數');ylabel('最優值');
title('迭代後的最優結果')
輸出結果:
最優解結果為1.950519,最小函式值為0.049740>>
結果圖形展示: