longaer 2021-11-29 01:43 采纳率: 100%

# matlab怎么限制算法中自变量的取值范围

###### 问题相关代码，请勿粘贴截图
``````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

• 写回答

#### 2条回答默认 最新

• CSDN专家-Matlab_Fans 2021-11-29 22:54
关注

==============================================================
如果题主确实是要求最大值，那么限幅部分应该这样改：
因为比较大小时，不能拿向量和标量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
``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论 编辑记录

#### 问题事件

• 系统已结题 12月8日
• 已采纳回答 11月30日
• 赞助了问题酬金 11月29日
• 赞助了问题酬金 11月29日
• 展开全部

#### 悬赏问题

• ¥20 微信h5网页如何静默获取到用户的基本信息（头像昵称）
• ¥15 有做通信软件的技术团队吗
• ¥15 如图所示交换机网络该如何规划配置
• ¥15 CUDA driver error
• ¥15 Dijkstra 算法的堆优化方法
• ¥15 师哥师姐们，如何帮我下载一下python？
• ¥15 Office版本升级，Oracle连接报错
• ¥20 利用python搜索PDF文件中是否存在1
• ¥15 ImportPathMismatchError
• ¥15 滤波器这个效果是对的么