BlaXuan 发表于 2022-5-26 15:07

智能优化算法

非凸优化问题,不同的初始搜索点可能导致不同的最优化结果,为此,引入遗传,粒子群,蚁群算法,模拟退火,见matlab全局优化工具箱。

遗传算法的基本思想是,在计算机上模拟生命进化机制而发展起来的一类新的最优化算法,一组初始值(种群)开始搜索,个体染色体,交叉变异,适者生存,进化出下一代,若干代后得到较优的解。

早期有名的是英国Sheffield大学和美国北卡罗拉纳州立大学开发的遗传算法工具箱GAOT。
具体遗传算法的基本原理,请参考:链接:https://pan.baidu.com/s/1gBOXi8C2cY807kj7HtIJPw?pwd=dp8g
提取码:dp8g
现在matlab内置了遗传算法工具箱函数ga().
为了测试算法性能好坏,有很多常用的测试函数。
一、一些测试函数
Rastrigin多峰函数:
https://www.zhihu.com/equation?tex=f%28x_1%2Cx_2%29%3D20%2B%28%5Cfrac%7Bx_1%7D%7B30%7D-1%29%5E2%2B%28%5Cfrac%7Bx_2%7D%7B30%7D-1%29%5E2-10%5Bcos+2%5Cpi%28%5Cfrac%7Bx_2%7D%7B20%7D%29-1%5D%5C%5C++-100%5Cleq+x_1%2Cx_2%5Cleq+100
每种算法运行100次,观察全局最优解成功率,耗时。
f =@(x)20+(x(1)/30-1)^2+(x(2)/20-1)^2-10*(cos(2*pi*(x(1)/30-1))+cos(2*pi*(x(2)/20-1)))
% 目标函数
A=[];B=[];Aeq=[];Beq=[];xm=-100*ones(2,1);xM=-xm;
F1=[];F2=[];F3=[];F4=[];
tic

fori=1:100 ,x0=100*rand(2,1);
    %运行各种求解函数
    %=ga(f,2,A,B,Aeq,Beq,xm,xM);F1=;
   
    % =patternsearch(f,x0,A,B,Aeq,Beq,xm,xM);F2=; %模式搜索算法
   =particleswarm(f,2,xm,xM);F3=;%粒子群算法
   %=simulannealbnd(f,x0,xm,xM);F4=; %模拟退火算法
end
toc

%i1=length(find(F1(:,3)<1e-5))
%i2=length(find(F2(:,3)<1e-5))
i3=length(find(F3(:,3)<1e-5))
%i4=length(find(F4(:,3)<1e-5))
历时 2.613878 秒。
i3 =
    91
Griewangk基准函数

