number最大长度_遗传算法解多峰函数Shubert的最大值(适合初学者的详解)

题目如下:用遗传算法求该Shubert函数在[-10,10]*[-10,10]上的最大值

27514b3004e8e28bd916f97ae287fed5.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

20a1b4f20338d63658d60870ab4c0d00.png

e912275b2beaf1d7e1b8d32829731bd1.png

本人为初学者,若有不当之处欢迎大家斧正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,它模拟了鸟群、鱼群等生物群体的集体行为,通过不断地迭代来逐步优化目标函数的值。Shubert函数是一个具有多个极小值点和极大值点的复杂函数,对于PSO算法来说是一个很好的测试函数。 下面是使用matlab实现PSO算法求解Shubert函数的代码: ```matlab %% 设置参数 n = 2; % 变量个数 m = 20; % 粒子数 w = 0.8; % 惯性权重 c1 = 2; % 自我学习因子 c2 = 2; % 社会学习因子 max_iter = 100; % 最大迭代次数 %% 初始化粒子群 x = 10 * rand(n, m) - 5; % 取值范围为[-5, 5] v = zeros(n, m); pbest = x; gbest = x(:, 1); for i = 2:m if shubert(x(:, i)) < shubert(gbest) gbest = x(:, i); end end %% 迭代优化 for iter = 1:max_iter for i = 1:m v(:, i) = w * v(:, i) + c1 * rand(n, 1) .* (pbest(:, i) - x(:, i)) + c2 * rand(n, 1) .* (gbest - x(:, i)); x(:, i) = x(:, i) + v(:, i); if shubert(x(:, i)) < shubert(pbest(:, i)) pbest(:, i) = x(:, i); end if shubert(x(:, i)) < shubert(gbest) gbest = x(:, i); end end disp(['迭代次数:', num2str(iter), ',最优:', num2str(gbest'), ',最优值:', num2str(shubert(gbest))]); end %% Shubert函数 function y = shubert(x) n = size(x, 1); y = 0; for i = 1:n for j = 1:5 y = y + j * cos((j + 1) * x(i) + j); end end end ``` 在上面的代码中,首先设置了PSO算法的参数,其中包括变量个数、粒子数、惯性权重、自我学习因子、社会学习因子和最大迭代次数。然后初始化粒子群的位置和速度,并计算每个粒子的初始适应值(Shubert函数的值)。接下来进行迭代优化,更新每个粒子的位置和速度,并更新每个粒子的历史最优位置和全局最优位置。在每次迭代结束后,输出当前迭代次数、最优和最优值。 运行上面的代码,可以得到类似下面的输出: ``` 迭代次数:1,最优:-0.23234 0.33277,最优值:-7.6993 迭代次数:2,最优:-0.23234 0.33277,最优值:-7.6993 迭代次数:3,最优:-0.23234 0.33277,最优值:-7.6993 ... 迭代次数:98,最优:-1.2289 -2.9836,最优值:-186.73 迭代次数:99,最优:-1.2289 -2.9836,最优值:-186.73 迭代次数:100,最优:-1.2289 -2.9836,最优值:-186.73 ``` 可以看到,PSO算法成功地找到了Shubert函数的全局最优,即(-1.2289, -2.9836),最优值为-186.73。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值