神經(jīng)網(wǎng)絡遺傳算法函數(shù)極值尋優(yōu)

背景

對于未知的非線性函數(shù)壁拉,僅通過函數(shù)的輸入輸出數(shù)據(jù)難以準確尋找函數(shù)極值立叛。這類問題可以通過神經(jīng)網(wǎng)絡結合遺傳算法求解芝发,利用神經(jīng)網(wǎng)絡的非線性擬合能力和遺傳算法的非線性尋優(yōu)能力尋找函數(shù)極值泼诱。本文用神經(jīng)網(wǎng)絡遺傳算法尋優(yōu)如下非線性函數(shù)極值,函數(shù)表達式為


函數(shù)圖形如下圖1所示咪奖。


圖1 非線性函數(shù)圖形

從函數(shù)方程和圖形可以看出盗忱,該函數(shù)的全局最小值為0,對應的坐標為(0,0)羊赵。雖然從函數(shù)方程和圖形中很容易找出函數(shù)極值及極值對應坐標趟佃,但是在函數(shù)方程未知的情況下函數(shù)極值及極值對應坐標就很難找到。

模型建立

神經(jīng)網(wǎng)絡遺傳算法函數(shù)極值尋優(yōu)主要分為BP神經(jīng)網(wǎng)絡訓練擬合和遺傳算法極值尋優(yōu)兩步,算法流程如下圖2所示闲昭。


圖2 算法流程圖

神經(jīng)網(wǎng)絡訓練擬合根據(jù)尋優(yōu)函數(shù)的特點構建合適的BP神經(jīng)網(wǎng)絡罐寨,用非線性函數(shù)的輸出數(shù)據(jù)訓練BP網(wǎng)絡,訓練后的BP神經(jīng)網(wǎng)絡就可以預測函數(shù)輸出汤纸。遺傳算法極值尋優(yōu)把訓練后的BP神經(jīng)網(wǎng)絡預測結果作為個體適應度值衩茸,通過選擇、交叉和變異操作尋找函數(shù)的全局最優(yōu)值及對應輸入值贮泞。
本文根據(jù)非線性函數(shù)有2個輸入?yún)?shù)楞慈、1個輸出參數(shù),確定BP神經(jīng)網(wǎng)絡結構為2-5-1.取函數(shù)的4 000組輸入輸出數(shù)據(jù)啃擦,從中隨機選取3 900組數(shù)據(jù)訓練網(wǎng)絡囊蓝,100組數(shù)據(jù)測試網(wǎng)絡性能,網(wǎng)絡訓練好后用于預測非線性函數(shù)輸出令蛉。
遺傳算法中個體采用實數(shù)編碼聚霜,由于尋優(yōu)函數(shù)只有2個輸入?yún)?shù),所以個體長度為2珠叔。個體適應度值為BP神經(jīng)網(wǎng)絡預測值蝎宇,適應度值越小。交叉概率為0.4祷安,變異概率為0.2姥芥。

MATLAB實現(xiàn)

1、BP神經(jīng)網(wǎng)絡訓練擬合

用函數(shù)輸入輸出數(shù)據(jù)訓練BP神經(jīng)網(wǎng)絡汇鞭,使訓練后的網(wǎng)絡能夠擬合非線性函數(shù)輸出凉唐,保存訓練好的網(wǎng)絡用語計算個體適應度值。根據(jù)非線性函數(shù)方程隨機得到該函數(shù)的4 000組輸入輸出數(shù)據(jù)霍骄,存儲于data.mat中台囱,其中input為函數(shù)輸入數(shù)據(jù),output為函數(shù)對應輸出數(shù)據(jù)读整,從中隨機抽取3 900組訓練數(shù)據(jù)訓練網(wǎng)絡簿训,100組測試數(shù)據(jù)測試網(wǎng)絡擬合性能。最后保存訓練好的網(wǎng)絡米间。

%% 清空環(huán)境變量
clc
clear

tic
%% 訓練數(shù)據(jù)預測數(shù)據(jù)提取及歸一化
%下載輸入輸出數(shù)據(jù)
load data1 input output

%從1到2000間隨機排序
k=rand(1,4000);
[m,n]=sort(k);

%找出訓練數(shù)據(jù)和預測數(shù)據(jù)
input_train=input(n(1:3900),:)';
output_train=output(n(1:3900),:)';
input_test=input(n(3901:4000),:)';
output_test=output(n(3901:4000),:)';

%選連樣本輸入輸出數(shù)據(jù)歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);

%% BP網(wǎng)絡訓練
% %初始化網(wǎng)絡結構
net=newff(inputn,outputn,5);

net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;

