我在应用PSO算法求最大值时,自变量跑出了应该在的范围,导致所取最大值成为无穷,应该怎么限制二维自变量的范围呢,x1,x2在【-10,10】
function [Xm,Vm]=PSO(zh,N,c1,c2,w,M,D)
%%%%%%%%初始化各个粒子的位置和速度%%%%%%%%%%
for i=1:N
for j=1:D
x(i,j)=randn;
v(i,j)=randn;
end
end
%%%%%%%初始化各个粒子的适应度%%%%%%%%%
for i=1:N
p(i)=zh(x(i,:));
y(i,:)=x(i,:);%y为个体最优
end
pb=x(N,:);%pb为最优位置
%%%%%%%%寻找全局最优位置%%%%%%%%%%%
for i=1:N-1
if zh(x(i,:)>zh(pb))
pb=x(i,:);
end
end
%%%%%%%%按照公式进行迭代,寻找最优位置直到满足精度要求或循环结束%%%%
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pb-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if x(i,:)<-10
x(i,:)=-10;
end
if x(i,:)>10
x(i,:)=10;
end
if zh(x(i,:))>p(i)
p(i)=zh(x(i,:));
y(i,:)=x(i,:);%更新个体最优
end
if p(i)>zh(pb)
pb=y(i,:);%更新全局最优
end
end
end
Xm=pb';
Vm=zh(pb);
end
%%%% 目标函数%%%%
function F=zh(x)
F=x(1)^2+5*x(2)^2;
end
%%%%主函数%%%%%
[Xm1,Vm1]=PSO(@zh,50,1.5,1.5,0.5,100,2);
disp('目标函数最大时的自变量为:');
disp(Xm1)
disp('目标函数的最大值为:');
disp(abs(Vm1));
lzqsf
目标函数最大时的自变量为:
1.0e+153 *
-1.6093
7.5586
目标函数的最大值为:
Inf
if x(i,1)<-110||x(i,1)>10
continue
end
但是依旧出了范围
lzqsf
目标函数最大时的自变量为:
1.0e+49 *
-0.0000
1.1894
目标函数的最大值为:
7.0738e+98
我希望最终得到的x1,x2能在【-10,10】内,使得最大值不是无穷
==============================================================
如果题主确实是要求最大值,那么限幅部分应该这样改:
因为比较大小时,不能拿向量和标量10比较。
x(i,:) = max( x(i,:) ,-10 ); % 限制最小值
x(i,:) = min( x(i,:) ,10 ); % 限制最大值
改后的PSO程序为:
function [Xm,Vm]=PSO(zh,N,c1,c2,w,M,D)
%%%%%%%%初始化各个粒子的位置和速度%%%%%%%%%%
for i=1:N
for j=1:D
x(i,j)=randn;
v(i,j)=randn;
end
end
%%%%%%%初始化各个粒子的适应度%%%%%%%%%
for i=1:N
p(i)=zh(x(i,:));
y(i,:)=x(i,:);%y为个体最优
end
pb=x(N,:);%pb为最优位置
%%%%%%%%寻找全局最优位置%%%%%%%%%%%
for i=1:N-1
if zh(x(i,:)>zh(pb))
pb=x(i,:);
end
end
%%%%%%%%按照公式进行迭代,寻找最优位置直到满足精度要求或循环结束%%%%
for t=1:M
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pb-x(i,:));
x(i,:)=x(i,:)+v(i,:);
x(i,:) = max( x(i,:) ,-10 ); % 限制最小值
x(i,:) = min( x(i,:) ,10 ); % 限制最大值
if zh(x(i,:))>p(i)
p(i)=zh(x(i,:));
y(i,:)=x(i,:);%更新个体最优
end
if p(i)>zh(pb)
pb=y(i,:);%更新全局最优
end
end
end
Xm=pb';
Vm=zh(pb);
end
改后的结果为:
目标函数最大时的自变量为:
10
-10
目标函数的最大值为:
600
====================================================
看这个函数应该是求解最小值吧,最大值肯定是落在边界上的,如果是求解最小值可以按照下面的方法改:
%%%% 目标函数%%%%
function F=zh(x)
F=x(1)^2+5*x(2)^2;
F = -F;
end
运行结果为:
目标函数最小时的自变量为:
1.0e-12 *
-0.1623
-0.1747
目标函数的最小值为:
-1.7898e-25
x超出范围之后,重新初始化该粒子的速度,让它落在范围里