从今天起我想记录下我的学习历程,将成果总结起来,方便日后复习
关于MATLAB遗传算法的工具箱文件放在文章末尾需要的自取
首先,我先来简单说明下如何将工具箱添加到matlab中去
- 将工具箱文件夹复制到本地计算机中的工具箱目录下,路径为matlabroot\toolbox。其中matlabroot为matlab的安装目录
- 将工具箱所在的文件夹添加到MATLAB的搜索路径中,可以通过调用addpath命令来添加,如:
%取得工具箱完整路径 str = [matlabroot, '\toolbox\gatbx']; %添加到matlab的搜索路径中 addpath(str)
- 可以使用函数ver查看gatbx工具箱的名字、发行版本等
>> v = ver('gatbx') v = 包含以下字段的 struct: Name: 'Genetic Algorithm Toolbox' Version: '1.2' Release: '' Date: '15-Apr-94'
接下来就直接放个案例看看吧
简单一元函数的优化
遗传算法优化程序代码:
%% 简单一元函数优化
clc, clear
close all
%% 画出函数图
figure(1);
hold on;
lb = 1; ub = 2; %函数自变量范围[1,2]
ezplot('sin(10 * pi * X) / X', [lb, ub]');
xlabel('自变量/X')
ylabel('函数值/Y')
%% 定义遗传算法参数
nind = 40; %种群大小
maxgen = 20; %最大遗传迭代次数
preci = 20; %个体长度
ggap = 0.95; %代沟
px = 0.7; %交叉概率
pm = 0.01; %变异概率
trace = zeros(2, maxgen); %寻优结果初始化
fieldd = [preci; lb; ub; 1; 0; 1; 1]; %区域描述器
chrom = crtbp(nind, preci); %种群初始化(任意离散随机种群)
%% 优化
gen = 0; %代计数器
X = bs2rv(chrom, fieldd); %初始种群二进制转十进制
objv = sin(10 * pi * X) ./ X; %计算目标函数值
while gen < maxgen
fitnv = ranking(objv); %分配适应度值
selch = select('sus', chrom, fitnv, ggap); %选择
selch = recombin('xovsp', selch, px); %交叉
selch = mut(selch, pm); %变异
X = bs2rv(selch, fieldd); %子代个体十进制转换
objvsel = sin(10 * pi * X) ./ X;
[chrom, objv] = reins(chrom, selch, 1, 1, objv, objvsel); %重插入子代到父代,得到新种群
X = bs2rv(chrom, fieldd);
gen = gen + 1;
%获取每代的最优解及其序号,Y为最优解,i为个体的序号
[Y, i] = min(objv);
trace(1, gen) = X(i);
trace(2, gen) = Y;
end
plot(trace(1, :), trace(2, :), 'bo'); %绘制每一代的最优点
grid on;
plot(X, objv, 'b*');
%% 画进化图
figure(2);
plot(1 : maxgen, trace(2, :));
grid on;
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
best_y = trace(2, end);
best_x = trace(1, end);
fprintf(['最优解:\nX=', num2str(best_x), '\nY=', num2str(best_y), '\n'])
运行后会输出两张图,左图为目标函数图,图二为进化图
多元函数优化
遗传算法优化程序代码:
扫描二维码关注公众号,回复:
13524865 查看本文章
%% 多元函数优化
clc, clear
close all
%% 画出函数图
figure(1);
lbx = -2; ubx = 2;
lby = -2; uby = 2;
ezmesh('x*cos(2*pi*y) + y*sin(2*pi*x)', [lbx, ubx, lby, uby], 50);
hold on;
%% 定义遗传算法参数
nind = 40; %种群大小
maxgen = 50; %最大遗传迭代次数
preci = 20; %个体长度
ggap = 0.95; %代沟
px = 0.7; %交叉概率
pm = 0.01; %变异概率
trace = zeros(3, maxgen); %寻优结果初始化
fieldd = [preci preci;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %区域描述器
chrom = crtbp(nind, preci * 2); %种群初始化(任意离散随机种群)
%% 优化
gen = 0; %代计数器
XY = bs2rv(chrom, fieldd); %初始种群二进制转十进制
X = XY(:, 1); Y = XY(:, 2);
objv = X .* cos(2*pi*Y) + Y .* sin(2*pi*X); %计算目标函数值
while gen < maxgen
fitnv = ranking(-objv); %分配适应度值
selch = select('sus', chrom, fitnv, ggap); %选择
selch = recombin('xovsp', selch, px); %交叉
selch = mut(selch, pm); %变异
XY = bs2rv(selch, fieldd); %子代个体十进制转换
X = XY(:, 1); Y = XY(:, 2);
objvsel = X .* cos(2*pi*Y) + Y .* sin(2*pi*X);
[chrom, objv] = reins(chrom, selch, 1, 1, objv, objvsel); %重插入子代到父代,得到新种群
XY = bs2rv(chrom, fieldd);
gen = gen + 1;
%获取每代的最优解及其序号,Y为最优解,i为个体的序号
[Y, i] = max(objv);
trace(1:2, gen) = XY(i, :);
trace(3, gen) = Y;
end
plot3(trace(1, :), trace(2, :), trace(3, :), 'bo'); %绘制每一代的最优点
grid on;
plot3(XY(:, 1), XY(:, 2), objv, 'b*');
hold off
%% 画进化图
figure(2);
plot(1 : maxgen, trace(3, :));
grid on;
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
best_z = trace(3, end);
best_y = trace(2, end);
best_x = trace(1, end);
fprintf(['最优解:\nX=', num2str(best_x), '\nY=', num2str(best_y), '\nZ=', num2str(best_z), '\n'])
结果展示
遗传算法工具箱提供了一种求解非线性、多模型、多目标、等复杂系统优化问题的通用框架,它不依赖问题的具体领域,对问题的种类具有很强的鲁棒性,所以它广泛应用于各个科学领域。
第一次写,内容有些简短,主要还是受到我的室友刘锐的启发
链接:https://pan.baidu.com/s/1LLp1y2O1tMwSRcrKvF7EAA
提取码:ih1x
--来自百度网盘超级会员V3的分享