有约束情况下的粒子群算法函数寻优

对无约束粒子群算法介绍
(统一回复一下,代码链接在此,这个代码和博客有所不同,对有点基础的同学来说问题不大的,祝诸位学业有成~
新链接:https://pan.baidu.com/s/1VUs872FqWeuFbGat7p4-Gg?pwd=4c9m 提取码: 4c9m 复制这段内容后打开百度网盘手机App,操作更方便哦)

约束条件

对目标函数中的变量进行的约束。即一个函数中的各个变量有的会有限制条件,只有在约束条件下进行的求解才能是有效的求解。
在这里插入图片描述
以上图为例,f(x) 为目标函数,s.t. 为约束条件

等式约束

例如上图中的h(x) =0 ,我们称之为等式约束。

对于函数 y = x1 +x2*x3

x1 + x2 = x3 就是等式约束

不等式约束

例如上图中g(x) <= 0 ,我们称之为不等式约束。

对于函数 y = x1 +x2*x3

x1 + x2 <= x3 就是等式约束

在算法中引入约束

我们知道,在一般的粒子群算法中,我们并没有引入变量之间约束的概念,所以要把约束条件引入算法,需要将约束条件转化为限制粒子飞行的因素。

在算法执行的过程中,我们通过粒子的适应度(一般为粒子代表的函数值)来代表这个粒子的优势度。如果这个粒子不满足我们引入的约束条件,我们可以给这个粒子的适应度赋予一个很大的值(适应度越小越好),说明这个粒子不能满足约束条件,因此,我们引入了罚函数的概念。

罚函数

百度解释

罚函数是指在求解最优化问题(无线性约束优化及非线性约束优化)时,在原有目标函数中加上一个障碍函数,而得到一个增广目标函数,罚函数的功能是对非可行点或企图穿越边界而逃离可行域的点赋予一个极大的值,即将有约束最优化问题转化为求解无约束最优化问题。

我们将约束条件进行整理,转化为右边为0的形式

以上面为例:x1 + x2 - x3 <= 0

function Z=getconstraints(fnonlin,u)
% 一个很大的数,用于惩罚没有满足约束条件的粒子
PEN=10^15; 
lam=PEN; lameq=PEN;
Z=0;
% 非线性约束
[g,geq]=fnonlin(u);

%通过不等式约束建立罚函数
for k=1:length(g),
    Z=Z+lam*g(k)^2*getH(g(k));
end
% 等式条件约束
for k=1:length(geq),
   Z=Z+lameq*geq(k)^2*geteqH(geq(k));
end

代码实现

等式约束判断
% 满足约束为0 反之为1
function H=geteqH(g)
if g==0,
    H=0;
else
    H=1; 
end
不等式约束判断
% 满足约束为0 反之为1
function H=getH(g)
if g<=0, 
    H=0; 
else
    H=1; 
end
罚函数
function Z=getconstraints(fnonlin,u)
% 一个很大的数,用于惩罚没有满足约束条件的粒子
PEN=10^15;
lam=PEN; lameq=PEN;

Z=0;
% 非线性约束
[g,geq]=fnonlin(u);

%通过不等式约束建立罚函数
for k=1:length(g),
    Z=Z+ lam*g(k)^2*getH(g(k));
end
% 等式条件约束
for k=1:length(geq),
   Z=Z+lameq*geq(k)^2*geteqH(geq(k));
end

随机性衰减因子

用于控制粒子更新的位置的随机性

% 随机性衰减因子
function alpha=newPara(alpha,gamma);
alpha=alpha*gamma;
寻找全局最优个体
  for i=1:n,   
    fval=Fun(fhandle,fnonlin,best(i,:)); 
    % 更新最有个体
    if fval<=fbest, 
        gbest=best(i,:);
        fbest=fval;
    end
  end
约束条件的建立
function [g,geq]=constraint(x)
% g(1) = x1 +x2 -x3 的形式
% g 用于存储不等式约束
% geq 用于存储不等式约束
带有约束条件的求解
function [gbest,fbest]=pso_mincon(fhandle,fnonlin,Lb,Ub,para)
if nargin<=4,
    para=[20 150 0.95];
end
n=para(1);% 粒子种群大小
time=para(2); %时间步长,迭代次数
gamma=para(3); %gama参数
 scale=abs(Ub-Lb); %取值区间
% 验证约束条件是否合乎条件
if abs(length(Lb)-length(Ub))>0,
    disp('Constraints must have equal size');
    return
end

  alpha=0.2; % alpha=[0,1]粒子随机衰减因子
  beta=0.5;  % 收敛速度(0->1)=(slow->fast);

% 初始化粒子群
best=init_pso(n,Lb,Ub);

fbest=1.0e+100;
% 迭代开始
for t=1:time,     
   
%寻找全局最优个体
  for i=1:n,   
    fval=Fun(fhandle,fnonlin,best(i,:)); 
    % 更新最有个体
    if fval<=fbest, 
        gbest=best(i,:);
        fbest=fval;
    end
        
  end

% 随机性衰减因子
 alpha=newPara(alpha,gamma);

% 更新粒子位置 
  best=pso_move(best,gbest,alpha,beta,Lb,Ub);  
 
% 结果显示
	str=strcat('Best estimates: gbest=',num2str(gbest));
	str=strcat(str,'  iteration='); str=strcat(str,num2str(t));
	disp(str);

    fitness1(t)=fbest;
    plot(fitness1,'r','Linewidth',2)
    grid on
    hold on
    title('适应度')
end

运行例子结果如下:
在这里插入图片描述

  • 21
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
UART是通用异步收发传输器的缩写,它是一种串行通信协议。UART的特点是简单、廉价、易于实现和理解。它可以在不同设备之间传输数据,但需要协商好通信参数,如波特率、数据位、停止位、奇偶校验位等。UART是一种点对点的通信协议,即只能有一个发送器和一个接收器。 TTL是晶体管-晶体管逻辑的缩写,是一种数字电路的电平标准。 TTL电平的逻辑高电平一般为5V,逻辑低电平为0V。 TTL串口通常使用3.3V或5V作为电平标准,具有简单、廉价、易于实现和理解的特点。 RS232是一种常见的串行通信协议,常用于连接计算机和周边设备。 RS232是单向传输,只有一个发送器和一个接收器,通常使用9针或25针连接器,最大传输距离为50英尺(约15米),具有稳定性好、传输速率低等特点。 RS422是一种高速、远距离、差分传输的串行通信协议,支持多点通信。 RS422通常使用4针或5针连接器,最大传输距离为4000英尺(约1200米),具有抗干扰性强、传输速率高等特点。 RS485是一种高速、远距离、差分传输的串行通信协议,支持多点通信。 RS485通常使用2针或3针连接器,最大传输距离为4000英尺(约1200米),具有抗干扰性强、传输速率高等特点。与RS422相比,RS485具有更高的灵活性和更好的成本效益,因此在工业控制和自动化领域广泛应用。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值