📄 constrainpso.txt
字号:
待改进的约束优化问题的粒子群算法
今天写了一个解决约束优化问题的算法,但是对一个测试函数无法达到全局最优.所以贴上来大家一起想想改进办法.
主函数:
%-----------------------------------------------
%程序名称:求解约束优化问题的改进粒子群优化算法
%程序功能:求解带各种约束条件的优化问题
%输入条件:各种初始条件,以及设定参数
%输出数值:最优解位置以及函数极小值
%-----------------------------------------------
%格式设定
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
%----算法结束-------------------------------------
m文件1:
%名称:被优化函数的适应度函数
%输入:代表粒子的向量x,粒子搜索空间维数D
%输出:粒子的适应度值
%形式:M文件调用函数
function result=fitness(x,D)
sum1=0;
sum2=1;
sum3=0;
for i=1:D
sum1=sum1+cos(x(i))^4;
sum2=sum2*cos(x(i))^2;
sum3=sum3+i*x(i)^2;
end
result=-abs(sum1-2*sum2)/sqrt(sum3);
m文件2
%名称:粒子违反约束程度函数
%输入:粒子位置x,搜索空间维数D
%输出:粒子违反约束条件的程度(若违反输出大于,不违反输出等于零)
%形式:保存为M文件被调用
function result=violent(x,D)
sum1=1;
sum2=0;
for i=1:D
sum1=sum1*x(i);
sum2=sum2+x(i);
end
part1=max(0,0.75-sum1);
part2=max(0,sum2-7.5*D);
part3=max(0,-x(i));
part4=max(0,10-x(i));
result=part1+part2+part3+part4;
运行结果不是很好,只能达到局部最优.下面加入一个变异算子有可能会好一些!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -