clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
pop_size=1000;%种群大小,即粒子数量
part_size=2;%粒子维数
max_gen=2000;% 最大迭代次数
%region=zeros(part_size,2);%设定解空间范围
%region=100*[-3,3;-3,3];%每一维设定不同的范围,因为粒子是5维,共有2个目标函数
%rand('twister',sum(100*clock));%重置随机数发生器状态
%初始化当前位置和速度
arr_present=ini_pos(pop_size,part_size);%arr_present也是part_size+1列,最后一列是对应向量的适应度函数
v=ini_v(pop_size,part_size);
w_max=0.9;%权重系数的最大值
w_min=0.4;%权重系数的最小值
c0=1;
%计算原始种群的适应度,及初始化
pbest=arr_present(:,1:part_size);%初始化各个粒子的最优值
pbest1(:,1:part_size+2)=arr_present(:,1:part_size+2);%个体极值是没有任何关系的,只是在更新速度的时候用的个体极值是他们的线性关系的组合,但是那个全局极值是没有任何实际含义的
pbest2=pbest1;
gbest(1,1:part_size)=rand(1,part_size);
a=gbest(1,1:part_size);
gbest(1,part_size+1)=fitness1(a);
gbest(1,part_size+2)=fitness2(a);%这个gbest尽管没有没有实际含义,最后可以用这个作为最优解
gbest1(1,1:part_size)=gbest(1,1:part_size);
x=gbest;
gbest1(1,part_size+1)=fitness1(x);
gbest2=gbest1;
recordgbest=gbest;
%开始进化,直到最大代数截止
for i=1:max_gen
grid on;
w=w_max-(w_max-w_min)*i/max_gen;%线性递减权重
c1=c0+i/max_gen;%c是加速因子定义,用了这个以后,粒子收敛的速度更快
%)当前进化代数,对粒子进行更新和评价
for j=1:pop_size
v(j,:)=w.*v(j,:)+c1.*rand.*(pbest(j,1:part_size)-arr_present(j,1:part_size))+c1.*rand.*(gbest(1,1:part_size)-arr_present(j,1:part_size));%gbest适应值有值了,可是对应的自变量向量如何选择呢???????
%判断v的大小,限制v的绝对值小于5
%c=find(abs(v)>5);%最大速度设置,找出速度大于5的向量的标号
%v(c)=sign(v(c))*5;%如果速度大于5,就设置成5
arr_present(j,1:part_size)=arr_present(j,1:part_size)+v(j,1:part_size);%粒子位置更新
x=arr_present(j,1:part_size);
arr_present(j,part_size+1)=fitness1(x);%适应度1,保存到最后一列
arr_present(j,part_size+2)=fitness2(x);%适应度1,保存到最后一列
if arr_present(j,part_size+1)<pbest1(j,part_size+1)
pbest1(j,:)=arr_present(j,1:part_size+2);
pbest(j,1:part_size)=pbest1(j,1:part_size)*(1-i/max_gen)+pbest2(j,1:part_size)*i/max_gen;
%pbest(j,1:part_size)=pbest1(j,1:part_size)*1/2+pbest2(j,1:part_size)*1/2;
end
if arr_present(j,part_size+2)<pbest2(j,end)
pbest2(j,:)=arr_present(j,1:part_size+2);
pbest(j,1:part_size)=pbest1(j,1:part_size)*(1-i/max_gen)+pbest2(j,1:part_size)*i/max_gen;
%pbest(j,1:part_size)=pbest1(j,1:part_size)*1/2+pbest2(j,1:part_size)*1/2;
end
if arr_present(j,part_size+1)<gbest1(part_size+1)
if x(1)>=-10&&x(1)<=10&&x(2)>=-10&&x(2)<=10%%??
gbest1=arr_present(j,1:part_size+1);%#ok<AGROW> %更新全局极值是通过当前位置来的,而不是通过个体极值来的
gbest(1,1:part_size)=gbest1(1,1:part_size)* i/max_gen+gbest2(1,1:part_size)*( 1-i/max_gen);%gbest只有位置维数的列数,没有适配值
a=gbest(1,1:part_size);
gbest(1,part_size+1)=fitness1(a);
gbest(1,part_size+2)=fitness2(a);%这个gbest尽管没有没有实际含义,最后可以用这个作为最优解
end
end
if arr_present(j,part_size+2)<gbest2(part_size+1)
if x(1)>=-10&&x(1)<=10&&x(2)>=-10&&x(2)<=10
gbest2(1:part_size)=arr_present(j,1:part_size);
gbest2(part_size+1)=arr_present(j,part_size+2);%更新全局极值是通过当前位置来的,而不是通过个体极值来的
gbest(1,1:part_size)=gbest1(1,1:part_size)* i/max_gen+gbest2(1,1:part_size)*( 1-i/max_gen);%gbest只有位置维数的列数,没有适配值
a=gbest(1,1:part_size);
gbest(1,part_size+1)=fitness1(a);
gbest(1,part_size+2)=fitness2(a);%这个gbest尽管没有没有实际含义,最后可以用这个作为最优解
end
end
end
recordgbest(i,:)=gbest;
end
best_recordf1=recordgbest(:,part_size+1);
best_recordf2=recordgbest(:,part_size+2);
for k=1:pop_size
pg=arr_present(1,:);
if pg(1,part_size+1)>=arr_present(k,part_size+1)&&pg(1,part_size+2)>=arr_present(k,part_size+2)
pg=arr_present(k,:); %最后得到的所有粒子的位置中最好的位置
end
end
PSOgbest=gbest;
PSOarr_present=arr_present;
PSOgbestrecord=pg;
best_recordf3=arr_present(:,part_size+1);
best_recordf4=arr_present(:,part_size+2);
best_recordf5=arr_present(:,1);
best_recordf6=arr_present(:,2);
subplot(1,3,1),plot(best_recordf1,best_recordf2,'.r',pbest1(:,part_size+1),pbest1(:,part_size+2),'.b',pbest2(:,part_size+1),pbest2(:,part_size+2),'.g');%gbest对应的历史最优值组成的曲线
subplot(1,3,2),plot(best_recordf3,best_recordf4,'.b');%粒子迭代完之后的对应的两个目标函数值对应曲线
subplot(1,3,3),plot(best_recordf5,best_recordf6,'.b');%二维函数中粒子迭代完之后对应的位置
grid on;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2022a,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:多目标优化。 3.内容:基于PSO粒子群优化算法的多目标优化matlab仿真。 目标函数为 function fit=fitness1(x) fit=1-exp(-(x(1)-1)^2-(x(2)+1)^2); 和 function fit=fitness2(x) fit=1-exp(-(x(1)+1)^2-(x(2)-1)^2); 程序运行的时候会出现速度最后非常非常小,所有粒子全聚集到一起 约束问题如何解决 每个粒子的最优解,是不是需要约束的限制 整个粒子的最优解是不是也需要约束的限制 粒子过分集中,如何将粒子打散 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于PSO粒子群优化算法的多目标优化matlab仿真.rar (10个子文件)
仿真操作录像0007.avi 38.7MB
11.jpg 41KB
PSO优化算法matlab仿真
g3.m 119B
ini_v.m 108B
fitness2.m 60B
ini_pos.m 323B
Runme.m 5KB
Region_in.m 291B
fitness1.m 74B
g1.m 46B
共 10 条
- 1
fpga和matlab
- 粉丝: 15w+
- 资源: 2548
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页