模拟退火粒子群优化算法控制程序
%%%%%基于模擬退火粒子群優化函數——輪盤賭策略迭代
%%%%慣性權重二次縮減
clc
clear
%%%%
%導入訓練數據和測試數據
train_input=xlsread('Sample Data2',['AA2:AG111']);
train_out=xlsread('Sample Data2',['Z2:Z111']);
test_input=xlsread('Sample Data2',['AA112:AH141']);
test_out=xlsread('Sample Data2',['Z112:Z141']);
%%歸一化
[train_data ,pstrain0] = mapminmax(train_input',0,1);
[test_data] = mapminmax('apply',test_input',pstrain0);
[train_result,pstrain1] = mapminmax(train_out',0,1);
[test_result] = mapminmax('apply',test_out',pstrain1);
%%取轉置
train_data = train_data';
train_result=train_result';
test_data = test_data';
%%參數初始化
N=80;?? %%%種群規模
c1=1.5;
c2=2.0;
c1f=0.5;c1i=2.5; %c1f、c1i表示對應的最終和初始值
c2f=2.5;c2i=0.5;?????? %%%%認知因子
wmax=1.2;
wmin=0.8; %%%%慣性權重的取值范圍
xmax=[1000 100];
xmin=[0.1 0.01];%%%%%%位置范圍
M=400;????????? %%%%%迭代次數
%MaxC=10;??????? %%%%%混沌搜索步數
D=2;??????????????? %%%%%問題維數
vmax=[500 50];
vmin=[-500 -50];??????? %%%%速度范圍
lamda=0.8;? %%%%退火常數
eps=10^(-8); %機器的浮點運算誤差限,當某個數小于它時則記為0
%%定義LSSVM相關參數
type='function estimation'; %回歸
%type=’c’,表示classification 分類,type=’f’,表示回歸。
kernel='RBF_kernel'; %LSSVM的核函數選取為徑向基內核
proprecess='proprecess';
%proprecess表明數據已歸一化處理,original表明數據沒有進行歸一化處理
format long;
%%
%------初始化種群的個體------------
for i=1:N
??? for j=1:D
??????? x(i,j)=(xmax(1,j)-xmin(1,j))*rand(1,1)+xmin(1,j);? %隨機初始化位置
??????? v(i,j)=vmax(1,j)*rands(1,1);? %隨機初始化速度
??? end
end
%------先計算各個粒子的適應度,并初始化個體適應度P(i)和群體最優適應度Pg----------------------
for i=1:N
?%%%%%計算各個粒子的適應度p(i)
?gam=x(i,1);sig2=x(i,2);
?model=initlssvm(train_data,train_result,type,gam,sig2,kernel,proprecess);
?model=trainlssvm(model);
?%求出訓練集和測試集的預測值
?[train_predict_y,zt,model]=simlssvm(model,train_data);
?[test_predict_y,zt,model]=simlssvm(model,test_data);
?%訓練集和測試集的預測數據反歸一化
?train_predict=mapminmax('reverse',train_predict_y',pstrain1);%訓練集預測值
?test_predict=mapminmax('reverse',test_predict_y',pstrain1); %測試集預測值
?%%%%預測數據四舍五入保留一位有效數字
?train_predict=roundn(train_predict,-1);
?test_predict=roundn(test_predict,-1);
?%計算均方差
?result=[train_out;test_out];
?predict=[train_predict';test_predict'];
?allmse=(sum(((result-predict)./result).^2))/length(result);
?fitness(i)=allmse; %以所有數據的預測值計算的均方差為適應度值
??? p(i)=fitness(i);
???? y(i,:)=x(i,:);
end
pg = x(N,:);???????????? %Pg為全局最優
for i=1:(N-1)
?%%%%%計算群體粒子的最優適應度pg
?gam=pg(1);sig2=pg(2);
?model=initlssvm(train_data,train_result,type,gam,sig2,kernel,proprecess);
?model=trainlssvm(model);
?%求出訓練集和測試集的預測值
?[train_predict_y,zt,model]=simlssvm(model,train_data);
?[test_predict_y,zt,model]=simlssvm(model,test_data);
?%訓練集和測試集的預測數據反歸一化
?train_predict=mapminmax('reverse',train_predict_y',pstrain1);%訓練集預測值
?test_predict=mapminmax('reverse',test_predict_y',pstrain1); %測試集預測值
?%%%%預測數據四舍五入保留一位有效數字
?train_predict=roundn(train_predict,-1);
?test_predict=roundn(test_predict,-1);
?%計算均方差
?result=[train_out;test_out];
?predict=[train_predict';test_predict'];
?allmse=(sum(((result-predict)./result).^2))/length(result);
?global_fitness=allmse; %以所有數據的預測值計算的均方差為適應度值
??? if p(i)
??????? pg=x(i,:);
??? end
end
%%
%------進入主要循環,按照公式依次迭代------------
T=global_fitness/log(5); %%%設置初始溫度
for t=1:M
?groupFit=global_fitness %%%%群體最優
%%%根據輪盤賭策略公式確定當前溫度下各粒子的適配值
?for i=1:N
? Tfit(i) = exp( - (p(i) - groupFit)/T);
?end
?SumTfit = sum(Tfit);
? ?
??? Tfit = Tfit/SumTfit;
? ?
??? pBet = rand();
?
?for i=1:N
? ComFit(i)=sum(Tfit(1:i));
? if pBet<=ComFit(i)
?? pg_plus=x(i,:);
?? break;
? end
?end
???? c1f=c1i+(c1f-c1i)*t/M;%%c1f遞減
??? c2f=c2i+(c2f-c2i)*t/M; %%c2f遞增
?C=c1+c2;
?ksi=2/abs(2-C-sqrt(C^2-4*C));
%%%%%%%更新粒子的速度與位置
?for i=1:N
? v(i,:)=ksi*(v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg_plus-x(i,:)));
? x(i,:)=x(i,:)+v(i,:);
?
? %%%限制粒子的速度與位置的大小在取值范圍之內
? for j=1:D
?? if v(i,j)>vmax(1,j)
???????????????????? v(i,j)=vmax(1,j);
???????????????? end
???????????????? if v(i,j)
????????????????????? v(i,j)=vmin(1,j);
???????????????? end
???????????????? if x(i,j)>xmax(1,j)
???????????????????? x(i,j)=xmax(1,j);
???????????????? end
???????????????? if x(i,j)
???????????????????? x(i,j)=xmin(1,j);
???????????????? end
???????????? end
?%%%%%%%計算更新后粒子的適應度
? gam=x(i,1);sig2=x(i,2);
? model=initlssvm(train_data,train_result,type,gam,sig2,kernel,proprecess);
? model=trainlssvm(model);
? %求出訓練集和測試集的預測值
? [train_predict_y,zt,model]=simlssvm(model,train_data);
? [test_predict_y,zt,model]=simlssvm(model,test_data);
? %訓練集和測試集的預測數據反歸一化
? train_predict=mapminmax('reverse',train_predict_y',pstrain1);%訓練集預測值
? test_predict=mapminmax('reverse',test_predict_y',pstrain1); %測試集預測值
? %%%%預測數據四舍五入保留一位有效數字
? train_predict=roundn(train_predict,-1);
? test_predict=roundn(test_predict,-1);
? %計算均方差
? result=[train_out;test_out];
? predict=[train_predict';test_predict'];
? allmse=(sum(((result-predict)./result).^2))/length(result);
? fitness(i)=allmse; %以所有數據的預測值計算的均方差為適應度值
? local_fit(i)=fitness(i);
? if local_fit(i)
?? p(i)=local_fit(i);
?? y(i,:)=x(i,:);
? end
? if p(i)?? pg=y(i,:);
? end
?
?end
?T=T*lamda;%%%%%%降溫
?yy(t)=groupFit;
?
end
xm=pg'
fv=groupFit
hold on
plot(yy,'g')
hold off
%title(['適應度曲線? ' '終止代數=' num2str(M)]);
%xlabel('進化代數');ylabel('適應度');
?
?
總結
以上是生活随笔為你收集整理的模拟退火粒子群优化算法控制程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-OpenCV之图片缩放(c
- 下一篇: matlab多维数组