GA-BP模型的应用——刀具磨损程度预测

最近,将自己所学的GA-BP模型介绍给了同学

虽然水论文,但理论上是实实在在合理的

将此案例分享一下

他的论文题目是《丰田800卧式加工中心的操作与管理》

在通读参考文献的论文后

总结出国内外研究现状

        国内外的丰田800卧式加工中心研究主要集中在设备的操作、维护、加工工艺、自动化控制和管理等方面。其中,智能化控制和管理是当前研究的热点之一。随着智能制造的发展和需求的不断增加,提高设备的智能化程度和自动化程度将成为未来的发展趋势。因此,进一步研究丰田800卧式加工中心的智能化控制和管理技术,将对提高设备的生产效率、降低成本、提高竞争力具有重要意义。

 根据目的和意义

“提高设备的生产效率、降低成本、提高竞争力”

我给他建议了GA-BP模型预测机床操作时刀具磨损程度的创新点

具体如下:

(1)结合遗传算法和BP神经网络:论文将遗传算法和BP神经网络结合起来,以优化BP神经网络的性能,从而实现更准确的刀具磨损预测,提高丰田800卧式加工中心的加工效率和降低成本。

(2)自适应学习率:论文使用遗传算法来优化BP神经网络的学习率,以自适应地调整神经网络的参数,提高其训练和预测的效率和准确性。

(3)多目标优化:论文将刀具磨损预测作为一个多目标优化问题,通过遗传算法寻找最优解,以达到最小化刀具磨损和最大化加工效率的目标。

(4)数据集优化:论文使用遗传算法来优化刀具磨损预测所需的数据集,以提高预测准确性和泛化能力。

(5)与实际生产环境结合:论文可能结合丰田800卧式加工中心的实际生产环境,通过遗传算法和BP神经网络来预测刀具磨损,优化加工流程和管理决策,提高加工效率和产品质量。

 向他了解了机床操作时

影响刀具磨损的因素会有哪些

包括刀具磨损程度由哪些特质来体现

总结出特征因素如下:

影响特征因素:切割速度、切割力、切削深度、切割时间、材料硬度、切削液、刀具材料

 

预测特征:切削深度变化、切削力变化、切削温度变化、表面质量变化

 预测特征有4个

可以根据机床操作经验对四个预测特征分析

运用四个预测特征

建立出适应刀具磨损度的数学模型

来评判刀具磨损的程度

根据磨损程度可以合理调整影响特征数据

在保证加工完好的前提下

确保刀具磨损程度的降低

从而降低整个加工成本

数据如下:

