NSGA-II入门
NSGA-II入門
覺得有用的話,歡迎一起討論相互學習~
參考文獻1
參考文獻2
白話多目標
多目標中的目標是個瓦特?
- 多目標即是優化問題中的優化目標在2個及以上,一般這些優化的目標都存在著矛盾,例如:我要買一個又便宜又漂亮又性能好的車的時候,價格,外觀, 性能 這就是一個典型的多目標問題,我們必須在商品的價格,外觀和性能上做出取舍,畢竟外觀漂亮性能強勁的車型往往意味著高的價格。
多目標中的支配是個瓦特?
- 我們經常聽說 支配與非支配解集 ,那么什么叫做支配,什么叫做非支配呢?還是上面汽車的例子,如果汽車A價格30萬,外觀A等,性能A等;汽車B價格40萬,外觀A-等,性能A-等,就說汽車A支配了汽車B。如果有一輛汽車C價格20萬,外觀B等,性能B等,相較于汽車A,雖然C的外觀和性能都比汽車A要差,但是其價格上比汽車A要低,從價格這個評價標準上來看,汽車C是要優于汽車A的,所以說汽車C和汽車A是屬于一個非支配的關系。即 當A所有目標都優于B時,就說A支配了B,否則A和B就是一個非支配的關系 ,而在NSGA-II中,種群中所有不被任何其他解支配的解構成了非支配前沿(Pareto最優解)
多目標遺傳算法與遺傳算法的區別-選擇的方法不同
多目標遺傳算法與遺傳算法的聯系-交叉變異的方法相同
- 遺傳算法中和多目標遺傳算法中最大的不同在于 選擇 的過程,遺傳算法中通過適應度函數進行種群中個體的選擇,而多目標遺傳算法中根據 非支配的Rank值和擁擠度進行排序 選擇保留的個體。
- 對于Rank值,首先我們將解集中的 所有不能被任何其他的解支配的解集 (即最厲害最牛的解)挑出來設為Rank0,然后將這些解從解集中排除,考慮剩下所有解中 所有不能被任何其他的解支配的解集 挑出來設為Rank1,…通過支配關系將解集中所有的解進行排序,得到所有解的等級。我們認為 Rank值越小的解越好。
- 在選擇的過程中我們設定 每次迭代種群中個體的數量N是定值 ,而每次挑選時,先挑選表現最好的解–即Rank0的解,接著是Rank1,Rank2,Rank3…,但是我們總會出現 ∑ i = 0 n ? 1 R a n k i < N \sum^{n-1}_{i=0}Rank_i<N i=0∑n?1?Ranki?<N 而 ∑ i = 0 n R a n k i > N \sum^{n}_{i=0}Rank_i>N i=0∑n?Ranki?>N 的情況,為了判定同一個Rank層的解的好壞,設置 擁擠度 作為同Rank非支配解集中解的評價標準。
- 遺傳算法有自動收斂的性質,所以為了保證解的多樣性,我們往往希望同一Rank層中的解能夠相互分開,所以設置了 擁擠度 這個概念,認為 解之間距離開的解比解之間距離小的解更好 擁擠距離排序用于保持解的多樣性。 每個個體的擁擠距離是通過計算與其相鄰的兩個個體在每個子目標函數上的距離差之和來求取,即下圖中虛線四邊形的長和寬之和
- 每個父代 P t P_t Pt?都會通過 交叉和變異 (其中多目標遺傳算法中的交叉和變異與傳統遺傳算法中的交叉和變異沒有區別) 生成子代 Q t Q_t Qt? ,父代和子代的所有個體集合稱為 R t R_t Rt? ,先通過 非支配排序 選出 R t R_t Rt?中的合適個體,再通過 擁擠度排序 選出同一Rank層中的個體,使新的種群集合 P t + 1 P_{t+1} Pt+1? 的個體數目為N。 這一過程常常會使用以下兩種圖進行表示:
學術多目標
NSGA-II算法的今生前世
在遺傳算法在解決多目標優化遇到瓶頸時,許多學者花費了不少時間和精力在多目標優化的遺傳算法上,Goldberg首先將Pareto最優解的概念與適應度值概念相關聯,即將Pareto非支配排序分層的概念與適應度聯系,排序的層次低,則其分層中個體的適應度值較高,使算法能夠朝著Pareto最優前沿進化,最終輸出Pareto最優解集。在提出此概念后,學者們陸續提出了一系列多目標遺傳算法,如SPGA、NPGA、FFGA、NSGA等等。但是最能代表Goldberg思想的算法是基于非支配排序的遺傳算法,即NSGA(Non—dominated Sorting Genetic Algorithm)。
科學家Srinivas和Deb在前人研究基礎上,于1994年首先提出了非支配排序遺傳算法的概念。其算法最主要的思想是 將所有的個體進行分層,并且對每個個體都設置個體虛擬適應度值同一層中的每個個體虛擬適應度值相同,層級數越低,其適應度值越高,遺傳到下一代的概率也就越大。為了使得到的結果沿Pareto前沿均勻分布,就需要保證非支配層中個體保持多樣性,為了保持非支配層中個體多樣性,Srinivas等人采用了共享函數法。
采用非支配排序的遺傳算法在多目標優化中得到了廣泛應用,但是,隨著其使用越廣泛,其算法也暴露出了一些缺陷。 首先,NSGA算法的時間復雜度高,為 O ( m N 3 ) O(mN^3) O(mN3),m代表目標數,N表示種群規模大小,當種群數目過多時,其排序過程必將耗費更多時間,降低了搜索效率。再者,NSGA算法沒有考慮精英策略,精英策略能提高算法的計算速度,也能將優秀個體保存下來。更為重要的一點是,其共享半徑參數是人為設定的,而共享半徑設置不合理,將對計算結果產生非常大的影響。
為了克服非支配排序遺傳算法的以上弊端,Deb等學者于2000年對NSGA算法進行了改進,提出了 基于快速非支配排序的遺傳算法NSGA-II,相比NSGA來說,NSGA-II有如下不同點 :
- 計算復雜度 在NSGA計算中,其排序的復雜程度為 O ( m N 3 ) O(mN^3) O(mN3)(m代表目標函數個數,N表示種群規模),而采用NSGA—II算法,其計算復雜程度將為 O ( m N 2 ) O(mN^2) O(mN2),計算效率得到了提升。
- 算法中加入了精英策略 其實現思想是:父代個體通過遺傳操作產生予代個體后,選擇操作選擇的個體數N需要從父代和子代個體競爭,從中選出最好的,這樣做的目的就是能將最優秀的個體保存下來。
- 相比NSGA算法提出的共享半徑,NSGA—II采用了擁擠度的概念 在同一非支配層中,通過判斷個體周圍的擁擠程度,改善同一支配層面的種群多樣性,不需要設定比較“敏感”的共享半徑參數,對提高算法效率和保持種群多樣性上優于NSGA算法。
NSGA-II 該算法求得的 Pareto 最優解分布均勻,收斂性和魯棒性好,具有良好的優化效果,是求解多目標優化問題的一種新思路
非支配排序
- 時間復雜度 m 個個體和種群中的其他個體進行支配關系比較,是否支配其他全部個體,復雜度為O(mN);循環進行直到等級1 中的非支配個體全部被搜索到,復雜度為 O ( m N 2 ) O(mN^2) O(mN2);最壞的情況下,有N個等 級,每個等級只存在一個解,復雜度為 O ( m N 3 ) O(mN^3) O(mN3)
- 算法流程 NSGA—II排序時需要設定兩個參數用 n i n_i ni?表示種群中所有個體中支配個體i的數目, S i S_i Si?表示種群中個體被個體i支配的個體集合。NSGA-II對種群個體進行非支配排序的步驟如下:
- 找出種群中非支配解的個體,即 n i = 0 n_i=0 ni?=0的個體,將非支配個體放入集合F1中。
- 對于F1中的每個個體,找出集合中每個個體所支配個體集合 S i S_i Si?,對 S i S_i Si?中的個體l,對 n l n_l nl?進行減1操作,令 n l = n l ? 1 n_l = n_l-1 nl?=nl??1 ,若 n l n_l nl?大小為0,則將此個體存放在集合H中。這個步驟的目的是去掉已經挑選出的前沿中個體的影響,方便對剩下的個體進行排序。
- 定義集合F1為第一層非支配集合,并為F1中每個個體標記相同的非支配序列 i r a n k i_{rank} irank?。
- 對集合H中的個體,按照以上步驟1、步驟2和步驟3操作,直至將所有個體分層。
擁擠度排序
- 目的 同一層非支配個體集合中,為了保證解的個體能均勻分配在Pareto前沿,就需要使同一層中的非支配個體具有多樣性,否則,個體都在某一處“扎堆”,將無法得到Pareto最優解集。NSGA—II采用了擁擠度策略,即計算同一非支配層級中某給定個體周圍其他個體的密度。
- 每個個體的擁擠距離是通過計算與其相鄰的兩個個體在每個子目標函數上的距離差之和來求取。 D i = ( f i + 1 , 1 ? f i ? 1 , 1 ) + ( f i ? 1 , 2 ? f i + 1 , 2 ) D_i=(f_{i+1,1}-f_{i-1},1)+(f_{i-1,2}-f_{i+1,2}) Di?=(fi+1,1??fi?1?,1)+(fi?1,2??fi+1,2?) ,即下圖中虛線四邊形的長和寬之和。
NSGA-II排序算法
- 當每個個體擁有這兩個屬性,就可以通過這兩個屬性判定任意兩個個體的支配關系。當兩個體沒有處在同一非支配層級時,通過判斷 i r a n k i_{rank} irank?大小,確定個體優劣, i r a n k i_{rank} irank?值小的個體比 i r a n k i_{rank} irank?大的個體更優;當兩隨機個體處于同一非支配層級時,依據個體擁擠度判定個體孰優孰劣,個體擁擠度大的比個體擁擠度小的個體更優
NSGA-II算法流程
NSGA-II算法流程-達到一定進化代數停止
首先種群初始化,通過快速非支配排序、選擇、交叉以及變異操作后得到初始種群,種群中個體數為N;將父代種群和子代種群合并,再通過排序、擁擠度計算得出下一代種群個體;得出新一代種群后根據遺傳操作繼續產生下一代,如此反復,直到達到進化最大代數停止。
NSGA-II算法流程-算法收斂停止
- 創造一個初始父代種群 P 0 P_0 P0? 使用交叉和變異操作產生子代種群 Q 0 Q_0 Q0?
- 對 P 0 P_0 P0? h和 Q 0 Q_0 Q0? 組成的整體 R 0 R_0 R0? 進行非支配排序,構造所有不同等級的非支配解集 Z 1 , Z 2 , Z 3 . . . Z_1,Z_2,Z_3 … Z1?,Z2?,Z3?...
- 對分好等級的非支配解集進行擁擠距離排序,根據適應度高低得到前 N 個解,構成下一次迭代的父代種群 P 1 P_1 P1?
- 重復上述 3 個步驟,直到結果收斂
總結
- 上一篇: [UWP]依赖属性2:使用依赖属性
- 下一篇: 中国打印出货量创历史新高:墨盒式打印机同