GA-BP模型的应用——刀具磨损程度预测
最近,將自己所學(xué)的GA-BP模型介紹給了同學(xué)
雖然水論文,但理論上是實(shí)實(shí)在在合理的
將此案例分享一下
他的論文題目是《豐田800臥式加工中心的操作與管理》
在通讀參考文獻(xiàn)的論文后
總結(jié)出國內(nèi)外研究現(xiàn)狀
????????國內(nèi)外的豐田800臥式加工中心研究主要集中在設(shè)備的操作、維護(hù)、加工工藝、自動(dòng)化控制和管理等方面。其中,智能化控制和管理是當(dāng)前研究的熱點(diǎn)之一。隨著智能制造的發(fā)展和需求的不斷增加,提高設(shè)備的智能化程度和自動(dòng)化程度將成為未來的發(fā)展趨勢(shì)。因此,進(jìn)一步研究豐田800臥式加工中心的智能化控制和管理技術(shù),將對(duì)提高設(shè)備的生產(chǎn)效率、降低成本、提高競爭力具有重要意義。
?根據(jù)目的和意義
“提高設(shè)備的生產(chǎn)效率、降低成本、提高競爭力”
我給他建議了GA-BP模型預(yù)測(cè)機(jī)床操作時(shí)刀具磨損程度的創(chuàng)新點(diǎn)
具體如下:
(1)結(jié)合遺傳算法和BP神經(jīng)網(wǎng)絡(luò):論文將遺傳算法和BP神經(jīng)網(wǎng)絡(luò)結(jié)合起來,以優(yōu)化BP神經(jīng)網(wǎng)絡(luò)的性能,從而實(shí)現(xiàn)更準(zhǔn)確的刀具磨損預(yù)測(cè),提高豐田800臥式加工中心的加工效率和降低成本。
(2)自適應(yīng)學(xué)習(xí)率:論文使用遺傳算法來優(yōu)化BP神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)率,以自適應(yīng)地調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù),提高其訓(xùn)練和預(yù)測(cè)的效率和準(zhǔn)確性。
(3)多目標(biāo)優(yōu)化:論文將刀具磨損預(yù)測(cè)作為一個(gè)多目標(biāo)優(yōu)化問題,通過遺傳算法尋找最優(yōu)解,以達(dá)到最小化刀具磨損和最大化加工效率的目標(biāo)。
(4)數(shù)據(jù)集優(yōu)化:論文使用遺傳算法來優(yōu)化刀具磨損預(yù)測(cè)所需的數(shù)據(jù)集,以提高預(yù)測(cè)準(zhǔn)確性和泛化能力。
(5)與實(shí)際生產(chǎn)環(huán)境結(jié)合:論文可能結(jié)合豐田800臥式加工中心的實(shí)際生產(chǎn)環(huán)境,通過遺傳算法和BP神經(jīng)網(wǎng)絡(luò)來預(yù)測(cè)刀具磨損,優(yōu)化加工流程和管理決策,提高加工效率和產(chǎn)品質(zhì)量。
?向他了解了機(jī)床操作時(shí)
影響刀具磨損的因素會(huì)有哪些
包括刀具磨損程度由哪些特質(zhì)來體現(xiàn)
總結(jié)出特征因素如下:
影響特征因素:切割速度、切割力、切削深度、切割時(shí)間、材料硬度、切削液、刀具材料
?
預(yù)測(cè)特征:切削深度變化、切削力變化、切削溫度變化、表面質(zhì)量變化
?預(yù)測(cè)特征有4個(gè)
可以根據(jù)機(jī)床操作經(jīng)驗(yàn)對(duì)四個(gè)預(yù)測(cè)特征分析
運(yùn)用四個(gè)預(yù)測(cè)特征
建立出適應(yīng)刀具磨損度的數(shù)學(xué)模型
來評(píng)判刀具磨損的程度
根據(jù)磨損程度可以合理調(diào)整影響特征數(shù)據(jù)
在保證加工完好的前提下
確保刀具磨損程度的降低
從而降低整個(gè)加工成本
數(shù)據(jù)如下:
?源代碼如下:
clear; clc; close all; %% 實(shí)驗(yàn)數(shù)據(jù)導(dǎo)入及整理 data1=[20,25,18,22,24,21,26,19,23,27,17,28,20.5,22.5,26.5]; %切割速度/(m/s) data2=[300,350,270,320,340,310,360,280,330,370,260,380,305,325,355]; %切割力/N data3=[1.5,2,1.2,1.8,1.9,1.6,2.1,1.3,1.7,2.2,1.1,2.3,1.6,1.4,2]; %切削深度/mm data4=[20,25,18,22,24,21,26,19,23,27,17,28,21,19.5,23.5]; %切割時(shí)間/s data5=[45,50,42,48,50,46,52,43,49,54,40,55,46.5,45,51]; %材料硬度/HRC data6=[8,9,7,8,8.5,7.5,9,7,8,9.5,7,10,8,7.5,9.5]; %切削液/pH值 data7=[1,2,3,1,2,3,2,3,1,2,3,1,1,3,2]; %刀具材料 data8=[0.2,0.3,0.1,0.3,0.2,0.2,0.4,0.1,0.2,0.5,0.1,0.6,0.25,0.15,0.35]; %切削深度變化/mm data9=[30,35,25,32,30,28,38,27,31,40,24,42,31.5,28.5,34.5]; %切削力變化/N data10=[10,15,8,12,10,9,18,8,11,20,7,22,12.5,9.5,16.5]; %切削溫度變化/℃ data11=[0.5,0.6,0.3,0.6,0.5,0.4,0.8,0.3,0.6,1,0.2,1.2,0.65,0.35,0.75]; %表面質(zhì)量變化/μm P=[data1;data2;data3;data4;data5;data6;data7]; %輸入數(shù)據(jù) T=[data8;data9;data10;data11]; %輸出數(shù)據(jù) x=1:1:15; %統(tǒng)計(jì)刀具磨損樣本數(shù) %% 實(shí)驗(yàn)參數(shù)初始化 group_num=30; %GA種群規(guī)模 cross_pro=0.7; %GA交叉概率 mutation_pro=0.04; %GA變異概率,相對(duì)來說比較小 iter_num=200; %GA迭代循環(huán)次數(shù) num_iter_all=200; %GA-BP實(shí)驗(yàn)次數(shù) % 實(shí)驗(yàn)變量存儲(chǔ) TIME=ones(1,num_iter_all); EMS_all=ones(1,num_iter_all); test=ones(num_iter_all,length(T)); titlestr='實(shí)驗(yàn)運(yùn)行中,請(qǐng)稍等......'; mm=waitbar(0,titlestr); set(mm,'Position',[585 376.8750 270 56.2500]) for NN=1:num_iter_allstr=['實(shí)驗(yàn)運(yùn)行第',num2str(NN),'次中,請(qǐng)稍等......'];waitbar(NN/num_iter_all,mm,str); %實(shí)驗(yàn)進(jìn)度條t1=datetime('now'); %每次實(shí)驗(yàn)開始的時(shí)間%% 輸入數(shù)據(jù)和輸出數(shù)據(jù)數(shù)據(jù)的比例劃分[~,g]=size(P);randIndex=randperm(g);k=ceil(0.80*g); %設(shè)置80%比例的數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)trainIndex=sort(randIndex(1:k)); %隨機(jī)選出特征數(shù)據(jù)的80%比例作為訓(xùn)練數(shù)據(jù)(這里先選出數(shù)據(jù)的序號(hào))testIndex=sort(randIndex(k+1:g)); %將剩下的數(shù)據(jù)作為檢驗(yàn)數(shù)據(jù)(這里先選出數(shù)據(jù)的序號(hào))inputData_train=P(:,trainIndex); %根據(jù)序號(hào)選出80%比例數(shù)據(jù)用于訓(xùn)練的輸入inputData_test=P(:,testIndex); %根據(jù)序號(hào)選出20%比例數(shù)據(jù)用于驗(yàn)證的輸入outputData_train=T(:,trainIndex); %根據(jù)序號(hào)選出80%比例數(shù)據(jù)用于訓(xùn)練的輸出outputData_test=T(:,testIndex); %根據(jù)序號(hào)選出20%比例數(shù)據(jù)用于驗(yàn)證的輸出%% 記錄數(shù)據(jù)比例劃分Index(NN,:)=testIndex;%% 實(shí)驗(yàn)數(shù)據(jù)歸一化[inputdata_train_regular,PS1]=mapminmax(inputData_train,-1,1);[outputdata_train_regular,PS2]=mapminmax(outputData_train,-1,1);inputdata_test_regular=mapminmax('apply',inputData_test,PS1);outputdata_test_regular=mapminmax('apply',outputData_test,PS2);%% 基因編譯input_num=size(inputData_train,1); %輸入特征個(gè)數(shù)output_num=size(outputData_train,1); %輸出特征個(gè)數(shù)hidden_num1=13; %第一層隱藏層神經(jīng)元個(gè)數(shù)hidden_num2=8; %第二層隱藏層神經(jīng)元個(gè)數(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ù)lenchrom=ones(1,num_all); %種群總長度limit=[-1*ones(num_all,1) 1*ones(num_all,1)]; %初始參數(shù)給定范圍input_data=inputdata_train_regular;output_data=outputdata_train_regular;%GA變量存儲(chǔ)設(shè)置trace=ones(iter_num+1,2);initial_chrom=ones(group_num,num_all);fitness_group=ones(group_num,1);%% GA種群初始化for i=1:group_numinitial=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(1,:)=[avgfitness bestfitness]; %記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度%% 迭代過程input_chrom=initial_chrom;titlestr=('GA迭代中,請(qǐng)稍等......');kk=waitbar(0,titlestr);set(kk,'Position',[210 250 270 56.2500])% 開始迭代for numa=1:iter_numstr=['GA迭代第',num2str(numa),'次中,請(qǐng)稍等......',num2str(round(numa/iter_num*100)),'%'];waitbar(numa/iter_num,kk,str); %GA迭代進(jìn)度條% 選擇[new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num); %把表現(xiàn)好的挑出來,還是和種群數(shù)量一樣% 交叉new_chrom=Cross(cross_pro,lenchrom,new_chrom,group_num,limit);% 變異new_chrom=Mutation(mutation_pro,lenchrom,new_chrom,group_num,numa,iter_num,limit);% 計(jì)算每次迭代后的適應(yīng)度for j=1:group_numsgroup=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<bestfitnessbestfitness=newbestfitness;bestchrom=new_chrom(newbestindex,:);endnew_chrom(worestindex,:)=bestchrom;new_fitness(worestindex)=bestfitness;avgfitness=sum(new_fitness)/group_num;trace(numa+1,:)=[avgfitness bestfitness]; %記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度endclose(kk)%% 繪制適應(yīng)度曲線圖并保存nplot1(trace,iter_num,NN);%% 構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu)net=newff(inputdata_train_regular,outputdata_train_regular,[hidden_num1 hidden_num2],{'tansig','tansig','purelin'},'trainlm');%% 初始化神經(jīng)網(wǎng)絡(luò)工具箱的網(wǎng)絡(luò)參數(shù)net.trainParam.lr=0.0055; %學(xué)習(xí)率net.trainParam.goal=0.000001; %目標(biāo)誤差net.trainParam.epochs=1; %最大訓(xùn)練次數(shù)為1轉(zhuǎn)化為人為干預(yù)訓(xùn)練net.trainParam.showWindow=0; %關(guān)閉BP訓(xùn)練窗口(提高運(yùn)行速度)net.performParam.regularization=0.01; %L2范數(shù)正則化net.divideParam.trainRatio=0.7; %用于訓(xùn)練的數(shù)據(jù)比例net.divideParam.valRatio=0.3; %用于驗(yàn)證過擬合的數(shù)據(jù)比例net.divideParam.testRatio=0; %注意要關(guān)掉測(cè)試數(shù)據(jù)占比%% 初始化人為操作參數(shù)num_iterations=50; %設(shè)置最大循環(huán)次數(shù)best_error=Inf; %初始化最小均方誤差max_count=6; %最大均方誤差增大次數(shù)count=0; %初始化均方誤差增大次數(shù)best_net=[]; %初始化最優(yōu)網(wǎng)絡(luò)模型mse_list_train=[]; %初始化訓(xùn)練集均方誤差數(shù)組mse_list_test=[]; %初始化驗(yàn)證集均方誤差數(shù)組%% 調(diào)用神經(jīng)網(wǎng)絡(luò)工具箱輔助訓(xùn)練titlestr=('BP訓(xùn)練中,請(qǐng)稍等......');jj=waitbar(0,titlestr);set(jj,'Position',[965 250 270 56.2500])for ii=1:num_iterationsstr=['bp訓(xùn)練第',num2str(ii),'次中,請(qǐng)稍等......',num2str(round(ii/num_iterations*100)),'%'];waitbar(ii/num_iterations,jj,str); %BP訓(xùn)練進(jìn)度條%調(diào)用trainlm算法訓(xùn)練網(wǎng)絡(luò)[net,tr]=train(net,inputdata_train_regular,outputdata_train_regular);%預(yù)測(cè)并計(jì)算均方誤差GA_BP_train_regular=sim(net,inputdata_train_regular); %訓(xùn)練樣本的預(yù)測(cè)GA_BP_test_regular=sim(net,inputdata_test_regular); %測(cè)試樣本的預(yù)測(cè)mse_error_train=mse(GA_BP_train_regular,outputdata_train_regular);mse_error_test=mse(GA_BP_test_regular,outputdata_test_regular);% 判斷均方誤差是否增大if mse_error_test>best_errorcount=count+1;elsecount=1;end% 更新最優(yōu)網(wǎng)絡(luò)模型if mse_error_test<best_errorbest_error=mse_error_test;best_net=net;end% 將均方誤差加入數(shù)組mse_list_train=[mse_list_train mse_error_train];mse_list_test=[mse_list_test best_error];% 判斷是否終止循環(huán)if count>=max_countstr=['BP訓(xùn)練第',num2str(ii),'次中,請(qǐng)稍等......',num2str(round(ii/ii*100)),'%'];waitbar(ii/ii,jj,str);break;endendclose(jj)% 繪制均方誤差曲線圖o=nplot2(mse_list_train,mse_list_test,ii);%利用訓(xùn)練最好的網(wǎng)絡(luò)預(yù)測(cè)并反歸一化處理inputData_test_regular=mapminmax('apply',P,PS1);outputData_test_regular=mapminmax('apply',T,PS2);GA_BP_outdata=sim(best_net,inputData_test_regular);GA_BP_data=mapminmax('reverse',GA_BP_outdata,PS2);%計(jì)算每次實(shí)驗(yàn)誤差errors_nn=sum(sum(abs(GA_BP_outdata-outputData_test_regular)))/g;%% 存儲(chǔ)每次實(shí)驗(yàn)相關(guān)數(shù)據(jù)EMS_all(:,NN)=errors_nn; %存儲(chǔ)每次實(shí)驗(yàn)誤差test1(NN,:)=GA_BP_data(1,:);test2(NN,:)=GA_BP_data(2,:);test3(NN,:)=GA_BP_data(3,:);test4(NN,:)=GA_BP_data(4,:);%% 每次實(shí)驗(yàn)所耗時(shí)間存儲(chǔ)t2=datetime('now'); %每次實(shí)驗(yàn)結(jié)束的時(shí)間dur=t2-t1;Time_all=seconds(dur); %實(shí)驗(yàn)所耗時(shí)間TIME(:,NN)=Time_all; %存儲(chǔ)每次實(shí)驗(yàn)所耗時(shí)間time=sum(TIME); %實(shí)驗(yàn)總共所耗時(shí)間計(jì)算 end close(mm) view(net) %顯示網(wǎng)絡(luò)拓?fù)鋱D %% 實(shí)驗(yàn)結(jié)果整理 %GA-BP迭代優(yōu)化擇優(yōu) [m,n]=min(EMS_all); %索引最小誤差的實(shí)驗(yàn)次數(shù) GA_BP_data=[test1(n,:);test2(n,:);test3(n,:);test4(n,:)]; % 繪制曲線圖 [j,k,l,o,p]=nplot3(EMS_all,x,GA_BP_data,T); % 繪制結(jié)果提示窗口 message=msgBox(num_iter_all,time,n,m); %% fitness函數(shù) function fitness_value=fitness(input_chrom,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data) %該函數(shù)用來計(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)元的偏執(zhí) %網(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)); %需與main函數(shù)中激活函數(shù)相同 A2=tansig(W2*A1+repmat(B2,1,n)); %需與main函數(shù)中激活函數(shù)相同 A3=purelin(W3*A2+repmat(B3,1,n)); error=sum(sum(abs(output_data-A3)))/length(output_data); fitness_value=error; %誤差即為適應(yīng)度 end %% select函數(shù) function [new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num) % 用輪盤賭在原來的函數(shù)里選擇 % fitness_group 種群信息 % group_num 種群規(guī)模 % newgroup 選擇后的新種群 %求適應(yīng)度值倒數(shù) fitness1=fitness_group; %個(gè)體適應(yīng)度值 %個(gè)體選擇概率 sumfitness=sum(fitness1); sumf=fitness1./sumfitness; %采用輪盤賭法選擇新個(gè)體 index=ones(1,group_num); for i=1:group_num %group_num為種群數(shù)pick=rand;while pick==0pick=rand;endfor j=1:group_numpick=pick-sumf(j);if pick<0index(1,i)=j;break;endend end %新種群 new_chrom=input_chrom(index,:); new_fitness=fitness_group(index); end %% Cross函數(shù) function new_chrom=Cross(cross_pro,lenchrom,input_chrom,group_num,limit) %隨機(jī)選擇兩個(gè)染色體位置交叉 % cross_pro 交叉概率 % lenchrom 染色體的長度,即所有參數(shù)的數(shù)量 % input_chrom 染色體群,經(jīng)過選擇遺傳下來的表現(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);endindex=ceil(pick.*group_num); % 交叉概率決定是否進(jìn)行交叉pick=rand;while pick==0pick=rand;endif pick>cross_procontinue;end% 隨機(jī)選擇交叉位pick=rand;while pick==0pick=rand;endflag=0;while flag==0pos=ceil(pick*length(lenchrom)); %隨機(jī)選擇進(jìn)行交叉的位置,即選擇第幾個(gè)變量進(jìn)行交叉,注意:兩個(gè)染色體交叉的位置相同pick=rand; %交叉開始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é)束%判斷交叉后的兩條染色體可不可行l(wèi)imit1=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==0flag1=0;elseflag1=1;endf21=isempty(find(input_chrom(index(2),:)>limit1(2), 1));f22=isempty(find(input_chrom(index(2),:)<limit1(1), 1));if f21*f22==0flag2=0;elseflag2=1;endif flag1*flag2==0flag=0;elseflag=1;end %如果兩個(gè)染色體不是都可行,則重新交叉end end new_chrom=input_chrom; end %% Mutation函數(shù) function new_chrom=Mutation(mutation_pro,lenchrom,input_chrom,group_num,num,iter_num,limit) % 本函數(shù)完成變異操作 % mutation_pro 變異概率 % lenchrom 染色體長度 % input_chrom 輸入交叉過后的染色體 % 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==0pick=rand;endindex=ceil(pick*group_num);% 變異概率決定該輪循環(huán)是否進(jìn)行變異pick=rand;if pick>mutation_procontinue;endflag=0;while flag==0% 變異位置pick=rand;while pick==0pick=rand;endpos=ceil(pick*sum(lenchrom)); %隨機(jī)選擇了染色體變異的位置,即選擇了第pos個(gè)變量進(jìn)行變異pick=rand; %變異開始fg=(pick*(1-num/iter_num))^2;if pick>0.5input_chrom(index,pos)=input_chrom(index,pos)+(limit(pos,2)-input_chrom(index,pos))*fg;elseinput_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), 1));f2=isempty(find(input_chrom(index,:)<limit1(1), 1));if f1*f2==0flag=0;elseflag=1;endend end new_chrom=input_chrom; end %% nplot1函數(shù) function h=nplot1(trace,iter_num,NN) %該函數(shù)用來繪制GA適應(yīng)度迭代曲線圖 for hh=1h=figure(1);set(h,'Position',[180 510 560 420])[r ,~]=size(trace);plot((1:r)',trace(:,2),'b--');titlestr=['GA適應(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])drawnow update end end %% nplot2函數(shù) function o=nplot2(mse_list_train,mse_list_test,ii) for ss=1o=figure(2);set(o,'Position',[1180 510 560 420])plot(mse_list_train,'r',linewidth=1.5);hold onplot(mse_list_test,'b',linewidth=1.5);hold offxlabel('訓(xùn)練次數(shù)')ylabel('均方誤差')legend('訓(xùn)練樣本','測(cè)試樣本')titlestr=['BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練性能圖 終止次數(shù):',num2str(ii),'次'];title(titlestr);drawnow update; end end %% nplot3函數(shù) function [j,k,l,o,p]=nplot3(EMS_all,x,GA_BP_data,T,m,n) %該函數(shù)用來繪制GA-BP實(shí)驗(yàn)誤差曲線圖 j=figure('visible','on'); plot(EMS_all,'LineWidth',2) hold on plot(n,m,'ro','MarkerSize',20) hold on yy=linspace(0,round(max(EMS_all))); xx=n*ones(size(yy)); xx1=linspace(0,iter_num); yy1=m*ones(size(xx1)); plot(xx,yy,'k--',LineWidth=1) hold on plot(xx1,yy1,'k--',LineWidth=1) hold off xlabel('實(shí)驗(yàn)優(yōu)化次數(shù)') ylabel('誤差') titlestr=('GA-BP實(shí)驗(yàn)誤差曲線'); title(titlestr) %繪制目標(biāo)數(shù)據(jù)與預(yù)測(cè)數(shù)據(jù)曲線圖 k=figure; axy3=plot(x,T(1,:),'b-o','linewidth',1); hold on axy4=plot(x,GA_BP_data(1,:),'r--+','linewidth',1); xlabel('零部件加工刀具磨損樣本') ylabel('切削深度變化/mm') titlestr='GA-BP預(yù)測(cè)——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實(shí)數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)') grid on l=figure; axy3=plot(x,T(2,:),'b-o','linewidth',1); hold on axy4=plot(x,GA_BP_data(2,:),'r--+','linewidth',1); xlabel('零部件加工刀具磨損樣本') ylabel('切削力變化/N') titlestr='GA-BP預(yù)測(cè)——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實(shí)數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)') grid on o=figure; axy3=plot(x,T(3,:),'b-o','linewidth',1); hold on axy4=plot(x,GA_BP_data(3,:),'r--+','linewidth',1); xlabel('零部件加工刀具磨損樣本') ylabel('切削溫度變化/℃') titlestr='GA-BP預(yù)測(cè)——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實(shí)數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)') grid on p=figure; axy3=plot(x,T(4,:),'b-o','linewidth',1); hold on axy4=plot(x,GA_BP_data(4,:),'r--+','linewidth',1); xlabel('零部件加工刀具磨損樣本') ylabel('表面質(zhì)量變化/μm') titlestr='GA-BP預(yù)測(cè)——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實(shí)數(shù)據(jù)','預(yù)測(cè)數(shù)據(jù)') grid on end %% msgBox函數(shù) function message=msgBox(num_iter_all,time,n,m) %該函數(shù)用來顯示實(shí)驗(yàn)結(jié)果提示窗口 titlestr1=['實(shí)驗(yàn)',num2str(num_iter_all),'次','所耗時(shí)間:',num2str(time),' 秒']; titlestr2=['測(cè)試樣本最小誤差為: 第 ',num2str(n(1)),' 次的 ',num2str(m(1))]; disp({titlestr1 titlestr2}) message=msgbox({titlestr1 titlestr2},'BP模型預(yù)測(cè)結(jié)果'); % 文本居中 th = findall(0, 'Tag','MessageBox' ); boxPosition = get(message,'position'); textPosition = get(th, 'position'); set(th, 'position', [boxPosition(3).*0.5 textPosition(2) textPosition(3)]); set(th, 'HorizontalAlignment', 'center'); end實(shí)驗(yàn)結(jié)束的曲線圖如下:
?????????豐田800臥式加工中心操作與管理時(shí),刀具磨損的預(yù)測(cè)數(shù)據(jù)對(duì)比如下表(測(cè)試樣本為3、5、7,絕對(duì)誤差=丨真實(shí)數(shù)據(jù)-預(yù)測(cè)數(shù)據(jù)丨,相對(duì)誤差=絕對(duì)誤差/真實(shí)數(shù)據(jù)):
?就到這里啦
(表現(xiàn)刀具磨損程度的數(shù)學(xué)模型,需要加工操作經(jīng)驗(yàn)來合理地建立)
END
總結(jié)
以上是生活随笔為你收集整理的GA-BP模型的应用——刀具磨损程度预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金融风控相关的知识点
- 下一篇: inverted_dropout