e0319d7a50fd478aaf811e1841b7ddb6.png

 源代码如下:

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_all
    str=['实验运行第',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_num
        initial=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_num
        str=['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_num
            sgroup=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<bestfitness
            bestfitness=newbestfitness;
            bestchrom=new_chrom(newbestindex,:);
        end
        new_chrom(worestindex,:)=bestchrom;
        new_fitness(worestindex)=bestfitness;
        avgfitness=sum(new_fitness)/group_num;
        trace(numa+1,:)=[avgfitness bestfitness];  %记录每一代进化中最好的适应度和平均适应度
    end
    close(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_iterations
        str=['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_error
            count=count+1;
        else
            count=1;
        end
        % 更新最优网络模型
        if mse_error_test<best_error
            best_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_count
            str=['BP训练第',num2str(ii),'次中,请稍等......',num2str(round(ii/ii*100)),'%'];
            waitbar(ii/ii,jj,str);
            break;
        end
    end
    close(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==0
        pick=rand;
    end
    for j=1:group_num
        pick=pick-sumf(j);
        if pick<0
            index(1,i)=j;
            break;
        end
    end
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);
    end
    index=ceil(pick.*group_num);  % 交叉概率决定是否进行交叉
    pick=rand;
    while pick==0
        pick=rand;
    end
    if pick>cross_pro
        continue;
    end
    % 随机选择交叉位
    pick=rand;
    while pick==0
        pick=rand;
    end
    flag=0;
    while flag==0
        pos=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==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    %如果两个染色体不是都可行,则重新交叉
    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==0
        pick=rand;
    end
    index=ceil(pick*group_num);
    % 变异概率决定该轮循环是否进行变异
    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));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
        pick=rand; %变异开始
        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   %变异结束

        limit1=mean(limit);
        f1=isempty(find(input_chrom(index,:)>limit1(2), 1));
        f2=isempty(find(input_chrom(index,:)<limit1(1), 1));
        if f1*f2==0
            flag=0;
        else
            flag=1;
        end
    end
end
new_chrom=input_chrom;
end
%% nplot1函数
function h=nplot1(trace,iter_num,NN)
%该函数用来绘制GA适应度迭代曲线图
for hh=1
    h=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=1
    o=figure(2);
    set(o,'Position',[1180 510 560 420])
    plot(mse_list_train,'r',linewidth=1.5);
    hold on
    plot(mse_list_test,'b',linewidth=1.5);
    hold off
    xlabel('训练次数')
    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

实验结束的曲线图如下:

306f7dd742e649448a903f191906f76b.png

554893c482774be48fca2143f8f96653.png

cfffad8e0e884b29b0597e8265e17461.png

f6243c54553e4e2c90cc25c2cc4bccc1.png

7e0f2f5939da44678021486de3323288.png

         丰田800卧式加工中心操作与管理时,刀具磨损的预测数据对比如下表(测试样本为3、5、7,绝对误差=丨真实数据-预测数据丨,相对误差=绝对误差/真实数据):

039333225c444685972a9e189470e43b.png

0459a12fd95d4377b71fc22c93180e9f.png

8250dc0511f74caab7ea52a5499b4d8d.png

71aa520f422a4497ae4cc186cb9bc322.png

 就到这里啦

(表现刀具磨损程度的数学模型,需要加工操作经验来合理地建立)

END

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
GA-PSO-BP预测模型是一种基于遗传算法、粒子群算法和BP神经网络算法相结合的预测模型。其主要思想是利用遗传算法和粒子群算法优化BP神经网络的权重和阈值,从而提高预测模型的精度和鲁棒性。 Matlab是一种常用的科学计算软件,对于GA-PSO-BP预测模型的构建与优化,也可使用Matlab来实现代码编写。具体实现步骤为: 1. 准备训练数据集和测试数据集,并将其导入Matlab中。 2. 定义BP神经网络的输入层、隐含层和输出层的神经元个数,并初始化权重和阈值。 3. 定义适应度函数,即评估当前BP网络预测结果的精度的函数。 4. 使用遗传算法和粒子群算法对BP网络的权重和阈值进行优化,更新神经网络模型。 5. 使用得到的优化BP网络进行训练和测试,得到预测结果,并评估预测模型的精度和鲁棒性。 下面是一个简单的GA-PSO-BP预测模型Matlab代码示例: ```matlab %定义输入层、隐含层、输出层的神经元个数 input_layer_num = 4; hidden_layer_num = 8; output_layer_num = 1; %初始化BP网络的权重和阈值 w1 = rand(input_layer_num, hidden_layer_num); w2 = rand(hidden_layer_num, output_layer_num); b1 = rand(1, hidden_layer_num); b2 = rand(1, output_layer_num); %导入训练数据集和测试数据集 train_data = load('train_data.txt'); test_data = load('test_data.txt'); %定义适应度函数 function f = fitness_function(x) %计算BP网络的输出 [y, ~, ~] = bpnn(x, w1, w2, b1, b2, train_data(:, 1:end-1)); %计算预测误差 error = train_data(:, end) - y'; %计算适应度 f = 1 / mean(error.^2); end %使用遗传算法和粒子群算法优化BP网络的权重和阈值 options = gaoptimset('Display', 'iter'); [x, fval] = ga(@(x) -fitness_function(x), input_layer_num*hidden_layer_num + hidden_layer_num*output_layer_num + hidden_layer_num + output_layer_num, [], [], [], [], [], [], [], options); %更新BP网络模型 [~, w1, w2, b1, b2] = bpnn(x, w1, w2, b1, b2, train_data(:, 1:end-1)); %使用得到的优化BP网络进行测试 [y, ~, ~] = bpnn(x, w1, w2, b1, b2, test_data(:, 1:end-1)); %计算预测误差 error = test_data(:, end) - y'; %输出预测结果和误差 disp(y') disp(error') %评估预测模型的精度和鲁棒性 mse = mean(error.^2); rmse = sqrt(mse); mape = mean(abs(error./test_data(:, end))); disp(['MSE: ', num2str(mse)]); disp(['RMSE: ', num2str(rmse)]); disp(['MAPE: ', num2str(mape)]); ``` 以上是一个简单的GA-PSO-BP预测模型Matlab代码示例,可以根据实际需求进行更改和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴糖气泡Meanler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值