一、问题简述
本文以遗传算法求解30维变量函数的最小值问题举例
式中,,且。
二、遗传算法概述
遗传算法(genetic algorithm, GA)是一种仿效生物界中“物竞天择,适者生存”演化法则的进化算法。将问题参数编码为染色体,利用迭代的方法进行选择、交叉和变异等运算来更新染色体,最终生成符合优化目标的染色体。
三、谢菲尔德遗传算法工具箱的安装
本文代码运行之前须先安装谢菲尔德遗传算法工具箱,安装包下载地址:
链接:https://pan.baidu.com/s/1i-1Jh7MWMnCrcwPu-7Fw8g
提取码:1234
安装方法
1. 解压安装包,得到gatbx文件夹
2. 将gatbx-toolbox文件夹复制到matlab安装目录下的toolbox文件夹
3. 打开Matlab,依次点击主页->设置路径->添加文件夹
4. 点击添加文件夹,找到复制到toolbox文件夹的gatbx-toolbox文件夹,点击选择文件夹
5. 点击保存,然后就可以看到设置路径下出现的gatbx文件夹
6. 安装检测,在命令行窗口输入:v = ver("gatbx")
四、代码实现
clc
clear
close all
%-------------------------------------------------------------------------%
% 多元函数遗传算法优化
% fun为目标函数
% lb为自变量取值下限
% ub为自变量取值上限
% flag为0时计算最小值
% flag为1时计算最大值
%-------------------------------------------------------------------------%
%% 目标函数参数
lb = zeros(1,30)-100; % 自变量取值下限
ub = zeros(1,30)+100; % 自变量取值上限
N = length(lb); % 变量维数
flag = 0;
%% 遗传算法参数
NIND = 40; % 种群大小
MAXGEN = 5000; % 最大遗传代数
PRECI = 20; % 个体长度
GGAP = 0.95; % 代沟
px = 0.7; % 交叉概率
pm = 0.01; % 变异概率
trace = zeros(N+1,MAXGEN); % 寻优结果的初始值
% 区域描述器
FieldD = [zeros(1,N)+PRECI;
lb;
ub;
zeros(1,N)+1;
zeros(1,N);
zeros(1,N)+1;
zeros(1,N)+1];
Chrom = crtbp(NIND,PRECI*N); % 创建任意离散随机种群
%% 优化
gen = 0; % 代计数器
Val = bs2rv(Chrom,FieldD);
S = size(Val);
ObjV = zeros(1,S(1))';
for i = 1:S(1)
ObjV(i) = fun(Val(i,:));
end
while gen < MAXGEN
% 分配适应度值
if flag == 0
FitnV = ranking(ObjV);
else
FitnV = ranking(-ObjV);
end
SelCh = select('sus',Chrom,FitnV,GGAP); % 选择
SelCh = recombin('xovsp',SelCh,px); % 重组
SelCh = mut(SelCh,pm); % 变异
Val = bs2rv(SelCh,FieldD); % 子代个体的十进制转换
S = size(Val);
ObjVSel = zeros(1,S(1))';
for i = 1:S(1)
ObjVSel(i) = fun(Val(i,:));
end
[Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);% 插入子代到父代
Val = bs2rv(Chrom,FieldD);
gen = gen + 1; % 代计数器增加
% 获取每代的最优解及其序号,Y为最优解,I为个体的序号
if flag == 0
[Y,I] = min(ObjV);
else
[Y,I] = max(ObjV);
end
trace(1:end-1,gen) = Val(I,:); % 记录每代的最优值
trace(end,gen) = Y; % 记录每代的最优值
end
%% 画进化图
figure(1)
plot(1:MAXGEN,trace(end,:))
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
disp('最优解为')
disp(trace(end,end))
disp('最优解时的决策变量为')
disp(trace(1:end-1,end)')
%% 目标函数
function f = fun(x)
tmpx = 0;
tempx = 0;
for i = 1:30
for j = 1:i
tmpx = tmpx + x(j);
end
tmpx = tmpx^2;
tempx = tmpx + tempx;
tmpx = 0;
end
f = tempx;
end
五、运行结果
程序执行最优解结果及最优值为:
迭代过程中对函数值的绘图结果为: