我正试图为我的问题找到一个名字,所以在编写解决问题的算法时不必重新发明轮子。
我说有2,000个二进制(行)向量,我需要从中选择500个。在选取的样本中,我进行列求和,并且我希望我的样本尽可能接近列和的预定义分布。我将处理20至60列。
一个小例子:
在向量之外:
110
010
011
110
100
Run Code Online (Sandbox Code Playgroud)
我需要选择2来获取列总和2, 1, 0
。解决方案(在这种情况下准确)是
110
100
Run Code Online (Sandbox Code Playgroud)
首先我对这个问题做一些假设:
我能想到的最接近的问题是子集和问题,它本身可以被认为是背包问题的一个特例。
然而,这两个问题都是 NP 完全问题。这意味着没有多项式时间算法可以解决它们,尽管很容易验证解决方案。
如果我是你,这个问题的两个最有效的解决方案是linear programming
和machine learning
。
根据您在此问题中优化的列数,通过线性编程,您可以控制解决方案的微调程度,以换取时间。您应该阅读此内容,因为这相当简单且高效。
使用机器学习,您需要大量数据集(向量集和解决方案集)。您甚至不需要指定您想要什么,很多机器学习算法通常可以根据您的数据集推断出您希望它们优化的内容。
两种解决方案各有利弊,您应该根据情况和问题集自行决定使用哪一种。