找回密码
 注册
关于网站域名变更的通知
查看: 387|回复: 1
打印 上一主题 下一主题

#技术风云榜#基于非支配排序的多目标PSO算法MATLAB实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-12 13:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
#技术风云榜#基于非支配排序的多目标PSO算法MATLAB实现
: @# a3 |8 t, e; x/ ?7 A+ P$ Z; w6 o! e- v
这一篇是Xue Bing在一区cybernetics发的论文,里面提出了两个多目标PSO特征选择算法,一个是NSPSO另一个是CMDPSO。
$ B+ s, V  K4 d4 b5 |. r5 u3 g
# h7 r9 c3 ]" |& H2 }  b伪代码+ v0 X' V/ X8 h. ^& [6 H8 p: Y  B; @
* T# L0 h  D5 I0 }2 u

" A0 d3 @8 `5 l& S& t
9 M, G1 R# y! v! u: Q" X0 M/ J) ^  W+ |3 G! D
具体流程! E1 f% m/ K. d( ]
  • ①划分数据集为测试集和训练集
  • ②初始化PSO算法
  • ③迭代开始
  • ④计算两个目标值(论文中是特征数和错误率)
  • ⑤非支配排序
  • ⑥拥挤距离度量并排序
  • ⑥对每个粒子从第一前沿面选择一个粒子作为gbest,更新当前粒子
  • ⑦调整粒子群
  • ⑧迭代结束返回
    ! s- O7 d. p* w: n7 |2 ?
  \1 o; x' N$ d, v) @4 t
MATLAB实现:" P  L: o& g9 q+ r0 u: h
NSPSO:
+ A/ U5 }# f- Y! P* f: l6 U* D$ e; B+ X3 u4 ?3 O# j
注意其中FSKNN是我的问题的评价函数,包含两个目标值,都存入到pfitness中# Z+ ]# D* i( m; y$ [: @1 I
4 ?6 w3 S$ }7 o: S8 @
  • function [solution,time,pop,pfitness,site,LeaderAVE] = NSPSO(train_F,train_L)
  • tic
  • global maxFES
  • dim = size(train_F,2);
  • FES = 1;
  • sizep = 30;
  • pop = rand(sizep,dim);
  • popv = rand(sizep,dim);
  • pfitness = zeros(sizep,2);
  • LeaderAVE = zeros(1,2);
  • while FES <maxFES
  •     Off_P = zeros(sizep,dim);
  •     Off_V = zeros(sizep,dim);
  •     ofitness = zeros(sizep,2);
  •     for i=1:sizep
  •         [pfitness(i,1),pfitness(i,2)] = FSKNN(pop(i,:),i,train_F,train_L);
  •     end
  •     Front = NDSort(pfitness(:,1:2),sizep);
  •     [~,rank] = sortrows([Front',-CrowdingDistance(pfitness,Front)']);
  •     LeaderSet = rank(1:10);
  •     solution = pfitness(LeaderSet,:);
  •     LeaderAVE(1) = mean(solution(:,1));
  •     LeaderAVE(2) = mean(solution(:,2));
  •     for i = 1:sizep
  •         good = LeaderSet(randperm(length(LeaderSet),1));
  •         r1 = rand(1,dim);
  •         r2 = rand(1,dim);
  •         Off_V(i,:) = r1.*popv(i,:) +  r2.*(pop(good,:)-pop(i,:));
  •         Off_P(i,:) = pop(i,:) + Off_V(i,:);
  •     end
  •     for i=1:sizep
  •             [ofitness(i,1),ofitness(i,2)] = FSKNN(Off_P(i,:),i,train_F,train_L);
  •     end
  •     temppop = [pop;Off_P];
  •     tempv = [popv;Off_V];
  •     tempfiness = [pfitness;ofitness];
  •     [FrontNO,MaxFNO] = NDSort(tempfiness(:,1:2),sizep);
  •     Next = false(1,length(FrontNO));
  •     Next(FrontNO<MaxFNO) = true;
  •     PopObj = tempfiness;
  •     fmax   = max(PopObj(FrontNO==1,:),[],1);
  •     fmin   = min(PopObj(FrontNO==1,:),[],1);
  •     PopObj = (PopObj-repmat(fmin,size(PopObj,1),1))./repmat(fmax-fmin,size(PopObj,1),1);
  •     % Select the solutions in the last front
  •     Last = find(FrontNO==MaxFNO);
  •     del  = Truncation(PopObj(Last,:),length(Last)-sizep+sum(Next));
  •     Next(Last(~del)) = true;
  •     % Population for next generation
  •     pop = temppop(Next,:);
  •     popv = tempv(Next,:);
  •     pfitness = tempfiness(Next,:);
  •     fprintf('GEN: %2d   Error: %.4f  F:%.2f\n',FES,LeaderAVE(1),LeaderAVE(2));
  •     FES = FES + 1;
  • end
  • [FrontNO,~] = NDSort(pfitness(:,1:2),sizep);
  • site = find(FrontNO==1);
  • solution = pfitness(site,:);
  • LeaderAVE(1) = mean(solution(:,1));
  • LeaderAVE(2) = mean(solution(:,2));
  • toc
  • time = toc;
  • end
    - V& Z3 }6 g7 l) z
