GA-BP模型的应用——刀具磨损程度预测
最近,將自己所學的GA-BP模型介紹給了同學
雖然水論文,但理論上是實實在在合理的
將此案例分享一下
他的論文題目是《豐田800臥式加工中心的操作與管理》
在通讀參考文獻的論文后
總結出國內外研究現狀
????????國內外的豐田800臥式加工中心研究主要集中在設備的操作、維護、加工工藝、自動化控制和管理等方面。其中,智能化控制和管理是當前研究的熱點之一。隨著智能制造的發展和需求的不斷增加,提高設備的智能化程度和自動化程度將成為未來的發展趨勢。因此,進一步研究豐田800臥式加工中心的智能化控制和管理技術,將對提高設備的生產效率、降低成本、提高競爭力具有重要意義。
?根據目的和意義
“提高設備的生產效率、降低成本、提高競爭力”
我給他建議了GA-BP模型預測機床操作時刀具磨損程度的創新點
具體如下:
(1)結合遺傳算法和BP神經網絡:論文將遺傳算法和BP神經網絡結合起來,以優化BP神經網絡的性能,從而實現更準確的刀具磨損預測,提高豐田800臥式加工中心的加工效率和降低成本。
(2)自適應學習率:論文使用遺傳算法來優化BP神經網絡的學習率,以自適應地調整神經網絡的參數,提高其訓練和預測的效率和準確性。
(3)多目標優化:論文將刀具磨損預測作為一個多目標優化問題,通過遺傳算法尋找最優解,以達到最小化刀具磨損和最大化加工效率的目標。
(4)數據集優化:論文使用遺傳算法來優化刀具磨損預測所需的數據集,以提高預測準確性和泛化能力。
(5)與實際生產環境結合:論文可能結合豐田800臥式加工中心的實際生產環境,通過遺傳算法和BP神經網絡來預測刀具磨損,優化加工流程和管理決策,提高加工效率和產品質量。
?向他了解了機床操作時
影響刀具磨損的因素會有哪些
包括刀具磨損程度由哪些特質來體現
總結出特征因素如下:
影響特征因素:切割速度、切割力、切削深度、切割時間、材料硬度、切削液、刀具材料
?
預測特征:切削深度變化、切削力變化、切削溫度變化、表面質量變化
?預測特征有4個
可以根據機床操作經驗對四個預測特征分析
運用四個預測特征
建立出適應刀具磨損度的數學模型
來評判刀具磨損的程度
根據磨損程度可以合理調整影響特征數據
在保證加工完好的前提下
確保刀具磨損程度的降低
從而降低整個加工成本
數據如下:
?源代碼如下:
clear; clc; close all; %% 實驗數據導入及整理 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]; %切割時間/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]; %表面質量變化/μm P=[data1;data2;data3;data4;data5;data6;data7]; %輸入數據 T=[data8;data9;data10;data11]; %輸出數據 x=1:1:15; %統計刀具磨損樣本數 %% 實驗參數初始化 group_num=30; %GA種群規模 cross_pro=0.7; %GA交叉概率 mutation_pro=0.04; %GA變異概率,相對來說比較小 iter_num=200; %GA迭代循環次數 num_iter_all=200; %GA-BP實驗次數 % 實驗變量存儲 TIME=ones(1,num_iter_all); EMS_all=ones(1,num_iter_all); test=ones(num_iter_all,length(T)); titlestr='實驗運行中,請稍等......'; mm=waitbar(0,titlestr); set(mm,'Position',[585 376.8750 270 56.2500]) for NN=1:num_iter_allstr=['實驗運行第',num2str(NN),'次中,請稍等......'];waitbar(NN/num_iter_all,mm,str); %實驗進度條t1=datetime('now'); %每次實驗開始的時間%% 輸入數據和輸出數據數據的比例劃分[~,g]=size(P);randIndex=randperm(g);k=ceil(0.80*g); %設置80%比例的數據作為訓練數據trainIndex=sort(randIndex(1:k)); %隨機選出特征數據的80%比例作為訓練數據(這里先選出數據的序號)testIndex=sort(randIndex(k+1:g)); %將剩下的數據作為檢驗數據(這里先選出數據的序號)inputData_train=P(:,trainIndex); %根據序號選出80%比例數據用于訓練的輸入inputData_test=P(:,testIndex); %根據序號選出20%比例數據用于驗證的輸入outputData_train=T(:,trainIndex); %根據序號選出80%比例數據用于訓練的輸出outputData_test=T(:,testIndex); %根據序號選出20%比例數據用于驗證的輸出%% 記錄數據比例劃分Index(NN,:)=testIndex;%% 實驗數據歸一化[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); %輸入特征個數output_num=size(outputData_train,1); %輸出特征個數hidden_num1=13; %第一層隱藏層神經元個數hidden_num2=8; %第二層隱藏層神經元個數num_all=input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+output_num; %節點總數lenchrom=ones(1,num_all); %種群總長度limit=[-1*ones(num_all,1) 1*ones(num_all,1)]; %初始參數給定范圍input_data=inputdata_train_regular;output_data=outputdata_train_regular;%GA變量存儲設置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)); %產生0-1的隨機數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);%計算初始適應度fitness_group(i)=fitness_value;end[bestfitness,bestindex]=min(fitness_group);bestchrom=initial_chrom(bestindex,:); %最好的染色體avgfitness=sum(fitness_group)/group_num; %染色體的平均適應度trace(1,:)=[avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度%% 迭代過程input_chrom=initial_chrom;titlestr=('GA迭代中,請稍等......');kk=waitbar(0,titlestr);set(kk,'Position',[210 250 270 56.2500])% 開始迭代for numa=1:iter_numstr=['GA迭代第',num2str(numa),'次中,請稍等......',num2str(round(numa/iter_num*100)),'%'];waitbar(numa/iter_num,kk,str); %GA迭代進度條% 選擇[new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num); %把表現好的挑出來,還是和種群數量一樣% 交叉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);% 計算每次迭代后的適應度for j=1:group_numsgroup=new_chrom(j,:); %個體new_fitness(j)=fitness(sgroup,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data);end%找到最小和最大適應度的染色體及它們在種群中的位置[newbestfitness,newbestindex]=min(new_fitness);[worestfitness,worestindex]=max(new_fitness);% 代替上一次進化中最好的染色體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]; %記錄每一代進化中最好的適應度和平均適應度endclose(kk)%% 繪制適應度曲線圖并保存nplot1(trace,iter_num,NN);%% 構建網絡結構net=newff(inputdata_train_regular,outputdata_train_regular,[hidden_num1 hidden_num2],{'tansig','tansig','purelin'},'trainlm');%% 初始化神經網絡工具箱的網絡參數net.trainParam.lr=0.0055; %學習率net.trainParam.goal=0.000001; %目標誤差net.trainParam.epochs=1; %最大訓練次數為1轉化為人為干預訓練net.trainParam.showWindow=0; %關閉BP訓練窗口(提高運行速度)net.performParam.regularization=0.01; %L2范數正則化net.divideParam.trainRatio=0.7; %用于訓練的數據比例net.divideParam.valRatio=0.3; %用于驗證過擬合的數據比例net.divideParam.testRatio=0; %注意要關掉測試數據占比%% 初始化人為操作參數num_iterations=50; %設置最大循環次數best_error=Inf; %初始化最小均方誤差max_count=6; %最大均方誤差增大次數count=0; %初始化均方誤差增大次數best_net=[]; %初始化最優網絡模型mse_list_train=[]; %初始化訓練集均方誤差數組mse_list_test=[]; %初始化驗證集均方誤差數組%% 調用神經網絡工具箱輔助訓練titlestr=('BP訓練中,請稍等......');jj=waitbar(0,titlestr);set(jj,'Position',[965 250 270 56.2500])for ii=1:num_iterationsstr=['bp訓練第',num2str(ii),'次中,請稍等......',num2str(round(ii/num_iterations*100)),'%'];waitbar(ii/num_iterations,jj,str); %BP訓練進度條%調用trainlm算法訓練網絡[net,tr]=train(net,inputdata_train_regular,outputdata_train_regular);%預測并計算均方誤差GA_BP_train_regular=sim(net,inputdata_train_regular); %訓練樣本的預測GA_BP_test_regular=sim(net,inputdata_test_regular); %測試樣本的預測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% 更新最優網絡模型if mse_error_test<best_errorbest_error=mse_error_test;best_net=net;end% 將均方誤差加入數組mse_list_train=[mse_list_train mse_error_train];mse_list_test=[mse_list_test best_error];% 判斷是否終止循環if count>=max_countstr=['BP訓練第',num2str(ii),'次中,請稍等......',num2str(round(ii/ii*100)),'%'];waitbar(ii/ii,jj,str);break;endendclose(jj)% 繪制均方誤差曲線圖o=nplot2(mse_list_train,mse_list_test,ii);%利用訓練最好的網絡預測并反歸一化處理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);%計算每次實驗誤差errors_nn=sum(sum(abs(GA_BP_outdata-outputData_test_regular)))/g;%% 存儲每次實驗相關數據EMS_all(:,NN)=errors_nn; %存儲每次實驗誤差test1(NN,:)=GA_BP_data(1,:);test2(NN,:)=GA_BP_data(2,:);test3(NN,:)=GA_BP_data(3,:);test4(NN,:)=GA_BP_data(4,:);%% 每次實驗所耗時間存儲t2=datetime('now'); %每次實驗結束的時間dur=t2-t1;Time_all=seconds(dur); %實驗所耗時間TIME(:,NN)=Time_all; %存儲每次實驗所耗時間time=sum(TIME); %實驗總共所耗時間計算 end close(mm) view(net) %顯示網絡拓撲圖 %% 實驗結果整理 %GA-BP迭代優化擇優 [m,n]=min(EMS_all); %索引最小誤差的實驗次數 GA_BP_data=[test1(n,:);test2(n,:);test3(n,:);test4(n,:)]; % 繪制曲線圖 [j,k,l,o,p]=nplot3(EMS_all,x,GA_BP_data,T); % 繪制結果提示窗口 message=msgBox(num_iter_all,time,n,m); %% fitness函數 function fitness_value=fitness(input_chrom,input_num,hidden_num1,hidden_num2,output_num,input_data,output_data) %該函數用來計算適應度值 %input_chrom 輸入種群 %input_num 輸入層的節點數,即數據特征數量 %output_num 隱含層節點數,隱藏層神經元的個數 %input_data 訓練輸入數據 %output_data 訓練輸出數據 %fitness_value 個體適應度值 w1=input_chrom(1:input_num*hidden_num1); %輸入層和第一層隱藏層之間的權重參數 B1=input_chrom(input_num*hidden_num1+1:input_num*hidden_num1+hidden_num1); %第一層隱藏層神經元的偏置 w2=input_chrom(input_num*hidden_num1+hidden_num1+1:input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2); %第一層隱藏層和第二層隱藏層之間的權重參數 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); %第二層隱藏層神經元的偏置 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);%第二層隱藏層和輸出層之間的權值參數 B3=input_chrom(input_num*hidden_num1+hidden_num1+hidden_num1*hidden_num2+hidden_num2+hidden_num2*output_num+1:end);%輸出層神經元的偏執 %網絡權值賦值 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函數中激活函數相同 A2=tansig(W2*A1+repmat(B2,1,n)); %需與main函數中激活函數相同 A3=purelin(W3*A2+repmat(B3,1,n)); error=sum(sum(abs(output_data-A3)))/length(output_data); fitness_value=error; %誤差即為適應度 end %% select函數 function [new_chrom,new_fitness]=select(input_chrom,fitness_group,group_num) % 用輪盤賭在原來的函數里選擇 % fitness_group 種群信息 % group_num 種群規模 % newgroup 選擇后的新種群 %求適應度值倒數 fitness1=fitness_group; %個體適應度值 %個體選擇概率 sumfitness=sum(fitness1); sumf=fitness1./sumfitness; %采用輪盤賭法選擇新個體 index=ones(1,group_num); for i=1:group_num %group_num為種群數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函數 function new_chrom=Cross(cross_pro,lenchrom,input_chrom,group_num,limit) %隨機選擇兩個染色體位置交叉 % cross_pro 交叉概率 % lenchrom 染色體的長度,即所有參數的數量 % input_chrom 染色體群,經過選擇遺傳下來的表現比較好的 % group_num 種群規模 % new_chrom 交叉后的染色體 for i=1:group_num %每一輪for循環中,可能會進行一次交叉操作,染色體是隨機選擇的,交叉位置也是隨機選擇的,%但該輪for循環中是否進行交叉操作則由交叉概率決定(continue控制)pick=rand(1,2); % 隨機選擇兩個染色體進行交叉while prod(pick)==0 %連乘pick=rand(1,2);endindex=ceil(pick.*group_num); % 交叉概率決定是否進行交叉pick=rand;while pick==0pick=rand;endif pick>cross_procontinue;end% 隨機選擇交叉位pick=rand;while pick==0pick=rand;endflag=0;while flag==0pos=ceil(pick*length(lenchrom)); %隨機選擇進行交叉的位置,即選擇第幾個變量進行交叉,注意:兩個染色體交叉的位置相同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; %交叉結束%判斷交叉后的兩條染色體可不可行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==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 %如果兩個染色體不是都可行,則重新交叉end end new_chrom=input_chrom; end %% Mutation函數 function new_chrom=Mutation(mutation_pro,lenchrom,input_chrom,group_num,num,iter_num,limit) % 本函數完成變異操作 % mutation_pro 變異概率 % lenchrom 染色體長度 % input_chrom 輸入交叉過后的染色體 % group_num 種群規模 % iter_num 最大迭代次數 % limit 每個個體的上限和下限 % num 當前迭代次數 % new_chrom 變異后的染色體 for i=1:group_num %每一輪for循環中,可能會進行一次變異操作,染色體是隨機選擇的,變異位置也是隨機選擇的,%但該輪for循環中是否進行變異操作則由變異概率決定(continue控制)% 隨機選擇一個染色體進行變異pick=rand;while pick==0pick=rand;endindex=ceil(pick*group_num);% 變異概率決定該輪循環是否進行變異pick=rand;if pick>mutation_procontinue;endflag=0;while flag==0% 變異位置pick=rand;while pick==0pick=rand;endpos=ceil(pick*sum(lenchrom)); %隨機選擇了染色體變異的位置,即選擇了第pos個變量進行變異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 %變異結束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函數 function h=nplot1(trace,iter_num,NN) %該函數用來繪制GA適應度迭代曲線圖 for hh=1h=figure(1);set(h,'Position',[180 510 560 420])[r ,~]=size(trace);plot((1:r)',trace(:,2),'b--');titlestr=['GA適應度曲線 ','終止代數=',num2str(iter_num),' 第',num2str(NN),'次實驗優化'];title(titlestr);xlabel('進化代數');ylabel('適應度');legend('最佳適應度');set(gca,'xlim',[0,iter_num])drawnow update end end %% nplot2函數 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('訓練次數')ylabel('均方誤差')legend('訓練樣本','測試樣本')titlestr=['BP神經網絡訓練性能圖 終止次數:',num2str(ii),'次'];title(titlestr);drawnow update; end end %% nplot3函數 function [j,k,l,o,p]=nplot3(EMS_all,x,GA_BP_data,T,m,n) %該函數用來繪制GA-BP實驗誤差曲線圖 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('實驗優化次數') ylabel('誤差') titlestr=('GA-BP實驗誤差曲線'); title(titlestr) %繪制目標數據與預測數據曲線圖 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預測——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實數據','預測數據') 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預測——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實數據','預測數據') 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預測——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實數據','預測數據') 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('表面質量變化/μm') titlestr='GA-BP預測——刀具磨損程度'; title(titlestr) set(gca,'xtick',1:1:15); legend([axy3(1),axy4(1)],'真實數據','預測數據') grid on end %% msgBox函數 function message=msgBox(num_iter_all,time,n,m) %該函數用來顯示實驗結果提示窗口 titlestr1=['實驗',num2str(num_iter_all),'次','所耗時間:',num2str(time),' 秒']; titlestr2=['測試樣本最小誤差為: 第 ',num2str(n(1)),' 次的 ',num2str(m(1))]; disp({titlestr1 titlestr2}) message=msgbox({titlestr1 titlestr2},'BP模型預測結果'); % 文本居中 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實驗結束的曲線圖如下:
?????????豐田800臥式加工中心操作與管理時,刀具磨損的預測數據對比如下表(測試樣本為3、5、7,絕對誤差=丨真實數據-預測數據丨,相對誤差=絕對誤差/真實數據):
?就到這里啦
(表現刀具磨損程度的數學模型,需要加工操作經驗來合理地建立)
END
總結
以上是生活随笔為你收集整理的GA-BP模型的应用——刀具磨损程度预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金融风控相关的知识点
- 下一篇: inverted_dropout