IGD反轉世代距離-多目標優化評價指標概念及實現
覺得有用的話,歡迎一起討論相互學習~
參考資料
多目標進化優化[1]-鄭金華老師,鄒娟老師著
實驗室人手一本人人必看的寶藏圖書!
- IGD(Inverted Generational Distance)是常用的可以同時評價算法收斂性和多樣性的指標,中文名反轉世代距離。
從GD到IGD
-
先被提出的用於評價多目標算法收斂性的指標是GD(Generational Distance),用來表示\(PF_{known}\)與\(PF_{true}\)之間的間隔距離,計算式被定義為:
\[GD=\frac{(\sum^{n}_{i=1}d^p_i)^{1/p}}{n} \]
其中n表示\(PF_{known}\)中點的個數,p表示目標維數,\(d_{i}\)表示目標空間中得到的 每個點 \(PF_{known}\) 距離 \(PF_{true}\) 參考點(類似於答案)的最近歐式距離的平均值 。若此值為0,則表示 \(PF_{known} == PF_{true}\).
-
歐式距離的平面版本初中我們就學過^ _ ^
-
舉個[1]中二維目標的例子
計算可得:
\[d_1=\sqrt[2]{(2.5-2)^2+(9-8)^2} \]
\[d_1=\sqrt[2]{(3-3)^2+(6-6)^2} \]
\[d_1=\sqrt[2]{(5-4)^2+(4-4)^2} \]
-
因此,\(PF_{known}\) 和 \(PF_{true}\) 之間的間隔距離為 $$GD=\sqrt[2]{1.1182+02+1^2}/3=0.5$$
-
值得一提的是,某種意義上可以這樣認為: GD是從自己得到的每個點指向最近的真實前沿上的點的歐式距離的平均 。
IGD
- 可以發現,GD的方式只能夠評價算法的收斂性 。為了同時評價算法的 收斂性和多樣性 ,IGD被提出了。區別在於 IGD是從真實帕累托前沿上的參考點射向算法的得到的解,即是從\(PF_{true}\) 射向 \(PF_{known}\) 的 ,因此被稱為 反向世代距離 。
- 思路是:從真實帕累托前沿上均勻取點,對於 真實前沿上的每個點找到已知帕累托前沿上距離最近的點 ,將這些點之間距離相加並取平均。和GD略微不同的是沒有開方的操作!只用取平均就行,分母是從真實前沿上取點的個數。
-
\[IGD=\frac{\sum^{n}_{i=1}|d_i|}{n} \]
其中n表示\(PF_{true}\)中點的個數,\(d_{i}\)表示目標空間中 真實前沿的每個點距已知前沿的最近歐式距離 。此值越小,意味着算法的綜合性能越好。
關於IGD的解釋
- 由於兩點間的距離是可逆的,A->B的距離和B->A的距離相等,那么真實前沿上點到已知前沿的最小值必定包含了,已知前沿到真實前沿的最小值(IGD),假設真實前沿上的點比已知前沿的點多 這種觀點是錯的,因為邊是有向的,從一個頂點出發只能連接一另一端的點,而不能同時連接兩個終點。 GD和IGD並不是從所有邊集合中挑選出其中距離最短的邊,而是從指定頂點出發的距離最短的有向邊!
- 例如,顯然A-D和A-B是最短的兩條邊。計算GD時,遍歷PFknown,會選擇A->D,然后到B,B會選擇B->D。計算IGD時,遍歷PFtrue,C會選C->A,即使A->D更短,但是對於C而言並不會考慮A的感受,D會選擇D->B,即時D->A也很短,但是D只能做出最好的選擇,很明顯D->B比D->A更好。而為了避免同一個點指向兩個端點,即取最小的距離,使用循環的方法。在找到最近點后就會跳過該點進入下一個點的查找最近距離的步驟
- 也直接引用鄭金華老師書[1]中的例子進行介紹。
- 為什么選擇從PFtrue出發放出射線呢?還是因為PFtrue是分布均勻的答案,從PFtrue出發才能讓一個PFknown不僅僅是 靠向PFtrue還要分布均勻 ,因此PF true中采樣點的數目十分重要,采樣點越多,分布越均勻結果才越精確可靠 。
IGD實現
matlab
IGD = 0;% 初始化IGD為0
for i = 1:51 % 遍歷PFtrue中的所有電
% data中保存的是真實PF
% data(i,1)表示第i行的第1列數
% 得到一個單元格中數值是data(i,)形狀是(pop2,1)的長條狀列向量
c1 = data(i,1)*ones(pop2,1);% 第一個目標的目標值
c2 = data(i,2)*ones(pop2,1);% 第二個目標的目標值
%對於一個參考點,使用所有實際點在兩個目標上對應項相減后分別在兩個目標上平方
% sum(,2)按行相加
% min 取最小的距離開方
IGD = IGD + sqrt(min(sum((T2_data-[c1 c2]).^2,2)));
end
% 對PFtrue上所有點取平均
store(2,generation)=IGD/51;