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. ]]
大家对比下上图树中结果可知正确。