用于找到具有总X和Y的总组合值的最小对象集的算法

时间:2017-07-14 00:39:43

标签: algorithm math

我有一组对象(大约100个),每个对象都有一个浮点值(实际上从-10000到10000,但让我们假设没有限制)。

我的目标是找到这些对象的最小集合(尽可能少),其中总变量值将在变量X和Y之间。

我相信我可以通过一些进化算法解决这个问题,但我想知道是否有更简单的数学解决方案吗?

我使用PHP编程,但我不相信这些相关,我可以使用算法/伪代码的任何想法。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的问题看起来像knapsack problem的变体。没有简单的方法可以在一个规模上解决这个问题 - 暴力可以使用最小的实例。对于中等大问题,您可以使用dynamic programming。一般情况下,您可能正在使用mixed integer programming,各种metaheuristicsconstraint satisfaction

我认为,最后一个应该是最适合你的,例如,考虑Minizinc。它非常易于使用,并且在运行时/内存消耗方面非常高效。例如,考虑解决背包问题的this示例。

因此,您只需生成问题的文本表示形式,将其提供给Minizinc并回读解决方案。

答案 1 :(得分:0)

使用Python,您可以安全地选择组合路线。

组合是可迭代的:每次迭代组合时,它都会返回一组唯一的对象。

您可以从非常小的一组(2,3,4个物体......)开始,然后执行值的总和并进行检查。

要执行值的总和,我建议你看一下numpy.arrays,它们会加快这个过程。

在后面,组合使用阶乘算术,这意味着组合越大,可能的组合几乎呈指数。

更多信息:

Numpy Array

Itertools Combinations

这将以强大的力量结束,您可以期望每秒检查数千种组合。我不知道这是否是最好的算法,但它很简单且有效。

示例代码:

from itertools import combinations
import numpy

a = [1,-2,3,-4,5,-6,7,-8] # Any list of float or integers...
min = 5
max = 10
size = 3
c = combinations(a, size)
for combi in c:
 a = numpy.array(combi)
 if (a.sum() in range(min, max)):
  print('Result found for '+str(combi))
  break