赞
踩
基本思想
遗传算法有三个基本操作:选择(Selection)、交叉(Crossover)和变异(Mutation)。
基本步骤

本文的工具箱为gaot
重点函数
optimtool
optimtool:MATLAB自带的工具箱函数
在MATLAB里命令行里输入optimtool,会弹出如图

在Solver里有很多选项,包括非线性,遗传算法等各种优化
gaot工具箱的函数
initializega:初始化
ga
ga输入参数

ga输出参数

首先我们需要将工具箱gaot添加进路径。工具箱和算例代码后面我会给出百度云链接。
算例1:一元函数优化
第一步:
%% I. 清空环境变量
clear all
clc
第二步:定义问题
我们需要找到
x = 0:0.01:9;
y = x + 10sin(5x)+7cos(4x);的最大值
%% II. 绘制函数曲线
figure
plot(x, y)
xlabel('自变量')
ylabel('因变量')
title('y = x + 10*sin(5*x) + 7*cos(4*x)')
第三步:产生初始种群
种群规模:50,范围是[0-9]
fitness.m 适应度函数如下,因为本文是求最大值,所有适应度函数和目标函数一致
function [sol, fitnessVal] = fitness(sol, options)
x = sol(1);
fitnessVal = x + 10sin(5x)+7cos(4x);
end
如果是求最小值,用1除以最大适应度函数,或者-1*最大适应度函数
function [sol, fitnessVal] = fitness(sol, options)
x = sol(1);
fitnessVal = 1/(x + 10sin(5x)+7cos(4x));
end
%% III. 初始化种群
initPop = initializega(50,[0 9],'fitness');
得到的initPop维度50*2
50表示有50个个体

第一列表示个体x,第二列表示适应度函数值

第四步:优化
%% IV. 遗传算法优化
[x endPop bpop trace] = ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,...
'normGeomSelect',0.08,'arithXover',2,'nonUnifMutation',[2 25 3]);
第五步:结果绘图
%% V. 输出最优解并绘制最优点
x
hold on
plot (endPop(:,1),endPop(:,2),'ro')
%% VI. 绘制迭代进化曲线
figure(2)
plot(trace(:,1),trace(:,3),'b:')
hold on
plot(trace(:,1),trace(:,2),'r-')
xlabel('Generation'); ylabel('Fittness');
legend('Mean Fitness', 'Best Fitness')
25代
算例2:BP神经网络初始权值和阈值优化

gadecod.m
function[W1,B1,W2,B2,val]=gadecod(x)
global p
global t
global R
global S2
global S1
% 前R*S1个编码为W1
for i=1:S1
for k=1:R
W1(i,k)=x(R*(i-1)+k);
end
end
% 接着的S1*S2个编码(即第R*S1个后的编码)为W2
for i=1:S2
for k=1:S1
W2(i,k)=x(S1*(i-1)+k+R*S1);
end
end
% 接着的S1个编码(即第R*SI+SI*S2个后的编码)为B1
for i=1:S1
B1(i,1)=x((R*S1+S1*S2)+i);
end
%接着的S2个编码(即第R*SI+SI*S2+S1个后的编码)为B2
for i=1:S2
B2(i,1)=x((R*S1+S1*S2+S1)+i);
end
% 计算S1与S2层的输出
A1=tansig(W1*p,B1);
A2=purelin(W2*A1,B2);
% 计算误差平方和
SE=sumsqr(t-A2);
% 遗传算法的适应值
val=1/SE;
gabpEval.m
function[sol,val]=gabpEval(sol,options)
global S
for i=1:S
x(i)=sol(i);
end;
[W1,B1,W2,B2,val]=gadecod(x);
ga_bp.m
%% I. 清除环境变量
clear all
clc
%% II. 声明全局变量
global p % 训练集输入数据
global t % 训练集输出数据
global R % 输入神经元个数
global S2 % 输出神经元个数
global S1 % 隐层神经元个数
global S % 编码长度
S1 = 10;
%% III. 导入数据
%%
% 1. 训练数据
p = [0.01 0.01 0.00 0.90 0.05 0.00;
0.00 0.00 0.00 0.40 0.50 0.00;
0.80 0.00 0.10 0.00 0.00 0.00;
0.00 0.20 0.10 0.00 0.00 0.10]';
t = [1.00 0.00 0.00 0.00;
0.00 1.00 0.00 0.00;
0.00 0.00 1.00 0.00;
0.00 0.00 0.00 1.00]';
%%
% 2. 测试数据
P_test = [0.05 0 0.9 0.12 0.02 0.02;
0 0 0.9 0.05 0.05 0.05;
0.01 0.02 0.45 0.22 0.04 0.06;
0 0 0.4 0.5 0.1 0;
0 0.1 0 0 0 0]';
%% IV. BP神经网络
%%
% 1. 网络创建
net = newff(minmax(p),[S1,4],{'tansig','purelin'},'trainlm');
%%
% 2. 设置训练参数
net.trainParam.show = 10;
net.trainParam.epochs = 2000;
net.trainParam.goal = 1.0e-3;
net.trainParam.lr = 0.1;
%%
% 3. 网络训练
[net,tr] = train(net,p,t);
%%
% 4. 仿真测试
s_bp = sim(net,P_test) % BP神经网络的仿真结果
%% V. GA-BP神经网络
R = size(p,1);
S2 = size(t,1);
S = R*S1 + S1*S2 + S1 + S2;
aa = ones(S,1)*[-1,1];
%% VI. 遗传算法优化
%%
% 1. 初始化种群
popu = 50; % 种群规模
initPpp = initializega(popu,aa,'gabpEval',[],[1e-6 1]); % 初始化种群
%%
% 2. 迭代优化
gen = 100; % 遗传代数
% 调用GAOT工具箱,其中目标函数定义为gabpEval
[x,endPop,bPop,trace] = ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
%%
% 3. 绘均方误差变化曲线
figure(1)
plot(trace(:,1),1./trace(:,3),'r-');
hold on
plot(trace(:,1),1./trace(:,2),'b-');
xlabel('Generation');
ylabel('Sum-Squared Error');
%%
% 4. 绘制适应度函数变化
figure(2)
plot(trace(:,1),trace(:,3),'r-');
hold on
plot(trace(:,1),trace(:,2),'b-');
xlabel('Generation');
ylabel('Fittness');
%% VII. 解码最优解并赋值
%%
% 1. 解码最优解
[W1,B1,W2,B2,val] = gadecod(x);
%%
% 2. 赋值给神经网络
net.IW{1,1} = W1;
net.LW{2,1} = W2;
net.b{1} = B1;
net.b{2} = B2;
%% VIII. 利用新的权值和阈值进行训练
net = train(net,p,t);
%% IX. 仿真测试
s_ga = sim(net,P_test) %遗传优化后的仿真结果
代码和goat见百度云
链接:https://pan.baidu.com/s/1exuNVSaGp_GUAH3py3M14g
提取码:6jp1
复制这段内容后打开百度网盘手机App,操作更方便哦
MATLAB 和遗传算法非我所长,所以我也云里雾里,这篇为我所学笔记。
等我那天开窍啦,我就完全懂啦。


Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。