%網(wǎng)絡訓練
net=train(net,inputn,outputn);

%% BP網(wǎng)絡預測
%預測數(shù)據(jù)歸一化
inputn_test=mapminmax('apply',input_test,inputps);
 
%網(wǎng)絡預測輸出
an=sim(net,inputn_test);
 
%網(wǎng)絡輸出反歸一化
BPoutput=mapminmax('reverse',an,outputps);

%% 結果分析

figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('預測輸出','期望輸出','fontsize',12)
title('BP網(wǎng)絡預測輸出','fontsize',12)
xlabel('樣本','fontsize',12)
ylabel('輸出','fontsize',12)

%預測誤差
error=BPoutput-output_test;

figure(2)
plot(error,'-*')
title('神經(jīng)網(wǎng)絡預測誤差')

figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神經(jīng)網(wǎng)絡預測誤差百分比')

errorsum=sum(abs(error))

toc

2煎楣、適應度函數(shù)

把訓練好的BP神經(jīng)網(wǎng)絡預測輸出作為個體適應度值。

function fitness = fun(x)
% 函數(shù)功能:計算該個體對應適應度值
% x           input     個體
% fitness     output    個體適應度值

%
load data net inputps outputps

%數(shù)據(jù)歸一化
x=x';
inputn_test=mapminmax('apply',x,inputps);
 
%網(wǎng)絡預測輸出
an=sim(net,inputn_test);
 
%網(wǎng)絡輸出反歸一化
fitness=mapminmax('reverse',an,outputps);

3车伞、遺傳算法主函數(shù)

%% 清空環(huán)境變量
clc
clear

%% 初始化遺傳算法參數(shù)
%初始化參數(shù)
maxgen=100;                         %進化代數(shù),即迭代次數(shù)
sizepop=20;                        %種群規(guī)模
pcross=[0.4];                       %交叉概率選擇喻喳,0和1之間
pmutation=[0.2];                    %變異概率選擇另玖,0和1之間

lenchrom=[1 1];          %每個變量的字串長度,如果是浮點變量,則長度都為1
bound=[-5 5;-5 5];  %數(shù)據(jù)范圍


individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %將種群信息定義為一個結構體
avgfitness=[];                      %每一代種群的平均適應度
bestfitness=[];                     %每一代種群的最佳適應度
bestchrom=[];                       %適應度最好的染色體

%% 初始化種群計算適應度值
% 初始化種群
for i=1:sizepop
    %隨機產(chǎn)生一個種群
    individuals.chrom(i,:)=Code(lenchrom,bound);   
    x=individuals.chrom(i,:);
    %計算適應度
    individuals.fitness(i)=fun(x);   %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);  %最好的染色體
avgfitness=sum(individuals.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness]; 

%% 迭代尋優(yōu)
% 進化開始
for i=1:maxgen
    i
    % 選擇
    individuals=Select(individuals,sizepop); 
    avgfitness=sum(individuals.fitness)/sizepop;
    %交叉
    individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
    % 變異
    individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i maxgen],bound);
    
    % 計算適應度 
    for j=1:sizepop
        x=individuals.chrom(j,:); %解碼
        individuals.fitness(j)=fun(x);   
    end
    
  %找到最小和最大適應度的染色體及它們在種群中的位置
    [newbestfitness,newbestindex]=min(individuals.fitness);
    [worestfitness,worestindex]=max(individuals.fitness);
    % 代替上一次進化中最好的染色體
    if bestfitness>newbestfitness
        bestfitness=newbestfitness;
        bestchrom=individuals.chrom(newbestindex,:);
    end
    individuals.chrom(worestindex,:)=bestchrom;
    individuals.fitness(worestindex)=bestfitness;
    
    avgfitness=sum(individuals.fitness)/sizepop;
    
    trace=[trace;avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度
end
%進化結束

%% 結果分析
figure();
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('適應度曲線','fontsize',12);
xlabel('進化代數(shù)','fontsize',12);
ylabel('適應度','fontsize',12);
axis([0,100,0,1])

% 窗口顯示
disp('適應度');
x=bestchrom;
disp([bestfitness]);
disp('變量');
disp([x]);

4谦去、結果分析

BP神經(jīng)網(wǎng)絡擬合結果分析
本文中個體的適應度值為BP神經(jīng)網(wǎng)絡預測值慷丽,因此BP神經(jīng)網(wǎng)絡預測精度對于最優(yōu)位置的尋找具有非常重要的意義。由于尋優(yōu)非線性函數(shù)有2個輸入?yún)?shù)鳄哭、1個輸出參數(shù)要糊,所以構建的BP神經(jīng)網(wǎng)絡的結構為2-5-1。共取非線性函數(shù)4 000組輸入輸出數(shù)據(jù)妆丘,從中隨機選擇3 900組數(shù)據(jù)訓練BP神經(jīng)網(wǎng)絡锄俄,100組數(shù)據(jù)作為測試數(shù)據(jù)測試BP神經(jīng)網(wǎng)絡擬合性能,BP神經(jīng)網(wǎng)絡預測輸出和期望輸出對比如下圖3所示勺拣。

