求教PSO算法优化函数的matlab程序,比如sphere、schaffer、rosenbrock、rastrigin、shubert函数,
2个回答
展开全部
%% 清空环境
clc
clear
close all
%% 参数初始化
%粒子群算法中的两个学习因子
c1 = 1.49445;
c2 = 1.49445;
maxgen=1000; % 迭代次数
sizepop=20; %种群规模
Wstart=1.5;%初始惯性权值
Wend=0.4;%迭代次数最大时惯性权值
Vmax=1;
Vmin=-1;
popmax=5.12;
popmin=-5.12;
%% 产生初始粒子和速度
for i=1:sizepop
%随机产生一个种群
pop(i,:)=200*rands(1,30)-100; %初始种群
V(i,:)=rands(1,30); %初始化速度
%计算适应度
fitness(i)=fun(pop(i,:)); %适应度
end
%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
% Vmax=1.0008^(-i);
% Vmin=-1.0008^(-i);
for j=1:sizepop
GW=Wstart-(Wstart-Wend)*i/maxgen;
V(j,:) = V(j,:) +c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax))=Vmax;
V(j,find(V(j,:)<Vmin))=Vmin;
%种群更新
pop(j,:)=pop(j,:)+V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)<popmin))=popmin;
%适应度值
fitness(j)=fun(pop(j,:));
end
for j=1:sizepop
%个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
a= fitnesszbest;
end
%% 结果分析
figure
plot(log10(yy),'k--','LineWidth',1.2)
legend('原始粒子群算法')
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
hold on
%% 结果分析
plot(log10(yy),'k-','LineWidth',2)
legend('CPSO')
title('Sphere','fontsize',12);
xlabel('Function Evaluations','fontsize',12);ylabel('Best Fitness','fontsize',12);
set(gcf,'Position',[100 100 480 380]);
hold on
function y = fun(x)
%函数用于计算粒子适应度值
%x input 输入粒子
%y output 粒子适应度值
y=0;
for i=1:30
y=y+x(i)^2;
end
clc
clear
close all
%% 参数初始化
%粒子群算法中的两个学习因子
c1 = 1.49445;
c2 = 1.49445;
maxgen=1000; % 迭代次数
sizepop=20; %种群规模
Wstart=1.5;%初始惯性权值
Wend=0.4;%迭代次数最大时惯性权值
Vmax=1;
Vmin=-1;
popmax=5.12;
popmin=-5.12;
%% 产生初始粒子和速度
for i=1:sizepop
%随机产生一个种群
pop(i,:)=200*rands(1,30)-100; %初始种群
V(i,:)=rands(1,30); %初始化速度
%计算适应度
fitness(i)=fun(pop(i,:)); %适应度
end
%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
% Vmax=1.0008^(-i);
% Vmin=-1.0008^(-i);
for j=1:sizepop
GW=Wstart-(Wstart-Wend)*i/maxgen;
V(j,:) = V(j,:) +c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax))=Vmax;
V(j,find(V(j,:)<Vmin))=Vmin;
%种群更新
pop(j,:)=pop(j,:)+V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)<popmin))=popmin;
%适应度值
fitness(j)=fun(pop(j,:));
end
for j=1:sizepop
%个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
a= fitnesszbest;
end
%% 结果分析
figure
plot(log10(yy),'k--','LineWidth',1.2)
legend('原始粒子群算法')
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
hold on
%% 结果分析
plot(log10(yy),'k-','LineWidth',2)
legend('CPSO')
title('Sphere','fontsize',12);
xlabel('Function Evaluations','fontsize',12);ylabel('Best Fitness','fontsize',12);
set(gcf,'Position',[100 100 480 380]);
hold on
function y = fun(x)
%函数用于计算粒子适应度值
%x input 输入粒子
%y output 粒子适应度值
y=0;
for i=1:30
y=y+x(i)^2;
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询