longaer 2021-11-29 01:43 采纳率: 100%
浏览 1790
已结题

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

问题遇到的现象和发生背景

我在应用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】内,使得最大值不是无穷

  • 写回答

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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 快手联盟怎么快速的跑出建立模型
  • ¥15 关于腾讯云服务器中,PHP页面无法打开的问题
  • ¥60 如何把照片修复成原始拍摄图
  • ¥80 Exited too quickly (process log may have details)
  • ¥15 爬知乎登录之后内容加载不出来
  • ¥15 怎么用protues测量通频带
  • ¥15 zepelin使用sparkInterpreter 异常
  • ¥15 paho mqtt 接收不到消息
  • ¥15 函数r关于两个分量y,z方向上的图像,分开画r随y的图像,r随z的图像
  • ¥15 如何用Matlab求Pearcey函数的数值积分?