EDA365电子论坛网

标题: NSGA-Ⅱ算法C++实现(测试函数为ZDT1) [打印本页]

作者: pulbieup    时间: 2020-9-24 14:02
标题: NSGA-Ⅱ算法C++实现(测试函数为ZDT1)
本帖最后由 pulbieup 于 2020-9-24 14:04 编辑 / }1 N) r8 h7 ^* ~4 N& x
$ q: h2 g, y8 w
在看C++实现之前,请先看一下NSGA-II算法概述:NSGA-II多目标遗传算法概述
/ s% i+ k% w( {1 {3 Q" Q1 `
1 A% P& \& T. J- P% u# n1 I
( u# l9 s* b+ |" T$ ^4 e5 DNSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:- d, q- @) {) G* d6 c
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;6 d1 q0 |4 G) k' Y5 M0 g; y
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;& g* S6 P! i: `0 o1 B6 D
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
" p2 p! t" ^7 ^/ o, |( [1 j- Y% R, _; |* o- _! Q) D0 S
头文件:$ i$ w0 Z- |- A2 {
* {4 b# B) Y8 l: d7 H8 \; ^
( d% j2 i! w9 }

" r: Z. m3 o# [" n, A个体的类声明:
) {$ e% u2 z4 ^8 U7 c9 p
0 K; \" y6 H  g( Q, Q& |4 j! [) E! H8 m/ K+ y( g, m

8 f% E  V2 J& X% u# @0 m, c群体的类声明:6 ~  s2 H- z* ~5 h9 U: f* F
& }8 M5 b" z' ?) ~8 L4 d4 s2 }% a

8 y, U" x& U! K; X% g0 R4 z
: p, J. b) G3 D0 N. f8 p全局变量及部分函数声明:
# s. A( O$ |5 s4 n" Q3 K; _2 x
- ^0 h) k; c0 d5 \( s8 s( a1 l8 ]
8 a! L; @. Z' B/ |6 i8 ^
关于排序函数qsort
- t4 f) h  u. L1 V! w! x
1 r1 _6 _% V% M% qvoid qsort( void *base, size_t num, size_t width, int (__cdecl *compare )% ^% l. c) `/ f1 s; ~3 ^
利用qsort对F数组按照cmp3排序
( m3 B$ x3 x+ n4 A( K0 Q2 X0 @; h6 A7 W
1 V! {# E2 A' g6 p, d
& I$ p  C( I' g
群的初始化:. C" ~, M% ?( m2 t& [2 T
0 ~/ _3 ?, E- e( Q0 V* @

- I& a' U' V' E( H
! P* U  C+ v1 x4 X个体初始化:" l" o: u' G& |9 c: l
# K8 s) t3 i+ T
8 s0 R2 j: U" d
2 R4 U/ x9 h* [! O$ D3 U0 g
- f& c4 d! g: F; u/ e, x7 N4 n
利用二进制锦标赛产生子代:
* H* R* w# J$ Z& j1 h
( ?$ m( [+ v1 I' Y6 ~& ]1、随机产生一个初始父代Po,在此基础上采用二元锦标赛选择、交叉和变异操作产生子代Qo, Po 和Qo群体规模均为N/ I" C8 f. b- k& b8 \8 }
2、将Pt和Qt并入到Rt中(初始时t=0),对Rt进行快速非支配解排序,构造其所有不同等级的非支配解集F1、F2……..
6 O! T7 _0 V) K$ Z- v/ G/ n4 L/ w3、按照需要计算Fi中所有个体的拥挤距离,并根据拥挤比较运算符构造Pt+1,直至Pt+1规模为N,图中的Fi为F3
, A+ r$ V* Y: o6 y& j3 D# A  U
7 l+ d+ P; F5 f9 s! i/ w 1 P+ Z# K7 H8 P2 p1 J. V
6 C6 Y& `0 F! C& j0 k
1 |: ]; @' e% w& W/ Y

: ?5 r7 T# l7 O
7 d- v' ?" j- C0 O( X0 b  }; u7 r$ b
$ `' @; [( q1 g) E! o2 i  Q+ H' O* Z+ g. c' z! M1 K
ZDT1问题函数值的计算:
, h; Z2 e$ f/ G8 p6 y9 ]
$ ^# z( w; w1 B4 q* c 7 X" Y+ X5 E* ?
. r  B5 J) t4 k/ F: u; K. P
& r( t% p1 q" B3 A0 ]
& g/ E1 l& a9 V# B; {6 H7 [0 Z
判断目标函数值是否被支配:
2 p- L8 D4 f0 b  i1 u  t  J  c$ J& f) i
( F& ]' F, f4 |8 K; ?& T; Q
" r6 }; i% Q4 a( W4 M! x
7 {- P$ H+ P& O7 N0 j( _1 z快速非支配排序法:重点!!!4 B& D( Z  j4 y) o* K. Y; _9 n. e

2 a8 r. @0 l0 V* {0 Z' O0 y2 y/ I. R" f5 Z2 d  R
1 O# x7 `1 S% I4 ]- H! {
# H6 w& U' L) S  n4 [& E& j6 b
计算拥挤距离:重点!!!具体解释见其他文章!!!
- i; m: A, \. S& G" C' J1 q$ `, D* e/ t: Q, I9 L1 J
0 a* B/ C6 w% w  ?
) ~3 _4 m1 [7 E- y' e7 A3 A0 c
. _! a* L8 i: n/ p
" B5 o3 O" K0 l& s
/ B4 k( E- I# ]; f# R
采集多样性的选择:
+ ^4 w( D- ?+ w: |( x
( Q; y) i# O- g( ~
% d2 \* r) g6 e7 A1 M7 `3 H$ b2 ^7 J9 |$ i3 d
6 G6 W5 i" @! f9 {# T
主要操作函数:
3 n7 Y6 E8 ?+ w$ m4 ^# T; B& J1 v8 O! r; @

$ Z6 }5 ^% Z) N! I+ ]
$ l% o( K7 z; F1 U6 i9 \主函数:
2 e6 F% n& C, @. X% o
" ^! E- Y4 Y. D3 w6 f1 n% T) B8 s5 E& ?' b: c/ d7 C

! U; R  @6 p' C& k" ?* I$ |- C7 P: S. Q& D# {+ x+ r* C8 H4 B, p
ZDT1问题图像及前沿面。" R2 d" Y" w! ^, o

( l$ b; L* ]9 r1 Z; Y3 d$ I1 }% f

7 U# h1 p* _6 K& j/ k- U1 }8 K* G0 C' |: r! Y- G1 d
测试结果:
3 W( }) ]: h. ]6 \2 r* N3 T
作者: youOK    时间: 2020-9-24 14:51
NSGA-Ⅱ算法C++实现




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2