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.  ]]

大家对比下上图树中结果可知正确。

posted @ 2022-06-24 14:26  Wei_Xiong  阅读(898)  评论(0编辑  收藏  举报
WX:我是来搞笑的