题目如下:用遗传算法求该Shubert函数在[-10,10]*[-10,10]上的最大值
![27514b3004e8e28bd916f97ae287fed5.png](https://i-blog.csdnimg.cn/blog_migrate/39141c9aba6c4e68ab7aa857ce1b4193.png)
采用谢菲尔德大学的遗传算法工具箱,matlab代码如下:
number_population=500;%种群规模:个体个数
number_generations=100;%最大遗传代数
number_variable=2;%变量个数
length_chromosome=20;%染色体长度,即每个个体由多少个字符编码
gap=0.9;%代沟:一个群体中有90%的个体会被选择、交叉、变异等,剩余的10%直接复制到下一代
sub=-10;%变量取值范围的下界
up=10;%变量取值范围的上界
select_code_gray=1;%是否使用格雷编码:1 使用、0 不使用
select_log=0;%是否使用对数标度:1 使用、0 不使用
trace=zeros(number_generations,2);%记录迭代轨迹:第一列记录某一代群体中的最优解,第二列记录某一代的平均值
fieldd=[rep([length_chromosome],[1,number_variable]);rep([sub;up],[1,number_variable]);rep([1-select_code_gray;select_log;1;1],[1 number_variable])];%区域描述器,
%rep函数:矩阵复制函数,如rep(A,[3,5])表示将A在竖直方向复制为原来的3倍,在水平方向复制为原来的5倍
%第一个参数表示编码长度的矩阵,第二个参数表示变量取值范围的矩阵,第三个参数表示是否使用格雷编码,以及是否使用
%对数标度,1;1表示变量的取值范围为闭区间,0表示为开区间
chromosome=crtbp(number_population,length_chromosome*number_variable);%初始化生成种群,第一个参数为个体数量,第二个参数为编码长度以及变量个数
%不同变量的编码拼接为一个向量
k_generations=0;%初始化代数
x=bs2rv(chromosome,fieldd);%编码向实数的解码
fun_v=fun_mutv(x(:,1),x(:,2));%计算不同表现型下的目标函数值
[tx,ty]=meshgrid(-10:0.01:10);
mesh(tx,ty,fun_mutv(tx,ty));
xlabel('x');
ylabel('y');
zlabel('z');
title('多元函数优化结果');
hold on
while k_generations<number_generations
fit_v=ranking(-opt_minmax*fun_v);%计算不同个体的适应度,参数为正则适应度随目标函数值的增大而减小
%参数为负则适应度随目标函数的增大而增大,所以这里采用负的参数
select_chromosome=select('rws',chromosome,fit_v,gap);%‘rws’为轮盘赌选择法,这里选择父代的90%进行选择、交叉、变异
select_chromosome=recombin('xovsp',select_chromosome);%‘xovsp'单点交叉
select_chromosome=mut(select_chromosome);%变异
x=bs2rv(select_chromosome,fieldd);%解码
fun_v_sel=fun_mutv(x(:,1),x(:,2));%计算子代的目标函数值
fit_v_sel=ranking(-fun_v_sel);%计算子代的适应度
[chromosome,fun_v]=reins(chromosome,select_chromosome,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%将父代中gap部分的子代以及
%非gap部分组合成一个新的种群,第一个参数为原始父代种群,第二个参数为经过选择的子代种群,第三个参数为生成的
%子代群体数量,第四个参数表示基于适应度的筛选方法,第五个参数为父代目标函数值,第六个参数为gap部分子代的目标函数值
[fmax,id]=max(fun_v);%f为fun_v中的最大值,id对应相应的行列数
x=bs2rv(chromosome(id,:),fieldd);%用标记后的最大值解码
plot3(x(1,1),x(1,2),fmax,'*');%画图
hold on
k_generations=k_generations+1;
trace(k_generations,1)=fmax;%记录每一代中最大的目标函数值
trace(k_generations,2)=mean(fun_v);%记录每一代目标函数值的平均水平
end
figure
plot(trace(:,1),'r-*');
hold on
plot(trace(:,2),'b-o');
legend('各子代种群最优解','各子代种群平均值');
xlabel('迭代次数');
ylabel('目标函数优化情况');
title('多元函数优化过程');
计算结果如下:
![6ee98ae461c1b9c72b001e3ead88e9f5.png](https://i-blog.csdnimg.cn/blog_migrate/997333e062f4dde682f3833201f0e358.jpeg)
![20a1b4f20338d63658d60870ab4c0d00.png](https://i-blog.csdnimg.cn/blog_migrate/6de62958f428424fb86f46e0fc731c25.jpeg)
![e912275b2beaf1d7e1b8d32829731bd1.png](https://i-blog.csdnimg.cn/blog_migrate/c8135845748b098c233478191b87e455.jpeg)
本人为初学者,若有不当之处欢迎大家斧正!