Halcom 发表于 2017-11-30 00:01:32

58-带罚函数的自适应粒子群算法

百度网盘链接:
视频讲解链接:https://pan.baidu.com/s/1Xs--i-MwTU-_YUchq-iPPQ
https://pan.baidu.com/s/1xVCDEpAM2QXjC2Mvy5LdgA

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1


带罚函数的自适应粒子群算法:简单示例,
% 改进的快速粒子群优化算法 (APSO):
function apso

Lb=; %下边界
Ub=; %上边界
% 默认参数
para=; %[粒子数,迭代次数,gama参数]

% APSO 优化求解函数
=pso_mincon(@cost,@constraint,Lb,Ub,para);

% 输出结果
Bestsolution=gbest % 全局最优个体
fmin

%% 目标函数
function f=cost(x)
f=1.10471*x(1)^2*x(2)+0.04811*x(3)*x(4)*(14.0+x(2));

% 非线性约束
function =constraint(x)
% 不等式限制条件
Q=6000*(14+x(2)/2);
D=sqrt(x(2)^2/4+(x(1)+x(3))^2/4);
J=2*(x(1)*x(2)*sqrt(2)*(x(2)^2/12+(x(1)+x(3))^2/4));
alpha=6000/(sqrt(2)*x(1)*x(2));
beta=Q*D/J;
tau=sqrt(alpha^2+2*alpha*beta*x(2)/(2*D)+beta^2);
sigma=504000/(x(4)*x(3)^2);
delta=65856000/(30*10^6*x(4)*x(3)^3);
F=4.013*(30*10^6)/196*sqrt(x(3)^2*x(4)^6/36)*(1-x(3)*sqrt(30/48)/28);

g(1)=tau-13600;
g(2)=sigma-30000;
g(3)=x(1)-x(4);
g(4)=0.10471*x(1)^2+0.04811*x(3)*x(4)*(14+x(2))-5.0;
g(5)=0.125-x(1);
g(6)=delta-0.25;
g(7)=6000-F;
% 如果没有等式约束,则置geq=[];
geq=[];

%%APSO Solver
function =pso_mincon(fhandle,fnonlin,Lb,Ub,para)
if nargin<=4,
    para=;
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=粒子随机衰减因子
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

% 初始化粒子函数
function =init_pso(n,Lb,Ub)
ndim=length(Lb);
for i=1:n,
    guess(i,1:ndim)=Lb+rand(1,ndim).*(Ub-Lb);
end

%更新所有的粒子 toward (xo,yo)
function ns=pso_move(best,gbest,alpha,beta,Lb,Ub)
% 增加粒子在上下边界区间内的随机性
n=size(best,1); ndim=size(best,2);
scale=(Ub-Lb);
for i=1:n,
    ns(i,:)=best(i,:)+beta*(gbest-best(i,:))+alpha.*randn(1,ndim).*scale;
end
ns=findrange(ns,Lb,Ub);

% 边界函数
function ns=findrange(ns,Lb,Ub)
n=length(ns);
for i=1:n,
% 下边界约束
ns_tmp=ns(i,:);
I=ns_tmp<Lb;
ns_tmp(I)=Lb(I);

% 上边界约束
J=ns_tmp>Ub;
ns_tmp(J)=Ub(J);

%更新粒子
ns(i,:)=ns_tmp;
end

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

% 带约束的d维目标函数的求解
function z=Fun(fhandle,fnonlin,u)
% 目标
z=fhandle(u);

z=z+getconstraints(fnonlin,u); % 非线性约束

function Z=getconstraints(fnonlin,u)
% 罚常数 >> 1
PEN=10^15;
lam=PEN; lameq=PEN;

Z=0;
% 非线性约束
=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

% Test if inequalities
function H=getH(g)
if g<=0,
    H=0;
else
    H=1;
end

% Test if equalities hold
function H=geteqH(g)
if g==0,
    H=0;
else
    H=1;
end
参考:
《MATLAB优化算法案例分析与应用》第13章(有约束函数极值APSO寻优)
《MATLAB优化算法案例分析与应用(进阶篇)》第18章(汽车动力传动参数优化设计)





德帝 发表于 2017-12-1 19:34:10

想问下,这段代码有些地方看不懂,有讲解资料或者视频吗,谢谢

Halcom 发表于 2017-12-1 22:24:37

德帝 发表于 2017-12-1 19:34
想问下,这段代码有些地方看不懂,有讲解资料或者视频吗,谢谢

代码先单步调试看看

季天翼 发表于 2018-6-22 21:49:17

机器码:FF61C512CD36ED7C-0-EB3A9010F521F17C

季天翼 发表于 2018-6-22 21:49:38

机器码:FF61C512CD36ED7C-0-EB3A9010F521F17C

季天翼 发表于 2018-6-23 10:56:23

机器码:FF61C512CD36ED7C-0-EB3A9010F521F17C

jackian 发表于 2020-2-11 10:16:17

非常好的学习资源,感谢分享

jackian 发表于 2020-2-13 02:14:03

机器码:FF48E712CD53F57C-0-FF48C202D90BF17C

hou666666 发表于 2020-2-20 14:17:18

非常好的学习资源,感谢分享

sunlei0417 发表于 2020-2-26 00:25:24


观摩一下大佬写的代码
页: [1] 2
查看完整版本: 58-带罚函数的自适应粒子群算法