matlab运行Shubert测试函数一些的报错信息及解决办法

matlab运行Shubert测试函数一些的报错信息及解决办法

1、将Shubert函数单独放在一个m文件中

在这里插入图片描述
2、

将剩余的代码(代码我会放在下面)
添加

在这里插入图片描述

%clear
%close all
%clc

在这里插入图片描述

3、

将rep改为repmat

可能还会有以下问题:

问题:
在这里插入图片描述或以下这种报错:在这里插入图片描述
解决办法:我们需要下载一个gatbx的工具包
1、下载gatbx工具包:[参考:gatbx工具包下载](https://blog.csdn.net/qq_33353186/article/details/79329370)
在这里插入图片描述
2、解压、安装:
把下载的gatbx工具箱压缩包,解压到MATLAB安装目录下toolbox路径下
在这里插入图片描述
3、添加到路径
在这里插入图片描述
4、重新运行一遍,即可运行成功

运行图:
在这里插入图片描述

50次迭代:50次迭代

在这里插入图片描述

代码及代码讲解:

第一个m文件:

function z = Shubert(x,y);
z=((1*cos((1+1)*x+1))+(2*cos((2+1)*x+2))+(3*cos((3+1)*x+3))+...
    (4*cos((4+1)*x+4))+(5*cos((5+1)*x+5))+(1*cos((1+1)*y+1))+...
    (2*cos((2+1)*y+2))+(3*cos((3+1)*y+3))+(4*cos((4+1)*y+4))+(5*cos((5+1)*y+5)));

第二个m文件:

%clear
%close all
%clc
[x1,x2]=meshgrid(-10:.1:10);
figure(1);                
mesh(x1,x2,Shubert(x1,x2)); %画出Shubert函数图像

%定义遗传算法参数
NIND = 40;      %   个体数目(Number of individuals)
MAXGEN = 50;    %   最大遗传代数(Maximum number of generations)
NVAR = 2;       %   变量数目
PRECI = 25;     %   变量的二进制位数(Precision of variables)
GGAP = 0.9;     %   代沟(Generation gap)

%建立区域描述器(Build field desciptor)
FieldD = [repmat([PRECI],[1,NVAR]);repmat([-3;3],[1,NVAR]);repmat([1;0;1;1],[1,NVAR])];
Chrom = crtbp(NIND,NVAR*PRECI); %   创建初始种群
gen = 0;
trace = zeros(MAXGEN,2);        %   遗传算法性能跟踪初始值
x = bs2rv(Chrom,FieldD);        %   初始种群十进制转化
ObjV = Shubert(x(:,1),x(:,2));  %   计算初始种群的目标函数值
while gen < MAXGEN,
    FitnV = ranking(ObjV);                  %   分配适应度值
    SelCh = select('sus',Chrom,FitnV,GGAP); %   选择
    SelCh = recombin('xovsp',SelCh,0.7);    %   重组
    SelCh = mut(SelCh);                     %   变异
    x = bs2rv(SelCh,FieldD);                %   子代十进制转化
    ObjVSel = Shubert(x(:,1),x(:,2));       %   重插入
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
    gen = gen + 1;
    [Y,I] = min(ObjVSel);
    Y,bs2rv(Chrom(I,:),FieldD);             %输出最优解及其对应的自变量值
    trace(gen,1) = min(ObjV)
    trace(gen,2) = sum(ObjV)/length(ObjV);  %遗传算法性能跟踪
    if(gen == 50)                           %迭代数为50时,画出目标函数图
        figure(2);
        plot(ObjV);hold on;
        plot(ObjV,'b*');grid;
    end
end
figure(3);clf;
plot(trace(:,1));hold on;
plot(trace(:,2),'-.');grid;
legend('解的变化','种群均值的变化');
粒子群算法(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、付费专栏及课程。

余额充值