MOEAD算法均勻權向量的實現。任意維度,極簡-Python

問題分析思路參考:https://blog.csdn.net/xiao13yu14/article/details/79464582

但是在該博客中,轉化爲排列組合想法很好,但是實現起來不直觀,不簡單。

在本問題中,將問題轉化爲問題:”取m個整數,使其和爲N+m“

這樣轉換後,直接使用遞歸實現即可。遞歸深度爲m。python最大默認遞歸深度爲1000。

 1 import numpy as np
 2 
 3 def get_mean_vectors(sum, m):
 4     # 取m個數,數的和爲N
 5     if m == 1:
 6         return [[sum]]
 7     vectors = []
 8     for i in range(1, sum - (m - 1) + 1):
 9         right_vec = get_mean_vectors(sum - i, m - 1)
10         a = [i]
11         for item in right_vec:
12             vectors.append(a + item)
13     return vectors
14 
15 N = 4  # 每個維度上的間隔數。加上邊緣點就是5個點
16 m = 3  # 目標維度
17 
18 vectors = get_mean_vectors(N + m, m)
19 vectors = (np.array(vectors) - 1) / N
20 print(len(vectors))  # len = C m-1, N+m-1
21 print(vectors)

結果:

 1 15
 2 [[0.   0.   1.  ]
 3  [0.   0.25 0.75]
 4  [0.   0.5  0.5 ]
 5  [0.   0.75 0.25]
 6  [0.   1.   0.  ]
 7  [0.25 0.   0.75]
 8  [0.25 0.25 0.5 ]
 9  [0.25 0.5  0.25]
10  [0.25 0.75 0.  ]
11  [0.5  0.   0.5 ]
12  [0.5  0.25 0.25]
13  [0.5  0.5  0.  ]
14  [0.75 0.   0.25]
15  [0.75 0.25 0.  ]
16  [1.   0.   0.  ]]

大家對比下上圖樹中結果可知正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章