[未答复] 报错:位置 1 处的索引超出数组边界(不能超出 1)。请问我该怎么修改

[复制链接]
zcb666 发表于 2022-11-22 19:57:56
%% 清空环境
clc
clear all;
close all;
warning off %%这是书中有的语句 ,表示关闭警告语句,我觉得可以留着看看哪里会出现错误
%% 参数初始化
%粒子群算法中的两个参数
c1=1.49445;
c2=1.49445;
maxgen=200;      %进化次数
sizepop=200;     %种群规模

%粒子更新速度(到底是更新速度还是初始速度)
Vmax=1;
Vmin=-1;

%种群上下边界值
popmax=20;
popmin=-5;

%bset_particle_number, that is to say ,the number of x is equal to pai_num 这里可能是代指26行出现的par_num表示有3个粒子变量;

par_num=3;

%% 产生初始粒子与速度
for i=1:sizepop
    %随机产生一个种群
    pop(1,:)=2.*abs(rands(1,par_num));% .*表示矩阵相对应数字相乘,rands(m,n)生成一个m行n列的矩阵,矩阵中的数字在0-1之间的随机数
    V(i,:)=1.*rands(1,par_num);
    %计算适应度
    fitness(i)=fun2(pop(i,:)); %染色体的适应度
end

%找最好的适应度值
[bestfitness,bestindex]=min(fitness);
zbest=pop(bestindex,:);         %全局最佳
gbest=pop;                      %个体最佳
fitnessgbest=fitness;           %个体最佳适应度值
fitnesszbest=bestfitness;       %全局最佳适应度值

%% 迭代寻优
for i=1:maxgen
    i
    for j=1:sizepop
        %速度更新
        V(j,:)=V(j,:)+c1*rand*(gbest(j,:)-pop(j,:))+c2*rand*(zbest-pop(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;
        V(j,find(V(j,:)<Vmin))=Vmin;

        %种群更新
        pop(j,:)=pop(j,:)+0.5*V(j,:);
        pop(j,find(pop(j,:)>popmax))=popmax;
        pop(j,find(pop(j,:)<popmin))=popmin;

        %自适应变异(避免粒子群算法陷入局部最优)
        if rand>0.8       %rand 0-1的随机数
            k=ceil(par_num*rand);%ceil朝着正无穷大方向取整即可能取整数1或2,可能返回1或2(选取第一组数或者第二组数)
                           %此处可以和PSO_1的地方比对,k=ceil(2*rand),不同之处是rand前面乘的数字,在初始种群哪里,rands(1,这个数字)
            pop(j,k)=rand;      
        end

        %适应度值(这也就是约束条件,看书,上面三个不等式)
        if 1.0*pop(j,1)-1.0*pop(j,2)+1.0*pop(j,3)<=20
            if 3*pop(j,1)+2*pop(j,2)+4*pop(j,3)<=42
                if 3*pop(j,1)+2*pop(j,2)<=30
                    fitness(j)=fun2(pop(j,:));
                end
            end
        end

        %个体最优更新
        if fitness(j)<fitnessgbest(j)
            gbest(j,:)=pop(j,:);
            fitnessgbest(j)=fitness(j);
        end
        %群体最优更新
        if fitness(j)<fitnesszbest
            zbest=pop(j,:);             %全局最佳。之前就是在这个地方错的,看工作区就是它是和gbest不匹配。
            fitnesszbest=fitness(j);
        end
    end
    yy(i)=fitnesszbest;
end

%% 结果
disp '//////////////best particle number////////////////' %disp后面一定要加一个空格
zbest

plot(yy)
title(['适应度曲线''终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
function y=fun2(x)
y=-5*x(1)-4*x(2)-6*x(3);
end

您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表