2 P5 Y; {9 w8 t, t: m
4 w$ ~" \+ w; N( N+ O" R7 T* X
拥挤距离代码:2 j5 j3 ~0 d- g& h: d8 D% |

+ A( U$ f& o9 b7 W( Q* i( z& j
  • function CrowdDis = CrowdingDistance(PopObj,FrontNO)
  • % Calculate the crowding distance of each solution front by front
  • % Copyright 2015-2016 Ye Tian
  •     [N,M]    = size(PopObj);
  •     CrowdDis = zeros(1,N);
  •     Fronts   = setdiff(unique(FrontNO),inf);
  •     for f = 1 : length(Fronts)
  •         Front = find(FrontNO==Fronts(f));
  •         Fmax  = max(PopObj(Front,:),[],1);
  •         Fmin  = min(PopObj(Front,:),[],1);
  •         for i = 1 : M
  •             [~,Rank] = sortrows(PopObj(Front,i));
  •             CrowdDis(Front(Rank(1)))   = inf;
  •             CrowdDis(Front(Rank(end))) = inf;
  •             for j = 2 : length(Front)-1
  •                 CrowdDis(Front(Rank(j))) = CrowdDis(Front(Rank(j)))+(PopObj(Front(Rank(j+1)),i)-PopObj(Front(Rank(j-1)),i))/(Fmax(i)-Fmin(i));
  •             end
  •         end
  •     end
  • end! x" P4 @5 X  c
$ F* P" p! @. [5 r) x$ Y
8 m% c; V7 z9 L  h
    Truncation.m代码:
2 Q/ o( l$ ~6 @* E' _% t  t8 E6 A2 z+ i
  • function Del = Truncation(PopObj,K)
  • % Select part of the solutions by truncation
  •     N = size(PopObj,1);
  •     %% Truncation
  •     Distance = pdist2(PopObj,PopObj);
  •     Distance(logical(eye(length(Distance)))) = inf;
  •     Del = false(1,N);
  •     while sum(Del) < K
  •         Remain   = find(~Del);
  •         Temp     = sort(Distance(Remain,Remain),2);
  •         [~,Rank] = sortrows(Temp);
  •         Del(Remain(Rank(1))) = true;
  •     end
  • end
    : J3 |; e9 _3 |% ~3 m4 g
6 z- L; E) S, ]$ R6 M4 x
! W4 @# c) z2 D$ c
  2 g7 A0 m4 j& a5 b9 C

该用户从未签到

2#
发表于 2020-11-12 14:19 | 只看该作者
基于非支配排序的多目标PSO算法MATLAB实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-31 08:25 , Processed in 0.140625 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表