本人畢業(yè)設(shè)計(jì)是
基于遺傳算法優(yōu)化的城市公交系統(tǒng)車站客流量預(yù)測(cè)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426329.html
在學(xué)習(xí)過(guò)程中
不斷積累經(jīng)驗(yàn)并優(yōu)化改進(jìn)模型
學(xué)習(xí)完后
認(rèn)為遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型
可以在大多專業(yè)領(lǐng)域應(yīng)用實(shí)現(xiàn)預(yù)測(cè)效果
通俗地總結(jié)分享一下
自己最滿意的流程和方法供小白參考
有誤請(qǐng)指正和討論
(以下特征數(shù)據(jù)只是測(cè)試GABP算法的效果,結(jié)果是預(yù)測(cè)我國(guó)所有城市公交客流量總和而分析搜集的特征數(shù)據(jù),非本人論文預(yù)測(cè)項(xiàng)目,若要預(yù)測(cè)某個(gè)數(shù)據(jù),只要分析出影響該數(shù)據(jù)的特征并搜集其對(duì)應(yīng)特征的數(shù)據(jù),再多次調(diào)試參數(shù),即可實(shí)踐應(yīng)用實(shí)現(xiàn)出理想的預(yù)測(cè)效果)
目錄
導(dǎo)入特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)
使用mapminmax函數(shù)對(duì)數(shù)據(jù)歸一化處理
提取數(shù)據(jù)特征數(shù)量
設(shè)置遺傳算法參數(shù)
設(shè)置兩層隱藏層的神經(jīng)元個(gè)數(shù)
計(jì)算整個(gè)網(wǎng)絡(luò)層的節(jié)點(diǎn)數(shù)之和
?設(shè)置種群長(zhǎng)度和初始參數(shù)范圍
流程框架
流程代碼
建模方法特點(diǎn)
適應(yīng)度計(jì)算函數(shù)
選擇操作函數(shù)
交叉操作函數(shù)
變異操作函數(shù)
神經(jīng)網(wǎng)絡(luò)算法模塊的設(shè)置
使用mapminmax函數(shù)對(duì)得到的最優(yōu)數(shù)據(jù)反歸一化
繪制實(shí)驗(yàn)誤差曲線圖
實(shí)際值與預(yù)測(cè)值曲線圖
設(shè)置實(shí)驗(yàn)結(jié)果提示窗口
運(yùn)行結(jié)果圖
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-426329.html
導(dǎo)入特征數(shù)據(jù)和目標(biāo)數(shù)據(jù)
自行分析整理出
影響目標(biāo)數(shù)據(jù)的因素作為特征數(shù)據(jù)
每一個(gè)因素為一個(gè)特征種類
每一個(gè)特征需要多個(gè)樣本數(shù)據(jù)來(lái)反映
☆☆☆☆☆
根據(jù)分析
有5個(gè)特征會(huì)影響到城市公交車站客流量
分別為:
機(jī)動(dòng)車數(shù)量、公共汽電車數(shù)量、公共汽電車線路數(shù)量、公共汽電車線路網(wǎng)里程、公共汽電車運(yùn)營(yíng)里程
于是
統(tǒng)計(jì)整理了這5個(gè)特征的相關(guān)數(shù)據(jù)
作為預(yù)測(cè)模型的特征數(shù)據(jù)(輸入數(shù)據(jù))
并且
將預(yù)測(cè)數(shù)據(jù)同類的樣本特征數(shù)據(jù)-已知的客流量
作為目標(biāo)數(shù)據(jù)(1組)
然后
為了應(yīng)用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)
準(zhǔn)備了所需預(yù)測(cè)數(shù)據(jù)的預(yù)測(cè)特征數(shù)據(jù)(1組)
來(lái)實(shí)現(xiàn)預(yù)測(cè)模型預(yù)測(cè)-未知的客流量
clear;
clc;
%導(dǎo)入數(shù)據(jù)
data1=[1.87,2.07,2.25,2.4,2.5,2.64,2.7,2.9,3.1,3.25,3.4,3.72,3.95];%2009年~2021年的機(jī)動(dòng)車數(shù)量/(億輛)
data2=[41.19,42.05,45.33,47.49,50.96,52.88,56.18,60.86,65.12,67.34,69.33,70.44,70.94];%2009年~2021年的公共汽電車數(shù)量/(萬(wàn)輛)
data3=[25460,32237,35884,38243,41738,45052,48905,52789,56786,60590,65730,70643,75770];%2009年~2021年的公共汽電車線路數(shù)/(條)
data4=[28.92,63.37,67.29,71.46,74.89,81.78,89.43,98.12,106.9,119.9,133.6,148.21,159.38];%2009年~2021年的公共汽電車線路網(wǎng)里程/(萬(wàn)公里)
data5=[186.63,317.86,331.73,346.82,348.96,346.69,352.33,358.32,355.2,346.1,354.13,302.79,335.27];%2009年~2021年的公共汽電車運(yùn)營(yíng)里程/(億公里)
data6=[742.91,670.12,715.79,749.8,771.17,781.88,765.4,745.23,722.87,697,691.76,442.36,489.16];%2009年~2021年的公共汽電車客流量/(億人次)
newdata=[4.17;67.45;79955;171.31;330];%每個(gè)值分別為2022年的:機(jī)動(dòng)車數(shù)量、公共汽電車數(shù)量、線路數(shù)、線路網(wǎng)里程、運(yùn)營(yíng)里程
P=[data1;data2;data3;data4;data5]; %特征數(shù)據(jù)
T=data6; %目標(biāo)數(shù)據(jù)
使用mapminmax函數(shù)對(duì)數(shù)據(jù)歸一化處理
具體用法及原理
學(xué)習(xí)MATLAB官方幫助文檔mapminmax
后面還要對(duì)預(yù)測(cè)特征數(shù)據(jù)歸一化處理
此時(shí),使用mapminmax的'apply'命令
調(diào)用特征數(shù)據(jù)歸一化得到的結(jié)構(gòu)體PS1
完成歸一化處理
[P_regular,PS1]=mapminmax(P,-1,1);
[T_regular,PS2]=mapminmax(T,-1,1);
提取數(shù)據(jù)特征數(shù)量
input_num=size(P,1); %輸入特征個(gè)數(shù)
output_num=size(T,1); %輸出特征個(gè)數(shù)
設(shè)置遺傳算法參數(shù)
iter_num=300; %進(jìn)化迭代次數(shù)
group_num=100; %種群規(guī)模
cross_pro=0.625; %交叉概率
mutation_pro=0.05; %變異概率,相對(duì)來(lái)說(shuō)比較小
設(shè)置兩層隱藏層的神經(jīng)元個(gè)數(shù)
hidden_num1=8; %第一層隱藏層神經(jīng)元個(gè)數(shù)
hidden_num2=6; %第二層隱藏層神經(jīng)元個(gè)數(shù)(比第一層?。?/code>
計(jì)算整個(gè)網(wǎng)絡(luò)層的節(jié)點(diǎn)數(shù)之和
總結(jié)點(diǎn)數(shù)=輸入特征數(shù)×第一層隱藏層節(jié)點(diǎn)數(shù)+第一層隱藏層節(jié)點(diǎn)數(shù)+第一層隱藏層節(jié)點(diǎn)數(shù)×第二層隱藏層節(jié)點(diǎn)數(shù)+第二層隱藏層節(jié)點(diǎn)數(shù)+...+第n層隱藏層節(jié)點(diǎn)數(shù)+第n層隱藏層節(jié)點(diǎn)數(shù)×第n+1層隱藏層節(jié)點(diǎn)數(shù)+第n+1層隱藏層節(jié)點(diǎn)數(shù)+第n+1層隱藏層節(jié)點(diǎn)數(shù)×輸出特征數(shù)+輸出特征數(shù)。
☆☆☆☆☆
以下是2層隱藏層的網(wǎng)絡(luò)層節(jié)點(diǎn)數(shù)之和
num_all=input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+...
+hidden_num2+hidden_num2*output_num+output_num; %節(jié)點(diǎn)總數(shù)
?設(shè)置種群長(zhǎng)度和初始參數(shù)范圍
lenchrom=ones(1,num_all); %種群總長(zhǎng)度
limit=[-1*ones(num_all,1) 1*ones(num_all,1)]; %初始參數(shù)給定范圍
遺傳算法部分
主要思想就是
優(yōu)化神經(jīng)網(wǎng)絡(luò)的權(quán)重和閾值(偏置)初始選擇
其初始選擇
對(duì)于神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)效果好壞
是有較大影響的
流程框架
流程代碼
%% 實(shí)驗(yàn)開(kāi)始
TIME=[];
num_iter_all=5; %實(shí)驗(yàn)次數(shù)
input_data=P_regular;
output_data=T_regular;
test=[];
EMS_all=[];
titlestr=['實(shí)驗(yàn)運(yùn)行中,請(qǐng)稍等......'];
mm=waitbar(0,titlestr);%實(shí)驗(yàn)循環(huán)進(jìn)度條
set(mm,'Position',[245 376.8750 270 56.2500])
for NN=1:num_iter_all
t1=clock;%每次實(shí)驗(yàn)開(kāi)始的時(shí)間
str=['實(shí)驗(yàn)運(yùn)行第',num2str(NN),'次中,請(qǐng)稍等......'];
waitbar(NN/num_iter_all,mm,str); %實(shí)驗(yàn)進(jìn)度條
%% 基因編譯
for i=1:group_num
initial=rand(1,length(lenchrom)); %產(chǎn)生0-1的隨機(jī)數(shù)
initial_chrom(i,:)=limit(:,1)'+(limit(:,2)-limit(:,1))'.*initial; %變成染色體的形式,一行為一條染色體
fitness_value=fitness(initial_chrom(i,:),input_num,hidden_num1,hidden_num2,output_num,input_data,output_data);%計(jì)算初始適應(yīng)度
fitness_group(i)=fitness_value;
end
[bestfitness,bestindex]=min(fitness_group);
bestchrom=initial_chrom(bestindex,:); %最好的染色體
avgfitness=sum(fitness_group)/group_num; %染色體的平均適應(yīng)度
trace=[avgfitness bestfitness]; % 記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度
%% 迭代過(guò)程
input_chrom=initial_chrom;
titlestr=['GA迭代中,請(qǐng)稍等......'];
kk=waitbar(0,titlestr);%遺傳迭代循環(huán)進(jìn)度條
set(kk,'Position',[925 376.8750 270 56.2500])
for num=1:iter_num
str=['GA迭代第',num2str(num),'次中,請(qǐng)稍等......',num2str(num/iter_num*100),'%'];
waitbar(num/iter_num,kk,str); %GA迭代進(jìn)度條
% 選擇
[new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num); %把表現(xiàn)好的挑出來(lái),還是和種群數(shù)量一樣
% 交叉
new_chrom=Cross(cross_pro,lenchrom,new_chrom,group_num,limit);
% 變異
new_chrom=Mutation(mutation_pro,lenchrom,new_chrom,group_num,num,iter_num,limit);
% 計(jì)算每次迭代后的適應(yīng)度
for j=1:group_num
sgroup=new_chrom(j,:); %個(gè)體
new_fitness(j)=fitness(sgroup,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data);
end
%找到最小和最大適應(yīng)度的染色體及它們?cè)诜N群中的位置
[newbestfitness,newbestindex]=min(new_fitness);
[worestfitness,worestindex]=max(new_fitness);
% 代替上一次進(jìn)化中最好的染色體
if newbestfitness<bestfitness
bestfitness=newbestfitness;
bestchrom=new_chrom(newbestindex,:);
end
new_chrom(worestindex,:)=bestchrom;
new_fitness(worestindex)=bestfitness;
avgfitness=sum(new_fitness)/group_num;
trace=[trace;avgfitness bestfitness]; %記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度
end
close(kk)
%% 繪制適應(yīng)度曲線圖并保存
h=figure('visible','off');
[r ,~]=size(trace);
plot((1:r)',trace(:,2),'b--');
titlestr=['適應(yīng)度曲線 ','終止代數(shù)=',num2str(iter_num),' 第',num2str(NN),'次實(shí)驗(yàn)優(yōu)化'];
title(titlestr);
xlabel('進(jìn)化代數(shù)');ylabel('適應(yīng)度');
legend('最佳適應(yīng)度');
set(gca,'xlim',[0,iter_num])
titlestr=['第',num2str(NN),'次實(shí)驗(yàn)GA適應(yīng)度'];
print(h,'-dpng',titlestr)
%% 把遺傳算法優(yōu)化的最優(yōu)初始閥值權(quán)值賦予網(wǎng)絡(luò)預(yù)測(cè)
%構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu)
net=newff(P_regular,T_regular,[hidden_num1 hidden_num2],{'tansig','tansig','purelin'},'trainlm');
%權(quán)值初始化
w1=bestchrom(1:input_num*hidden_num1); %輸入層和第一層隱藏層之間的權(quán)重參數(shù)
B1=bestchrom(input_num*hidden_num1+1:input_num*hidden_num1+hidden_num1); %第一層隱藏層神經(jīng)元的偏置
w2=bestchrom(input_num*hidden_num1+hidden_num1+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2); %第一層隱藏層和第二層隱藏層之間的權(quán)重參數(shù)
B2=bestchrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2); %第二層隱藏層神經(jīng)元的偏置
w3=bestchrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num);%第二層隱藏層和輸出層之間的權(quán)值參數(shù)
B3=bestchrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+output_num);%輸出層神經(jīng)元的偏執(zhí)
%網(wǎng)絡(luò)權(quán)值賦值
net.iw{1,1}=reshape(w1,hidden_num1,input_num);
net.lw{2,1}=reshape(w2,hidden_num2,hidden_num1);
net.lw{3,2}=reshape(w3,output_num,hidden_num2);
net.b{1}=reshape(B1,hidden_num1,1);
net.b{2}=reshape(B2,hidden_num2,1);
net.b{3}=reshape(B3,output_num,1);
% 設(shè)置訓(xùn)練參數(shù)
net.trainParam.lr=0.001; %學(xué)習(xí)率
net.trainParam.goal=0.001; %目標(biāo)誤差
net.trainParam.epochs=4000; %最大迭代次數(shù)
%% 調(diào)用神經(jīng)網(wǎng)絡(luò)工具箱開(kāi)始訓(xùn)練
num=40; %訓(xùn)練次數(shù)
ems_all=[];
Test=[];
titlestr=['BP訓(xùn)練中,請(qǐng)稍等......'];
nn=waitbar(0,titlestr);%訓(xùn)練循環(huán)進(jìn)度條
set(nn,'Position',[925 376.8750 270 56.2500])
for i=1:num
str=['BP訓(xùn)練第',num2str(i),'次中,請(qǐng)稍等......',num2str(i/num*100),'%'];
waitbar(i/num,nn,str); %訓(xùn)練進(jìn)度條
%調(diào)用trainlm算法訓(xùn)練網(wǎng)絡(luò)
[net,tr]=train(net,P_regular,T_regular);
%放入到網(wǎng)絡(luò)輸出數(shù)據(jù)
A=sim(net,P_regular); %訓(xùn)練數(shù)據(jù)
% 更新每次訓(xùn)練后的網(wǎng)絡(luò)權(quán)值和閾值
w1=net.iw{1,1};
w2=net.lw{2,1};
w3=net.lw{3,2};
B1=net.b{1};
B2=net.b{2};
B3=net.b{3};
%利用訓(xùn)練好的網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)
%導(dǎo)入2022特征數(shù)據(jù)
nP=newdata;
nP_num=size(nP,2);
%數(shù)據(jù)歸一化處理
nP_regular=mapminmax('apply',nP,PS1);
%輸出預(yù)測(cè)結(jié)果
Hidden1_Out=tansig(w1*nP_regular+repmat(B1,1,nP_num)); %第一層隱藏層
Hidden2_Out=tansig(w2*Hidden1_Out+repmat(B2,1,nP_num));%第二層隱藏層
nT_regular=purelin(w3*Hidden2_Out+repmat(B3,1,nP_num));%輸出層
B=[A';nT_regular']';
%將得到的數(shù)據(jù)反歸一化得到預(yù)測(cè)數(shù)據(jù)
a=mapminmax('reverse',B,PS2);
%計(jì)算每次實(shí)驗(yàn)誤差
errors_nn=abs(a(:,1:13)-T);%每一年的誤差人數(shù)
EcRMSE=sum(errors_nn./T)/length(errors_nn)*100;%每次實(shí)驗(yàn)的誤差百分比
%存儲(chǔ)每次網(wǎng)絡(luò)訓(xùn)練數(shù)據(jù)并選擇最優(yōu)值
ems_all=[ems_all,EcRMSE];
Test=[Test;a];
[p,q]=min(ems_all); %q最小訓(xùn)練誤差的次數(shù)
EcRMSE=p;%p最小訓(xùn)練誤差值
a=Test(q,:);
end
close(nn)
%% 繪制每次BP誤差曲線圖并保存
h=figure('visible','off');
plot((1:num),ems_all,'b--');
titlestr=['誤差曲線 ','終止代數(shù)=',num2str(num),' 第',num2str(NN),'次實(shí)驗(yàn)優(yōu)化'];
title(titlestr);
xlabel('進(jìn)化代數(shù)');ylabel('誤差百分比/(%)');
legend('BP訓(xùn)練誤差');
set(gca,'xlim',[0,num])
titlestr=['第',num2str(NN),'次實(shí)驗(yàn)BP誤差'];
print(h,'-dpng',titlestr)
%% 存儲(chǔ)每次實(shí)驗(yàn)相關(guān)數(shù)據(jù)
EMS_all=[EMS_all,EcRMSE];%存儲(chǔ)每次實(shí)驗(yàn)誤差
test=[test;a];
%% GA-BP迭代優(yōu)化擇優(yōu)
%索引最小誤差的實(shí)驗(yàn)次數(shù)
[m,n]=min(EMS_all);
a=test(n,:);
%% 每次實(shí)驗(yàn)所耗時(shí)間存儲(chǔ)
t2=clock;%每次實(shí)驗(yàn)結(jié)束的時(shí)間
Time_all=etime(t2,t1);%實(shí)驗(yàn)所耗時(shí)間
TIME=[TIME,Time_all];%存儲(chǔ)每次實(shí)驗(yàn)所耗時(shí)間
time=sum(TIME);%實(shí)驗(yàn)總共所耗時(shí)間計(jì)算
end
close(mm)
建模方法特點(diǎn)
關(guān)閉了遺傳算法的適應(yīng)度迭代圖
和神經(jīng)網(wǎng)絡(luò)訓(xùn)練誤差圖
但保存在了MATLAB打開(kāi)的文件夾里
☆☆☆☆☆
模型中對(duì)整個(gè)實(shí)驗(yàn)循環(huán)
(神經(jīng)網(wǎng)絡(luò)每次預(yù)測(cè)的值是不唯一的,選取實(shí)驗(yàn)誤差最小的模型數(shù)據(jù)作為最終預(yù)測(cè)值)
遺傳算法迭代循環(huán)、神經(jīng)網(wǎng)絡(luò)訓(xùn)練循環(huán)
設(shè)置了進(jìn)度條顯示
(循環(huán)次數(shù)設(shè)置的比較大,可以查看實(shí)驗(yàn)進(jìn)程)
☆☆☆☆☆
在遺傳算法優(yōu)化模塊中:
適應(yīng)度計(jì)算函數(shù)
function fitness_value=fitness(input_chrom,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data)
%該函數(shù)用來(lái)計(jì)算適應(yīng)度值
%input_chrom 輸入種群
%input_num 輸入層的節(jié)點(diǎn)數(shù),即數(shù)據(jù)特征數(shù)量
%output_num 隱含層節(jié)點(diǎn)數(shù),隱藏層神經(jīng)元的個(gè)數(shù)
%input_data 訓(xùn)練輸入數(shù)據(jù)
%output_data 訓(xùn)練輸出數(shù)據(jù)
%fitness_value 個(gè)體適應(yīng)度值
w1=input_chrom(1:input_num*hidden_num1); %輸入層和第一層隱藏層之間的權(quán)重參數(shù)
B1=input_chrom(input_num*hidden_num1+1:input_num*hidden_num1+hidden_num1); %第一層隱藏層神經(jīng)元的偏置
w2=input_chrom(input_num*hidden_num1+hidden_num1+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2); %第一層隱藏層和第二層隱藏層之間的權(quán)重參數(shù)
B2=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2); %第二層隱藏層神經(jīng)元的偏置
w3=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num);%第二層隱藏層和輸出層之間的權(quán)重參數(shù)
B3=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+1:end);%輸出層神經(jīng)元的偏置
%網(wǎng)絡(luò)權(quán)值賦值
W1=reshape(w1,hidden_num1,input_num);
W2=reshape(w2,hidden_num2,hidden_num1);
W3=reshape(w3,output_num,hidden_num2);
B1=reshape(B1,hidden_num1,1);
B2=reshape(B2,hidden_num2,1);
B3=reshape(B3,output_num,1);
[~,n]=size(input_data);
A1=tansig(W1*input_data+repmat(B1,1,n)); %需與主函數(shù)中激活函數(shù)相同
A2=tansig(W2*A1+repmat(B2,1,n)); %需與主函數(shù)中激活函數(shù)相同
A3=purelin(W3*A2+repmat(B3,1,n)); %需與主函數(shù)中激活函數(shù)相同
error=sumsqr(output_data-A3);
fitness_value=error; %誤差即為適應(yīng)度
end
利用神經(jīng)網(wǎng)絡(luò)的權(quán)重和閾值
計(jì)算輸入數(shù)據(jù)的預(yù)測(cè)值
從而計(jì)算適應(yīng)度值=預(yù)測(cè)值與輸出值差的平方和
其中:
輸入層與第一層隱藏層之間的權(quán)重值w1=索引輸入染色體值initial_chrom的范圍(1:輸入染色體的第1個(gè)到輸入特征數(shù)目×第一層隱藏層節(jié)點(diǎn)數(shù));
第一層隱藏層神經(jīng)元的偏置B1=索引輸入染色體值initial_chrom的范圍(w1索引范圍的末值+1:w1索引范圍的末值+第一層隱藏層節(jié)點(diǎn)數(shù));
第一層隱藏層和第二層隱藏層之間的權(quán)重值w2=索引輸入染色體值initial_chrom的范圍(B1索引范圍的末值+1:B1索引范圍的末值+第一層隱藏層節(jié)點(diǎn)數(shù)×第二層隱藏層節(jié)點(diǎn)數(shù));
第二層隱藏層神經(jīng)元的偏置B2=索引輸入染色體值initial_chrom的范圍(w2索引范圍的末值+1:w2索引范圍的末值+第二層隱藏層節(jié)點(diǎn)數(shù));
第二層隱藏層和輸出層之間的權(quán)重值w3=索引輸入染色體值initial_chrom的范圍(B2索引范圍的末值+1:B2索引范圍的末值+第二層隱藏層節(jié)點(diǎn)數(shù));
輸出層神經(jīng)元的偏置B3=索引輸入染色體值initial_chrom的范圍(w3索引范圍的末值+1:end);
☆☆☆☆☆
以上權(quán)重和偏置的各索引
范圍必須設(shè)置正確
否則后面的網(wǎng)絡(luò)權(quán)值reshape重組時(shí)
與網(wǎng)絡(luò)結(jié)構(gòu)不匹配會(huì)報(bào)錯(cuò)
(后面神經(jīng)網(wǎng)絡(luò)中初始權(quán)重和偏置的索引范圍同理)
?
選擇操作函數(shù)
function [new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num)
% 用輪盤賭在原來(lái)的函數(shù)里選擇
% fitness_group 種群信息
% group_num 種群規(guī)模
% newgroup 選擇后的新種群
%求適應(yīng)度值倒數(shù)
fitness1=10./fitness_group; %individuals.fitness為個(gè)體適應(yīng)度值
%個(gè)體選擇概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%采用輪盤賭法選擇新個(gè)體
index=[];
for i=1:1000 %group_num為種群數(shù)
pick=rand;
while pick==0
pick=rand;
end
for j=1:group_num
pick=pick-sumf(j);
if pick<0
index=[index j];
break;
end
end
if length(index) == group_num
break;
end
end
%新種群
new_chrom=input_chrom(index,:);
new_fitness=fitness_group(index);
end
交叉操作函數(shù)
function new_chrom=Cross(cross_pro,lenchrom,input_chrom,group_num,limit)
%隨機(jī)選擇兩個(gè)染色體位置交叉
% cross_pro 交叉概率
% lenchrom 染色體的長(zhǎng)度,即所有參數(shù)的數(shù)量
% input_chrom 染色體群,經(jīng)過(guò)選擇遺傳下來(lái)的表現(xiàn)比較好的
% group_num 種群規(guī)模
% new_chrom 交叉后的染色體
for i=1:group_num %每一輪for循環(huán)中,可能會(huì)進(jìn)行一次交叉操作,染色體是隨機(jī)選擇的,交叉位置也是隨機(jī)選擇的,
%但該輪for循環(huán)中是否進(jìn)行交叉操作則由交叉概率決定(continue控制)
pick=rand(1,2); % 隨機(jī)選擇兩個(gè)染色體進(jìn)行交叉
while prod(pick)==0 %連乘
pick=rand(1,2);
end
index=ceil(pick.*group_num); % 交叉概率決定是否進(jìn)行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>cross_pro
continue;
end
% 隨機(jī)選擇交叉位
pick=rand;
while pick==0
pick=rand;
end
flag=0;
while flag==0
pos=ceil(pick*length(lenchrom)); %隨機(jī)選擇進(jìn)行交叉的位置,即選擇第幾個(gè)變量進(jìn)行交叉,注意:兩個(gè)染色體交叉的位置相同
pick=rand; %交叉開(kāi)始
v1=input_chrom(index(1),pos);
v2=input_chrom(index(2),pos);
input_chrom(index(1),pos)=pick*v2+(1-pick)*v1;
input_chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉結(jié)束
%判斷交叉后的兩條染色體可不可行
limit1=mean(limit);
f11=isempty(find(input_chrom(index(1),:)>limit1(2), 1));
f12=isempty(find(input_chrom(index(1),:)<limit1(1), 1));
if f11*f12==0
flag1=0;
else
flag1=1;
end
f21=isempty(find(input_chrom(index(2),:)>limit1(2), 1));
f22=isempty(find(input_chrom(index(2),:)<limit1(1), 1));
if f21*f22==0
flag2=0;
else
flag2=1;
end
if flag1*flag2==0
flag=0;
else
flag=1;
end %如果兩個(gè)染色體不是都可行,則重新交叉
end
end
new_chrom=input_chrom;
end
變異操作函數(shù)
function new_chrom=Mutation(mutation_pro,lenchrom,input_chrom,group_num,num,iter_num,limit)
% 本函數(shù)完成變異操作
% mutation_pro 變異概率
% lenchrom 染色體長(zhǎng)度
% input_chrom 輸入交叉過(guò)后的染色體
% group_num 種群規(guī)模
% iter_num 最大迭代次數(shù)
% limit 每個(gè)個(gè)體的上限和下限
% num 當(dāng)前迭代次數(shù)
% new_chrom 變異后的染色體
for i=1:group_num %每一輪for循環(huán)中,可能會(huì)進(jìn)行一次變異操作,染色體是隨機(jī)選擇的,變異位置也是隨機(jī)選擇的,
%但該輪for循環(huán)中是否進(jìn)行變異操作則由變異概率決定(continue控制)
% 隨機(jī)選擇一個(gè)染色體進(jìn)行變異
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*group_num);
% 變異概率決定該輪循環(huán)是否進(jìn)行變異
pick=rand;
if pick>mutation_pro
continue;
end
flag=0;
while flag==0
% 變異位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom)); %隨機(jī)選擇了染色體變異的位置,即選擇了第pos個(gè)變量進(jìn)行變異
pick=rand; %變異開(kāi)始
fg=(pick*(1-num/iter_num))^2;
if pick>0.5
input_chrom(index,pos)=input_chrom(index,pos)+(limit(pos,2)-input_chrom(index,pos))*fg;
else
input_chrom(index,pos)=input_chrom(index,pos)-(input_chrom(index,pos)-limit(pos,1))*fg;
end %變異結(jié)束
limit1=mean(limit);
f1=isempty(find(input_chrom(index,:)>limit1(2)));
f2=isempty(find(input_chrom(index,:)<limit1(1)));
if f1*f2==0
flag=0;
else
flag=1;
end
end
end
new_chrom=input_chrom;
神經(jīng)網(wǎng)絡(luò)算法模塊的設(shè)置
經(jīng)過(guò)多次測(cè)試
第一層和第二層隱藏層的激活函數(shù)用‘tansig’
輸出層的激活函數(shù)用‘purelin’
訓(xùn)練算法函數(shù)用‘trainlm’
預(yù)測(cè)效果是最好的
☆☆☆☆☆
網(wǎng)絡(luò)的權(quán)重和閾值索引的是
遺傳算法優(yōu)化模塊迭代進(jìn)化后的最優(yōu)值bestchrom
各權(quán)重和偏置索引最優(yōu)值bestchrom的范圍
同遺傳算法中的適應(yīng)度計(jì)算中的設(shè)置相同
☆☆☆☆☆
由于,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練易陷入最小值
訓(xùn)練次數(shù)設(shè)置很大也不容易找到更優(yōu)預(yù)測(cè)
所以,隱藏層數(shù)設(shè)置為2層、減少訓(xùn)練次數(shù)
同樣能夠完成優(yōu)化
且隱藏層增加1層并不會(huì)對(duì)所耗時(shí)間有太大影響
整體模型預(yù)測(cè)
效果更好,消耗時(shí)間更短
☆☆☆☆☆
整個(gè)實(shí)驗(yàn)中
對(duì)遺傳算法的每一代
適應(yīng)度值、神經(jīng)網(wǎng)絡(luò)訓(xùn)練值、預(yù)測(cè)值、誤差值
都進(jìn)行了存儲(chǔ)
并選擇了最優(yōu)值
使用mapminmax函數(shù)對(duì)得到的最優(yōu)數(shù)據(jù)反歸一化
使用mapminmax函數(shù)的返回命令'reverse'
調(diào)用歸一化時(shí)得到的結(jié)構(gòu)體PS2
完成最優(yōu)數(shù)據(jù)反歸一化
?????
繪制實(shí)驗(yàn)誤差曲線圖
實(shí)際值與預(yù)測(cè)值曲線圖
設(shè)置實(shí)驗(yàn)結(jié)果提示窗口
%% 提取2022年的預(yù)測(cè)數(shù)據(jù)
Ab=a(1,14);
disp('2022年的預(yù)測(cè)客流量為:')
disp(Ab)
%% 繪制曲線圖
%繪制GA-BP誤差曲線
figure('visible','on');
plot(EMS_all,'LineWidth',2)
xlabel('實(shí)驗(yàn)優(yōu)化次數(shù)')
ylabel('誤差')
titlestr=('GA-BP實(shí)驗(yàn)誤差曲線');
title(titlestr)
%繪制目標(biāo)數(shù)據(jù)與預(yù)測(cè)數(shù)據(jù)曲線圖
figure
x1=2009:1:2021;%實(shí)際值年份
x2=2009:1:2022;%預(yù)測(cè)值年份
axy3=plot(x1,T,'b-','linewidth',1);
hold on
axy4=plot(x2,test(n,:),'r--.','linewidth',1);
xlabel('年份')
ylabel('客流量/億人次')
titlestr=['GABP遺傳神經(jīng)網(wǎng)絡(luò)算法預(yù)測(cè)——我國(guó)城市公交系統(tǒng)車站客流量',' 誤差:',num2str(m),'%',' 2022年預(yù)測(cè)客流量為:',num2str(Ab),'億人次'];
title(titlestr)
set(gca,'xtick',2009:1:2022);
legend([axy3(1),axy4(1)],'真實(shí)數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)')
axis([2009 2022 400 800])
grid on
%% 繪制結(jié)果提示窗口
titlestr1=['實(shí)驗(yàn)',num2str(num_iter_all),'次','所耗時(shí)間:',num2str(time),' 秒',' 最小誤差為: 第 ',num2str(n(1)),' 次的 ',num2str(m(1)),'%'];
titlestr2=['2022年預(yù)測(cè)客流量為 : ',num2str(Ab),' 億人次'];
disp(titlestr1)
disp(titlestr2)
h=msgbox({titlestr1;titlestr2},'GA-BP模型預(yù)測(cè)結(jié)果');
% 文本居中
th = findall(0, 'Tag','MessageBox' );
boxPosition = get(h,'position');
textPosition = get(th, 'position');
set(th, 'position', [boxPosition(3).*0.5 textPosition(2) textPosition(3)]);
set(th, 'HorizontalAlignment', 'center');
運(yùn)行結(jié)果圖
?
僅供學(xué)習(xí)參考
?
基于遺傳算法優(yōu)化的城市公交系統(tǒng)車站客流量預(yù)測(cè)
到了這里,關(guān)于GA-BP遺傳神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!