https://www.zhihu.com/equation?tex=min_x%281%2B%5Csum_%7Bi%3D1%7D%5En%5Cfrac%7Bx_i%5E2%7D%7B4000%7D-%5Cprod_%7Bi%3D1%7D%5Encos%5Cfrac%7Bx_i%7D%7B%5Csqrt%7Bi%7D%7D%29%2Cx_i%5Cin%5B-600%2C600%5D
n=50; %50个决策变量
f=@(x) 1+sum(x.^2/4000)-prod(cos(x(:)./'));

A=[];B=[];Aeq=[];Beq=[];xm=-600*ones(n,1);xM=-xm;

F1=[];F2=[];F3=[];F4=[];
tic
for i =1:100,x0=600*rand(n,1)
   
    %=ga(f,n,A,B,Aeq,Beq,xm,xM);F1=;
    % =patternsearch(f,x0,A,B,Aeq,Beq,xm,xM);F2=;
   =particleswarm(f,n,xm,xM);F3=;
   %=simulannealbnd(f,x0,xm,xM);F4=;
   
end
toc

% 最优解为全0
max(F4), max(F3)
x0 = 50×1
102 ×
   5.547331193932800    5.546182297849493    1.649474442043273    2.105319982951498    1.815931194221220    5.366023347889880    0.817771290062103    1.435676993119801    5.094395427436423    5.590798241034586 ....
toc
历时 41.009270 秒。
% 最优解为全0
max(F4), max(F3)
ans =       [ ]
ans =   0.794034887857747
二、复杂的非线性规划求解


非线性约束条件:
function =c5mcpl(x)
ceq=[];
A1=sqrt((745*x(4)/x(2)/x(3))^2+16.91e6); B1=0.1*x(6)^3;
A2=sqrt((745*x(5)/x(2)/x(3))^2+157.5e6); B2=0.1*x(7)^3;
c=[-x(1)*x(2)^2*x(3)+27; -x(1)*x(2)^2*x(3)^2+397.5;
   -x(2)*x(6)^4*x(3)/x(4)^3+1.93; A1/B1-1100;
   -x(2)*x(7)^4*x(3)/x(5)^3+1.93; A2/B2-850;
   x(2)*x(3)-40; -x(1)/x(2)+5; x(1)/x(2)-12;
   1.5*x(6)+1.9-x(4); 1.1*x(7)+1.9-x(5)];目标函数:
https://www.zhihu.com/equation?tex=min+%5C%2C+f%28x%29+%3D0.7854%2Ax%281%29%2Ax%282%29%5E2%2A%283.3333%2Ax%283%29%5E2%2B%5C%5C14.9334%2Ax%283%29-43.0934%29-1.508%2Ax%281%29%2A%28x%286%29%5E2%2Bx%287%29%5E2%29%5C%5C%2B7.477%2A%28x%286%29%5E3%2Bx%287%29%5E3%29%2B0.7854%2A%28x%284%29%2Ax%286%29%5E2%2Bx%285%29%2Ax%287%29%5E2%29%3B+
A=[];B=[];Aeq=[];Beq=[];
f=@(x)0.7854*x(1)*x(2)^2*(3.3333*x(3)^2+14.9334*x(3)-43.0934)-1.508*x(1)*(x(6)^2+x(7)^2)+7.477*(x(6)^3+x(7)^3)+0.7854*(x(4)*x(6)^2+x(5)*x(7)^2);

xm=;
xM=;
=fmincon(f,rand(7,1),A,B,Aeq,Beq,xm,xM,@c5mcpl)



%遗传算法
xx=[]
for i=1:7
    tic
    =ga(f,7,A,B,Aeq,Beq,xm,xM,@c5mcpl)
    toc
    if flag==1
      xx=;
   
    end
endx =
   3.500000006636445    0.700000000308885   17.000000011596669    7.300000215221772    7.715320005042021    3.350540957339616    5.286654468041168....
f0 =
   2.994424479756736e+03
x =
   3.499302564458190   0.70000000000000017.000015701674656   7.300039720659272   7.714365598727852   3.350550631870008   5.286672859785385 ...

x0 =
   2.994146799506752e+03
flag =
   1
历时 12.028220 秒。
三、神经网络拟合




神经网络分类器

   做一个简单的评三好生的神经网络模型,假如如果手头上有一些三好生和非三好生的成绩数据,我们可 以把这些样本“喂”给模型,经过一段时间后,网络就可以学习到三个权 值参数的信息。下一步我们就可以用这个学到的网络来评判是否三好生。
上述单个神经元就是一个简单的二分类器,复杂的多层神经网络具有更强大的能力。
下面是一个神经网络拟合问题,有一个通用逼近定理,任何非线性函数都可以用一个神经网络来拟合!
x = 0:0.05:10;
y=0.12*exp(-0.213*x)+0.54*exp(-0.17*x).*sin(1.23*x);

net=fitnet(5);
net.trainParam.epochs=1000;
=train(net,x,y);

plotperform(b)
x0=;
y0=0.12*exp(-0.213*x0)+0.54*exp(-0.17*x0).*sin(1.23*x0);
y1=net(x0)
plot(x,y,'o',x0,y0,x0,y1,':');




再一个例子
clc
clear
close
x = ;% 样本属性值
t = ; %样本的目标标签值
net = feedforwardnet(10);%定义神经网络一层隐含层,且神经元数量为10个
net = configure(net,x,t); %利用构建的网络,对网络各参数进行初始化赋值,形成初始网络
y1 = net(x);%初始网络对输入进行计算后的输出
net = train(net,x,t); %对国建的神经网络进行训练,输出训练完成的网络
y2 = net(x); %训练完成后的网络对输入进行计算后的输出
plot(x,t,'o',x,y1,'^',x,y2,'*') %对三者数据进行绘图
legend('原始数据值','初始网络预测值','训练后网络预测值')

再来一个例子:
基于BP网络的性别识别.以年级中男生女生的身高、体重为输入,经过一定数量的样本训练后,可以较好地识别出新样本的性别,其中男生172人,女生88人.具体数据见Excel文件(链接:https://pan.baidu.com/s/1ymdiklg96oqjv1VTbXN7CA?pwd=53m7
提取码:53m7)


MATLAB程序如下(Annfeedforwardne.m文件):

% 使用feedforwardnet函数实现性别识别
% 清理
clear,%clc
rng(2)
% 读入数据
xlsfile='student.xls';
=getdata(xlsfile);
% 划分数据
=divide(data,label);
% 创建网络
net=feedforwardnet(10);
net = configure(net,traind',trainl);   %配置内存
%%对网络进行训练
net.trainParam.epochs = 50;%执行步长为100
net.trainFcn='trainbfg'; %net.trainFcn='trainlm';
% 训练网络
net=train(net,traind',trainl);
%显示相关参数
disp('网络训练后的第一层权值为:')
w1=net.iw{1}
disp('网络训练后的第一层阈值:')
b1=net.b{1}
disp('网络训练后的第二层权值为:')
w2=net.Lw{2}
disp('网络训练后的第二层阈值:')
b2=net.b{2}
% 测试
test_out=sim(net,testd');
test_out(test_out>=0.5)=1;
test_out(test_out<0.5)=0;
rate=sum(test_out==testl)/length(testl);
fprintf('正确率为:\n %f \n', rate*100);
% 显示训练样本
train_m = traind(trainl==1,:); train_m=train_m';
train_f = traind(trainl==0,:);   train_f=train_f';
plot(train_m(1,:),train_m(2,:),'bo'); hold on;
plot(train_f(1,:),train_f(2,:),'r*');
xlabel('身高'); ylabel('体重')
title('训练样本分布'); legend('男生','女生');


上述的程序调用了两个子函数getdata.m和divide.m,代码分别如下

function =getdata(xlsfile)
% =getdata('student.xls')
[~,label]=xlsread(xlsfile,1,'B2:B261');
=xlsread(xlsfile,'C2:C261');
=xlsread(xlsfile,'D2:D261');
data=;
la=zeros(size(label));
for i=1:length(la)
   if (label{i}== '男'), la(i)=1; end
end
label=la;
divide函数用来切分数据集

function =divide(data,label)
%=getdata('student.xls')
% 由于男女数量不平衡, 各取50个进行训练
train_m=50;
train_f=50;
% 男女分开
m_data=data(label==1,:);
f_data=data(label==0,:);
%男生
num_m=length(m_data); % 男生的个数
r=randperm(num_m); %随机重排,将次序打乱
traind(1:train_m,:)=m_data(r(1:train_m),:); %取重排后的前50个数据作为训练集
testd(1:num_m-train_m,:)= m_data(r(train_m+1:num_m),:); %剩下的作为测试集
%女生
num_f=length(f_data); % 女生的个数
r=randperm(num_f); %随机重排,将次序打乱
traind(train_m+1:train_m+train_f,:)=f_data(r(1:train_f),:); %取重排后的前50个数据作为训练集
testd(num_m-train_m+1:num_m-train_m+num_f-train_f,:)=f_data(r(train_f+1:num_f),:); %剩下的作为测试集
% 赋值
trainl=zeros(1,train_m+train_f);
trainl(1:train_m)=1; %训练集男生标签
testl=zeros(1,num_m+num_f-train_m-train_f);
testl(1:num_m-train_m)=1; %测试集男生标签



在命令窗口运行主程序Annfeedforwardne.m,得到如下结果:网络训练后的第一层权值为:

网络训练后的第一层权值为:
w1 =1.44384888928607         -4.18480952233056
         -4.33919912055087         0.632849922164154
          2.56917426428233          -3.6616977002294
         -4.37558716146066         0.154215752790577
         -4.14674567916552          1.47049114306135
          2.38084918313696          3.72395757368039
          3.87011928395929         -2.00542980488546
          3.10704311155857          3.13142109567917
          1.24557237983525          4.16342141795573
      -0.312953669730938          4.39953644030905
网络训练后的第一层阈值:
b1 =    -4.42690688218674
          3.50023161084736
         -2.38057299939936
          1.57200608238244
         0.436599110305998
         0.488400223473961
          1.73291164233109
          2.49821971654938
          3.54323725248674
         -4.44494054118496
网络训练后的第二层权值为:
w2 =
列 1 至 2
          0.47286420806718         0.213000940379026
列 3 至 4
         0.874887831457051         0.328594076460372
列 5 至 6
      0.0788161552387914         0.737741580290311
列 7 至 8
      -0.586672749039528         0.742739660738542
列 9 至 10
      0.0121736093785839      -0.553913077494564网络训练后的第二层阈值:
b2 =
         0.695861355403992正确率为:
93.125000



训练样本分布图

四、google神经网络在线测试平台演示


PlayGround 是一个在线演示、实验的神经网络平台,是一个入门神经 网络非常直观的网站。这个图形化平台非常强大,将神经网络的训练过程 直接可视化。网址是:http://playground.tensorflow.org/。 PlayGround 页面如图所示,主要分为 DATA(数据),FEATURES(特征), HIDDEN LAYERS(隐含层),OUTPUT(输出层)


图中点被标记为两种颜色,深色为正(电脑屏幕颜色为蓝色),浅色为负 (电脑屏幕颜色为黄色),表示要区分的两类数据。 上图我们选了最复杂的螺旋型数据来分类,输入为待分类点的横,纵 坐标两个特征,隐藏层有两个,层之间的连线颜色代表权重正负,层与层 之间的连线粗细表示权重的绝对值大小,训练开始后,我们可以把鼠标放 在线上查看权值,也可以点击修改


我们设置,两个隐藏层,用 sigmoid 激活函数,训练的批大 小为 10,学习率为 0.01,在训练集上的损失是 0.363,在测试集上的损失为 0.468,我们可以调整特征的个数,迭代次数、学习速率、激活函数、隐藏 层数和隐藏节点的个数等超参数,动态地观察分类效果。PlayGround 还提 供了非常灵活的数据配置,可以调节噪声、训练数据和测试数据的比例和 Batch size 的大小。 一般来讲,隐含层越多,衍生出的特征类型也就越丰富,对于分类的 效果也会越好,但不是越多越好,层数多了训练的速度会变慢,同时收敛 的效果不一定会更好,层数和特征的个数太多,会造成训练越困难。
练习:
1、假设某最小化问题的目标函数为(非线性规划问题):
https://www.zhihu.com/equation?tex=f%28x%29%3D0.7854x_1x_2%5E2%283.3333x_3%5E2%2B14.93334x_3-43.0934%29-1.508x_1%28x_6%5E2%2Bx_7%5E2%29%5C%5C+%2B7.477%28x_6%5E3%2Bx_7%5E3%29%2B0.7854%28x_4x_6%5E2%2Bx_5x_7%5E2%29
相应的约束条件为:
https://www.zhihu.com/equation?tex=x_1x_2%5E2%5Cgeq27%2Cx_1x_2%5E2x_3%5E2%5Cgeq397.5%2C+%5C%5Cx_2x_3x_6%5E4%2Fx_4%5E3%5Cgeq1.93%2Cx_2x_3x_7%5E4%2Fx_5%5E3%5Cgeq1.93

https://www.zhihu.com/equation?tex=A_1%2FB_1%5Cleq1100%2CA_1%3D%5Csqrt%7B%5B745x_4%2F%28x_2x_3%29%5D%5E2%2B16.91%2A10%5E6%7D%2CB_1%3D0.1x_6%5E3

https://www.zhihu.com/equation?tex=A_2%2FB_2%5Cleq850%2CA_2%3D%5Csqrt%7B%5B745x_5%2F%28x_2x_3%29%5D%5E2%2B157.5%2A10%5E6%7D%2CB_2%3D0.1x_7%5E3
https://www.zhihu.com/equation?tex=x_2x_3%5Cleq40%2C5%5Cleq+x_1%2Fx_2%5Cleq12%2C1.5x_6%2B1.9%5Cleq+x_4%2C1.1x_7%2B1.9%5Cleq+x_5%5C%5C+2.6%5Cleq+x_1%5Cleq+3.6%2C0.7%5Cleq+x_2%5Cleq0.8%2C17%5Cleq+x_3%5Cleq+28%2C%5C%5C+7.3%5Cleq+x_4%2Cx_5%5Cleq+8.3%2C2.9%5Cleq+x_6%5Cleq+3.9%2C5%5Cleq+x_7%5Cleq+5.5
目标函数
f=@(x)0.7854*x(1)*x(2)^2*(3.3333*x(3)^2+14.9334*x(3)-43.0934) ...
-1.508*x(1)*(x(6)^2+x(7)^2)+7.477*(x(6)^3+x(7)^3)...
+0.7854*(x(4)*x(6)^2+x(5)*x(7)^2); 约束
function =c5mcpl(x)
ceq=[]; %没有等式约束,故返回空矩阵
A1=sqrt((745*x(4)/x(2)/x(3))^2+16.91e6); B1=0.1*x(6)^3;
A2=sqrt((745*x(5)/x(2)/x(3))^2+157.5e6); B2=0.1*x(7)^3;
c=[-x(1)*x(2)^2*x(3)+27; -x(1)*x(2)^2*x(3)^2+397.5;
   -x(2)*x(6)^4*x(3)/x(4)^3+1.93; A1/B1-1100;
   -x(2)*x(7)^4*x(3)/x(5)^3+1.93; A2/B2-850;
   x(2)*x(3)-40; -x(1)/x(2)+5; x(1)/x(2)-12;
   1.5*x(6)+1.9-x(4); 1.1*x(7)+1.9-x(5)];直接优化求解:
A=[];B=[];Aeq=[];Beq=[];
xm=;%下界
xM=; %上界
=fmincon(f,rand(7,1),A,B,Aeq,Beq,xm,xM,@c5mcpl)结果大约为2994.
采用遗传算法求解
f=@(x)0.7854*x(1)*x(2)^2*(3.3333*x(3)^2+14.9334*x(3)-43.0934)...
-1.508*x(1)*(x(6)^2+x(7)^2)+7.477*(x(6)^3+x(7)^3)...
+0.7854*(x(4)*x(6)^2+x(5)*x(7)^2);继续
A=[];B=[];Aeq=[];Beq=[];xx=[];
xm=;%下界
xM=; %上界

for i =1:7
   tic , =ga(f,7,A,B,Aeq,Beq,xm,xM,@c5mcpl),toc
   if flag == 1 ,xx=; end
end
参考文献:
1、薛定宇,《MATLAB最优化计算》,清华大学出版社,2020年1月。
2、刘鹏,程显毅,李纪聪,周世祥,《人工智能概论》,清华大学出版社出版时间:2021年7月。
3、马昌凤,柯艺芬,谢亚君 著,《机器学习算法(MATLAB版)》, 科学出版社,2021年6月。
matlab机器学习参考
页: [1]
查看完整版本: 智能优化算法