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,:)=wv(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
运行出现这种错误
出错 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)。
肯定会出错。
你可以给数组定义多一点。
代码里面有明显的语法错误
个人这边也在参加数模 ,这句话报错的原因实际上就是定义的一维数组没有你使用的多,
最简单的解决办法可以试一下 ,就是在程序运行开始前,清除以前的变量。在你程序最开始的地方 放上
clc;
close all;
clear all;
指令看一下 问题是否可以解决。
如果问题还没有解决 ,那就需要你一点一点去看你自己的程序。
望采纳谢谢