圖3 BP神經(jīng)網(wǎng)絡預測輸出

從BP神經(jīng)網(wǎng)絡預測結果可以看出奶赠,BP神經(jīng)網(wǎng)絡可以準確預測非線性函數(shù)輸出,可以把網(wǎng)絡預測近似看成函數(shù)實際輸出药有。

遺傳算法尋優(yōu)結果分析BP神經(jīng)網(wǎng)絡訓練結束后毅戈,可以利用遺傳算法尋找該非線性函數(shù)的最小值。遺傳算法的迭代次數(shù)是100次愤惰,種群規(guī)模是20苇经,交叉概率為0.4,變異概率為0.2宦言,采用浮點數(shù)編碼扇单,個體長度為21,優(yōu)化過程中最優(yōu)個體適應度值變化曲線如下圖4所示蜡励。

圖4 適應度變化曲線

遺傳算法得到的最優(yōu)個體適應度值為0.0155令花,最優(yōu)個體為[0.0062 0.0002],最優(yōu)個體適應度值同非線性函數(shù)實際最小值0和最小值對應坐標(0,0)非常接近凉倚,說明該方法是有效的兼都。

討論

本文所使用的方法有比較重要的工程應用價值,比如對于某項試驗來說稽寒,試驗目的是獲取到最大試驗結果對應的實驗條件扮碧,但是由于時間和經(jīng)費限制,該試驗只能進行有限次杏糙,可能單靠試驗結果找不到最優(yōu)的試驗條件慎王。這時可以在已知試驗數(shù)據(jù)的基礎上,通過本文介紹的神經(jīng)網(wǎng)絡遺傳算法尋找最優(yōu)試驗條件宏侍。
思路就是先根據(jù)試驗條件數(shù)和試驗結果數(shù)確定BP神經(jīng)網(wǎng)絡結構赖淤;然后把試驗條件作為輸入數(shù)據(jù),試驗結果作為輸出數(shù)據(jù)訓練BP網(wǎng)絡谅河,使得訓練后的網(wǎng)絡可以預測一定試驗條件下的試驗結果咱旱;最后把試驗條件作為遺傳算法中的種群個體确丢,把網(wǎng)絡預測的試驗結果作為個體適應度值,通過遺傳算法推導最優(yōu)試驗結果及其對應試驗條件吐限。

本文訓練數(shù)據(jù)及程序源代碼見評論區(qū)

獲取更多干貨文章鲜侥,請關注微信公眾號【科學計算與編程】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诸典,隨后出現(xiàn)的幾起案子描函,更是在濱河造成了極大的恐慌,老刑警劉巖狐粱,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舀寓,死亡現(xiàn)場離奇詭異,居然都是意外死亡脑奠,警方通過查閱死者的電腦和手機基公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宋欺,“玉大人轰豆,你說我怎么就攤上這事〕莸” “怎么了酸休?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祷杈。 經(jīng)常有香客問我斑司,道長,這世上最難降的妖魔是什么但汞? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任宿刮,我火速辦了婚禮,結果婚禮上私蕾,老公的妹妹穿的比我還像新娘僵缺。我一直安慰自己,他們只是感情好踩叭,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布磕潮。 她就那樣靜靜地躺著,像睡著了一般容贝。 火紅的嫁衣襯著肌膚如雪自脯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天斤富,我揣著相機與錄音膏潮,去河邊找鬼。 笑死,一個胖子當著我的面吹牛域庇,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼龟糕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悔耘?” 一聲冷哼從身側響起讲岁,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衬以,沒想到半個月后缓艳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡看峻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年阶淘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片互妓。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡溪窒,死狀恐怖,靈堂內的尸體忽然破棺而出冯勉,到底是詐尸還是另有隱情澈蚌,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布灼狰,位于F島的核電站宛瞄,受9級特大地震影響,放射性物質發(fā)生泄漏交胚。R本人自食惡果不足惜份汗,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝴簇。 院中可真熱鬧杯活,春花似錦、人聲如沸军熏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荡澎。三九已至均践,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摩幔,已是汗流浹背彤委。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留或衡,地道東北人焦影。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓车遂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斯辰。 傳聞我的和親對象是個殘疾皇子舶担,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容