目录
智能优化算法
神经网络算法
通用神经网络工具箱函数
感知器matlab函数
线性神经网络函数
BP神经网络
径向基神经网络函数
自组织神经网络函数
经典应用
遗传算法
程序设计
经典应用-旅行商问题TSP问题
免疫算法
模拟退火算法
经典应用
智能优化算法
神经网络算法
生物神经网络功能的启发而产生的,基于数学统计学类型的学习算法得以优化。目前已有近40种人工神经网络模型,其中包括反传网络、感知器、自组织映射、Hopfield网络、玻尔兹曼机、适应谐振理论等。
神经网络模型可以分为:
①前向网络(网络中无反馈,用有向无环路图表示)
实现信号从输入空间到输出空间的转换,信息处理能力来自简单非线性函数的多次复合。
反传网络是一种典型的前向网络。
②反馈网络(用无向的完备图表示,Hopfield网络、玻尔兹曼机)
matlab的神经网络工具箱中包括多种神经网络函数:①感知器 ②线性网络 ③BP网络 ④径向基函数网络 ⑤竞争型神经网络 ⑥自组织网络和学习向量量化网络 ⑦反馈网络
通用神经网络工具箱函数
(1)神经网络初始化函数init
%%%%%%建立一个感知器神经网络%%%%%%%%%
clear all
clc
x = [0 1 0 1; 0 0 1 1];
t = [0 0 0 1];
net = perceptron;
net = configure(net,x,t);
net.iw{1,1}
net.b{1}
%%%%%%训练所建立的神经网络%%%%%%
net = train(net,x,t);
net.iw{1,1}
net.b{1}
%%%%%%初始化训练后的感知器神经网络%%%%%
net = init(net);
net.iw{1,1}
net.b{1}
net=initlay(NET)
net=initwb(NET,i)
[net,tr,Y,E] = train(NET,X,T,Xi,Ai)
configure - Configure network inputs and outputs to best match input and target data
This MATLAB function takes input data x and target data t, and configures the network’s inputs and outputs to match.net = configure(net,x,t)
(2)单层神经网络初始化函数initlay()
(3)神经网络单层权值和偏值初始化函数initwb()
(4)神经网络训练函数train()
(5)神经网络仿真函数
sim函数可以监测已经完成训练的神经网络的性能
(6)神经网络输入的和函数netsum
netsum是通过某一层的加权输入和偏值相加作为该层的输入
(7)权值点积函数dotprod
神经网络输入向量和权值的点积可以得到加权输入
(8)网络输入的积函数netprod
将神经网络某一层加权输入和偏值相乘的结果作为该层的输入
感知器matlab函数
(1)绘制样本点函数plotpv
(2)绘制分类线函数plotpc
(3)感知学习函数learnp
(4)平均绝对误差性能函数mae
调整网络的权值和偏差,是的神经网络的平均误差和最小
clear all
clc
net = perceptron;
net = configure(net,0,0) %使用configure函数创建一个神经网络
p = [-10 -5 0 5 10];
t = [0 0 1 1 1];
y = net(p);
e = t-y;
perf = mae(e) %mae求解平均绝对误差
线性神经网络函数
(1)误差平方和性能函数sse
(2)计算线性层最大稳定学习速率函数maxlinlr
(3)网络学习函数learnwh(最小方差准则学习函数)
(4)线性神经网络设计函数newlind(可以设计出可直接使用的线性网络)
clear all
clc
P = {1 2 1 3 3 2};
Pi = {1 3}; %Pi为神经元起始状态参数
T = {5.0 6.1 4.0 6.0 6.9 8.0};
net = newlind(P,T,Pi); %根据设置的参数,建立线性神经网络
Y = sim(net,P,Pi) %检测上一步建立的神经网络性能
BP神经网络
(1)均方误差性能函数mse(使得网络输出均方误差和性能最小)
(2)误差平方和函数sumsqr(计算输入向量误差平方和)
(3)计算误差曲面函数errsurf(计算单输入神经元输出误差平方和)
(4)绘制误差曲面图plotes
(5)在误差曲面上绘制权值和偏值的位置plotep
径向基神经网络函数
(1)计算向量间的距离函数dist
(2)径向基传输函数radbas(作用于输入矩阵每一个输入量)
(3)建立将相继神经网络函数newrb
clear all
clc
X=0:0.1:2; %神经网络输入值
T=cos(X*pi); %神经网络目标值
%%%%%绘出此函数上的采样点%%%%
figure(1)
plot(X,T,'+');
title('待逼近的函数样本点');
xlabel('输入值');
ylabel('目标值');
%%%%%建立网络并仿真%%%%%%%%%
n=-4:0.1:4;
a1=radbas(n);
a2=radbas(n-1.5);
a3=radbas(n+2);
a=a1+1*a2+0.5*a3;
figure(2);
plot(n,a1,n,a2,n,a3,n,a,'x');
title('径向基函数的加权和');
xlabel('输入值');
ylabel('输出值');
%径向基函数网络隐含层中每个神经元的权重和阀值指定了相应的径向基函数的位置和宽度。
%每一个线性输出神经元都由这些径向基函数的加权和组成
net=newrb(X,T,0.03,2); %设置平方和误差参数为0.03
X1=0:0.01:2;
y=sim(net,X1);
figure(3);
plot(X1,y,X,T,'+');
title('仿真结果');
xlabel('输入');
ylabel('网络输出及目标输出');
(4)建立严格径向基神经网络函数newrbe
(5)建立广义回归径向基神经网络函数newgrnn
一般来说spread(径向基函数扩展速度,默认值为1)的取值越小,神经网络逼近效果越好,但逼近过程越不平滑。
(6)数据索引向量变换为向量组函数ind2vec
ind指的是n为数据索引行向量,vec为m行n列的稀疏矩阵。
(7)向量组变换为数据索引向量函数vec2ind
(8)概率径向基函数newpnn(适合解决模式分类问题)
自组织神经网络函数
经典应用
隐含层神经元数目越多,则BP神经网络逼近非线性函数的能力越强。
频率参数k、隐含层神经元数目n都会影响逼近效果。
clear all
clc
k=2;
p=[-1:.05:8];
t=1+sin(k*pi/2*p);
plot(p,t,'-');
title('要逼近的非线性函数');
xlabel('时间');
ylabel('非线性函数');
n=5;
net = newff(minmax(p),[n,1],{'tansig' 'purelin'},'trainlm');
%对于初始网络,可以应用sim()函数观察网络输出。
y1=sim(net,p);
figure;
plot(p,t,'-',p,y1,':')
title('未训练网络的输出结果');
xlabel('时间');
ylabel('仿真输出--原函数-');
net.trainParam.epochs=200; %网络训练时间设置为200
net.trainParam.goal=0.2; %网络训练精度设置为0.2
net=train(net,p,t); %开始训练网络;
遗传算法
遗传算法是模拟自然界生物进化机制的一种算法,优胜劣汰,寻优过程中有用的进行保留,无用的进行去除,最终找出最优解。
选择(selection)、交叉(crossover)、变异(mutation)。个体遗传算子的操作都是在随机扰动的情况下进行的,因此群体中个体向最优解迁移的规则是随机的。遗传操作进行的是高效有向的搜索,而不是一般随机搜索方法使用的无向搜索。
遗传算子
①选择
选择算子有时又称为再生算子(reproduction operator)
②交叉
自然界生物进化的核心是生物遗传基因的重组(加上变异),遗传算法的核心是遗传操作的交叉算子。
③变异
实值变异和二进制变异。
变异算子操作的基本步骤如下:1)对群中所有个体以实现设定的变异概率判断是否进行变异 2)对进行变异的个体随机选择变异位进行变异
变异率一般取很小的值,在0.001~0.1之间。
④终止条件
当最优个体的适应度达到给定的阈值,或者最优个体的适应度和群体适应度不再上升,或者迭代次数达到预设的代数时,算法终止。预设的代数一般设置为100~500代。
程序设计
clear all
clc
popsize=20; %群体大小
chromlength=10; %字符串长度(个体长度)
pc=0.7; %交叉概率
pm=0.005; %变异概率
pop=initpop(popsize,chromlength); %随机产生初始群体
for i=1:20 %20为迭代次数
[objvalue]=calobjvalue(pop); %计算目标函数
fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度
[newpop]=selection(pop,fitvalue); %复制
[newpop]=crossover(pop,pc); %交叉
[newpop]=mutation(pop,pc); %变异
[bestindividual,bestfit]=best(pop,fitvalue); %求出群体中适应值最大的个体及其适应值
y(i)=max(bestfit);
n(i)=i;
pop5=bestindividual;
x(i)=decodechrom(pop5,1,chromlength)*10/1023;
pop=newpop;
end
fplot('9*sin(5*x)+8*cos(4*x)',[0 15])
hold on
plot(x,y,'r*')
hold off
经典应用-旅行商问题TSP问题
给定n个城市,寻找一条遍历所有城市且只访问一次的路径,并保证总路径最短。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%主函数%%%%%%%%%%%%%
clear;
clc;
%%%%%%%%%%%%%输入参数%%%%%%%%%%%%
N=10; %%城市的个数
M=20; %%种群的个数
C=100; %%迭代次数
C_old=C;
m=2; %%适应值归一化淘汰加速指数
Pc=0.4; %%交叉概率
Pmutation=0.2; %%变异概率
%%%%%%%%%生成城市的坐标%%%%%%%%%%%%%%%%
pos=randn(N,2);
%%%%%%%%生成城市之间距离矩阵%%%%%%%%%%%%
D=zeros(N,N);
for i=1:N
for j=i+1:N
dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
D(i,j)=dis^(0.5);
D(j,i)=D(i,j);
end
end
%%%%%%%%生成初始群体%%%%%%%%%%%%%%%%%%%%
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);
end
%%%%%%%%随机选择一个种群%%%%%%%%%%%%%%%%
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2) ,'k.');
xlabel('横轴')
ylabel('纵轴')
title('随机产生的种群图')
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R);
xlabel('横轴')
ylabel('纵轴')
title('随机生成种群中城市路径情况')
axis([-3 3 -3 3]);
%%%%%%%%初始化种群及其适应函数%%%%%%%%%%%%
fitness=zeros(M,1);
len=zeros(M,1);
for i=1:M
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
R=popm(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
fitness=fitness/sum(fitness);
distance_min=zeros(C+1,1); %%各次迭代的最小的种群的距离
while C>=0
fprintf('迭代第%d次\n',C);
%%%%选择操作%%%%
nn=0;
for i=1:size(popm,1)
len_1(i,1)=myLength(D,popm(i,:));
jc=rand*0.3;
for j=1:size(popm,1)
if fitness(j,1)>=jc
nn=nn+1;
popm_sel(nn,:)=popm(j,:);
break;
end
end
end
%%%%每次选择都保存最优的种群%%%%
popm_sel=popm_sel(1:nn,:);
[len_m len_index]=min(len_1);
popm_sel=[popm_sel;popm(len_index,:)];
%%%%交叉操作%%%%
nnper=randperm(nn);
A=popm_sel(nnper(1),:);
B=popm_sel(nnper(2),:);
for i=1:nn*Pc
[A,B]=cross(A,B);
popm_sel(nnper(1),:)=A;
popm_sel(nnper(2),:)=B;
end
%%%%变异操作%%%%
for i=1:nn
pick=rand;
while pick==0
pick=rand;
end
if pick<=Pmutation
popm_sel(i,:)=Mutation(popm_sel(i,:));
end
end
%%%%求适应度函数%%%%
NN=size(popm_sel,1);
len=zeros(NN,1);
for i=1:NN
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len);
minlen=min(len);
distance_min(C+1,1)=minlen;
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
fprintf('minlen=%d\n',minlen);
R=popm_sel(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
popm=[];
popm=popm_sel;
C=C-1;
%pause(1);
end
figure(3)
plot_route(pos,R);
xlabel('横轴')
ylabel('纵轴')
title('优化后的种群中城市路径情况')
axis([-3 3 -3 3]);
免疫算法
免疫算法模拟了生物免疫系统的基本机制。免疫算法解决了遗传算法的早熟收敛问题,提高了算法的效率。
模拟退火算法
模拟退火算法和初始值无关,算法求得的解与初始状态S无关。模拟退火算法具有渐进收敛性和并行性。模拟退火算法在搜索过程中具有突跳的能力,可以有效避免搜索陷入局部极小解。
经典应用
粒子群优化算法(PSO)属于进化算法的一种,和模拟退火算法相似,从随机解出发,通过迭代寻找最优解。
function y=lamdaFunc(x)
y=0;
for i=1:5
y=y+(i+2)/(((x(i)-1)^2)+0.5);
end
y=1/(0.7+y);
[xm,fv] = PSO_lamda(@lamdaFunc,50,2,2,0.5,100,5)