找回密码
 立即注册
查看: 337|回复: 0

智能优化算法

[复制链接]
发表于 2022-5-26 15:07 | 显示全部楼层 |阅读模式
非凸优化问题,不同的初始搜索点可能导致不同的最优化结果,为此,引入遗传,粒子群,蚁群算法,模拟退火,见matlab全局优化工具箱。

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

早期有名的是英国Sheffield大学和美国北卡罗拉纳州立大学开发的遗传算法工具箱GAOT。
具体遗传算法的基本原理,请参考:链接:https://pan.baidu.com/s/1gBOXi8C2cY807kj7HtIJPw?pwd=dp8g
提取码:dp8g
现在matlab内置了遗传算法工具箱函数ga().
为了测试算法性能好坏,有很多常用的测试函数。
一、一些测试函数
Rastrigin多峰函数:

每种算法运行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

for  i=1:100 ,x0=100*rand(2,1);
    %运行各种求解函数
    %[x,f0]=ga(f,2,A,B,Aeq,Beq,xm,xM);F1=[F1;x,f0];
   
    % [x,f0]=patternsearch(f,x0,A,B,Aeq,Beq,xm,xM);F2=[F2;x',f0]; %模式搜索算法
     [x,f0]=particleswarm(f,2,xm,xM);F3=[F3;x,f0];  %粒子群算法
     %[x,f0]=simulannealbnd(f,x0,xm,xM);F4=[F4;x',f0]; %模拟退火算法
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基准函数


n=50; %50个决策变量
f=@(x) 1+sum(x.^2/4000)-prod(cos(x(:)./[1:n]'));

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)
   
    %[x,f0]=ga(f,n,A,B,Aeq,Beq,xm,xM);F1=[F1;f0];
    % [x,f0]=patternsearch(f,x0,A,B,Aeq,Beq,xm,xM);F2=[F2;f0];
     [x,f0]=particleswarm(f,n,xm,xM);F3=[F3;f0];
     %[x,f0]=simulannealbnd(f,x0,xm,xM);F4=[F4;f0];
   
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 [c,ceq]=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=[];
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=[2.6,0.7,17,7.3,7.3,2.9,5];
xM=[3.6,0.8,28,8.3,8.3,3.9,5.5];
[x,f0]=fmincon(f,rand(7,1),A,B,Aeq,Beq,xm,xM,@c5mcpl)



%遗传算法
xx=[]
for i=1:7
    tic
    [x,x0,flag]=ga(f,7,A,B,Aeq,Beq,xm,xM,@c5mcpl)
    toc
    if flag==1
        xx=[xx;x f0];
   
    end
endx =
   3.500000006636445    0.700000000308885   17.000000011596669    7.300000215221772    7.715320005042021    3.350540957339616    5.286654468041168  ....
f0 =
     2.994424479756736e+03
x =
   3.499302564458190   0.700000000000000  17.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;
[net,b]=train(net,x,y);

plotperform(b)
x0=[0:0.1:10];
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 = [0 1 2 3 4 5 6 7 8];  % 样本属性值
t = [0 0.84 0.91 0.14 -0.77 -0.96 -0.28 0.66 0.99]; %样本的目标标签值
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';
[data,label]=getdata(xlsfile);
% 划分数据
[traind,trainl,testd,testl]=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 [data,label]=getdata(xlsfile)
% [data,label]=getdata('student.xls')
[~,label]=xlsread(xlsfile,1,'B2:B261');
[height,~]=xlsread(xlsfile,'C2:C261');
[weight,~]=xlsread(xlsfile,'D2:D261');
data=[height,weight];
la=zeros(size(label));
for i=1:length(la)
   if (label{i}== '男'), la(i)=1; end
end
label=la;
divide函数用来切分数据集

function [traind,trainl,testd,testl]=divide(data,label)
%[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、假设某最小化问题的目标函数为(非线性规划问题):

相应的约束条件为:






目标函数
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 [c,ceq]=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=[2.6,0.7,17,7.3,2.9,5];%下界
xM=[3.6,0.8,28,8.3,8.3,3.9,5.5]; %上界
[x,f0]=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=[2.6,0.7,17,7.3,2.9,5];%下界
xM=[3.6,0.8,28,8.3,8.3,3.9,5.5]; %上界

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 10:07 , Processed in 0.092848 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表