matlab问题 粒子群算法

matlab

function [xm,RMS]=PSO_1(fitness,N,c1,c2,xmax,xmin,M,D)
%给定初始化条件
%c1学习因子1
%c2学习因子2
%wmax 惯性权重最大值
%wmin 惯性权重最小值
%vmax 速度最大值
%vmin 速度最小值
%xmax 自变量最大值
%xmin 自变量最小值
%M 最大迭代次数
%N 初始化群体个体数目
%D 搜索空间维数
%rm 目标函数取得最小值的自变量
%fm 目标函数最小值

wmax=0.9;
wmin=0.4;
vmax=0.5;
vmin=-0.5;
for i=1;N
for j=1;D
x(i,j)=randn;
v(i,j)=randn;
end
end

for i=1:N
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
pg=x(1,:);
for i=2:N
if fitness(x(i,:))<fitness(pg)
pg=x(i,:);
end
end

for t=1:M
for i=1:N
w=wmax-(t-1)(wmax-wmin)/(M-1);
v(i,:)=w
v(i,:)+c1rand(y(i,:)-x(i,:))+c2rand(pg-x(i,:));
if v(i,:)>vmax
v(i,:)=vmax;
elseif v(i,:)<vmin
v(i,:)=vmin;
end
x(i,:)=x(i,:)+v(i,:);
if x(i,:)>xmax
x(i,:)=xmax;
elseif x(i,:)<xmin
x(i,:)=xmin;
end
if fitness(x(i,:))<p(i)
p(i)=fitness(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<fitness(pg)
pg=y(i,:);
end
end
pbest(t)=fitness(pg);
end
disp('目标函数取最小值的自变量:');
xm=pg'
disp('目标函数最小值:');
RMS=fitness(pg)
end

function y=linef(x)
y=11*(x(1)^2-x(2)^2)-(1-x(2))^2+2*(1+x(2))^2+0.7;
end

运行出现这种错误

img


索引超出数组元素的数目(1)。

出错 linef (line 2)
y=11*(x(1)^2-x(2)^2)-(1-x(2))^2+2*(1+x(2))^2+0.7;

出错 PSO_1 (line 31)
pi(i)=fitness(x(i,:));

该怎么解决?

看你写的代码,初步就能发现一些问题,两个for里面这个分号是否敲错了,应该是冒号吧,改一下再试试吧
for i=1;N
for j=1;D
x(i,j)=randn;
v(i,j)=randn;
end
end

修改后代码如下:

clear all
clc

[xm,RMS]=PSO_1(@linef,60,1,2,10,1,700,2);

function [xm,RMS]=PSO_1(fitness,N,c1,c2,xmax,xmin,M,D)
%给定初始化条件
%c1学习因子1
%c2学习因子2
%wmax 惯性权重最大值
%wmin 惯性权重最小值
%vmax 速度最大值
%vmin 速度最小值
%xmax 自变量最大值
%xmin 自变量最小值
%M 最大迭代次数
%N 初始化群体个体数目
%D 搜索空间维数
%rm 目标函数取得最小值的自变量
%fm 目标函数最小值

wmax=0.9;
wmin=0.4;
vmax=0.5;
vmin=-0.5;
for i=1:N
    for j=1:D
        %         x(i,j)=randn;
        x(i,j) = xmin + (xmax-xmin)*rand;
        v(i,j)=randn;
    end
end

for i=1:N
    p(i)=fitness(x(i,:));
    y(i,:)=x(i,:);
end
pg=x(N,:);
for i=1:N-1
    if fitness(x(i,:))<fitness(pg)
        pg=x(i,:);
    end
end

for t=1:M
    for i=1:N
        w=wmax-(t-1)*(wmax-wmin)/(M-1);
        v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
        if v(i,:)>vmax
            v(i,:)=vmax;
        elseif v(i,:)<vmin
            v(i,:)=vmin;
        end
        x(i,:)=x(i,:)+v(i,:);
        len=length(x(i,:));
        for k=1:len   
            if x(i,k)>xmax
                x(i,k)=xmax;
            elseif x(i,k)<xmin
                x(i,k)=xmin;
            end
        end
        if fitness(x(i,:))<p(i)
            p(i)=fitness(x(i,:));
            y(i,:)=x(i,:);
        end
        if p(i)<fitness(pg)
            pg=y(i,:);
        end
    end
    %pbest(t)=fitness(pg);
end
disp('目标函数取最小值的自变量:');
xm=pg'
disp('目标函数最小值:');
RMS=fitness(pg)
end



function y=linef(x)
y=11*(x(1)^2-x(2)^2)-(1-x(2))^2+2*(1+x(2))^2+0.7;
end

有用请采纳,谢谢!

索引越界,可能是传参时输入的数据超过了所定义数组的大小。

你这个数组根本就没那么多。
比如你只有10个数组,你读取数组(11)。
肯定会出错。
你可以给数组定义多一点。

粒子群算法(matlab实现)_jjb-coder的博客-CSDN博客_粒子群算法matlab 目录基本原理算法概括式子说明程序设计基本流程代码部分总结基本原理算法概括粒子群算法(PSO),在PSO中,每个优化问题的潜在解都是搜索空间的一只鸟,被称为粒子,所有的粒子都有一个由适应度函数决定的适值,每个粒子还有一个速度决定它们“”飞行“”的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索,整个过程大致为,PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代的过程中,粒子通过跟踪两个极值来更新自己:第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种 https://blog.csdn.net/jiuzhongxian_/article/details/108286863

代码里面有明显的语法错误

个人这边也在参加数模 ,这句话报错的原因实际上就是定义的一维数组没有你使用的多,
最简单的解决办法可以试一下 ,就是在程序运行开始前,清除以前的变量。在你程序最开始的地方 放上
clc;
close all;
clear all;
指令看一下 问题是否可以解决。
如果问题还没有解决 ,那就需要你一点一点去看你自己的程序。
望采纳谢谢