📄 main.m
字号:
%-----------------------------------------------
%程序名称:求解约束优化问题的改进粒子群优化算法
%程序功能:求解带各种约束条件的优化问题
%输入条件:各种初始条件,以及设定参数
%输出数值:最优解位置以及函数极小值
%-----------------------------------------------
%格式设定
clear all;
clc;
format long;
%参数设置
D=10; %搜索空间维数
N=40; %粒子群规模
MaxDT=1000; %最大迭代次数
w=0.7298; %惯性权重w
c1=1.49618; %学习因子c1
c2=1.49618; %学习因子c2
%随机初始化粒子的位置和速度
for i=1:N
for j=1:D
x(i,j)=1+rand*9; %0到10之间的随机数(不同情况要改变)
v(i,j)=rand;
end
p(i,:)=x(i,:); %初始化时把粒子位置设为个体最优位置
end
%根据两个函数确定最优位置适应度函数
Pbest=10^8;
for i=1:D
if fitness(p(i,:),D)<Pbest
Pbest=fitness(p(i,:),D);
Pg=p(i,:);
end
end
%根据基本粒子群迭代公式进行一次进化迭代产生中间子代mid
for i=1:N
for j=1:D
v(i,j)=w*v(i,j)+c1*rand*(p(i,j)-x(i,j))+c2*rand*(Pg(j)-x(i,j));
mid(i,j)=x(i,j)+v(i,j); %中间代mid
end
end
%判断中间代与原父代的优劣(进化选择)
for i=1:N
%若都一个可行,另一个不可行,则无条件选择可行解
if violent(x(i,:),D)==0 && violent(mid(i,:),D)>0
NextGeneration(i,:)=x(i,:);
end
%若都可行,选择适应度小的进入下一代
if violent(x(i,:),D)==0 && violent(mid(i,:),D)==0
if fitness(x(i,:),D)<=fitness(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
%若都一个可行,另一个不可行,则无条件选择可行解
if violent(x(i,:),D)>0 && violent(mid(i,:),D)==0
NextGeneration(i,:)=mid(i,:);
end
%若两个都不可行,选择违背约束小的进入下一代
if violent(x(i,:),D)>0 && violent(mid(i,:),D)>0
if violent(x(i,:),D)<=violent(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
end
%NextGeneration复制给更新的粒子群x
x=NextGeneration;
%下面进入主循环,迭代最大次数后输出优化结果
for t=1:MaxDT
%更新个体和全局最优位置
for i=1:N
if fitness(x(i,:),D)<fitness(p(i,:),D)
p(i,:)=x(i,:);
end
if fitness(p(i,:),D)<Pbest && violent(p(i,:),D)==0
Pg=p(i,:);
end
end
%根据基本粒子群迭代公式进行一次进化迭代产生中间子代mid
for i=1:N
for j=1:D
v(i,j)=w*v(i,j)+c1*rand*(p(i,j)-x(i,j))+c2*rand*(Pg(j)-x(i,j));
mid(i,j)=x(i,j)+v(i,j); %中间代mid
end
end
%判断中间代与原父代的优劣(进化选择)
for i=1:N
%若都一个可行,另一个不可行,则无条件选择可行解
if violent(x(i,:),D)==0 && violent(mid(i,:),D)>0
NextGeneration(i,:)=x(i,:);
end
%若都可行,选择适应度小的进入下一代
if violent(x(i,:),D)==0 && violent(mid(i,:),D)==0
if fitness(x(i,:),D)<=fitness(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
%若都一个可行,另一个不可行,则无条件选择可行解
if violent(x(i,:),D)>0 && violent(mid(i,:),D)==0
NextGeneration(i,:)=mid(i,:);
end
%若两个都不可行,选择违背约束小的进入下一代
if violent(x(i,:),D)>0 && violent(mid(i,:),D)>0
if violent(x(i,:),D)<=violent(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
end
%NextGeneration复制给更新的粒子群x
x=NextGeneration;
end
disp('函数的最大值为')
-Pbest
%----算法结束-------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -