我有一组对象(大约100个),每个对象都有一个浮点值(实际上从-10000到10000,但让我们假设没有限制)。
我的目标是找到这些对象的最小集合(尽可能少),其中总变量值将在变量X和Y之间。
我相信我可以通过一些进化算法解决这个问题,但我想知道是否有更简单的数学解决方案吗?
我使用PHP编程,但我不相信这些相关,我可以使用算法/伪代码的任何想法。
谢谢!
答案 0 :(得分:2)
您的问题看起来像knapsack problem的变体。没有简单的方法可以在一个规模上解决这个问题 - 暴力可以使用最小的实例。对于中等大问题,您可以使用dynamic programming。一般情况下,您可能正在使用mixed integer programming,各种metaheuristics或constraint satisfaction。
我认为,最后一个应该是最适合你的,例如,考虑Minizinc。它非常易于使用,并且在运行时/内存消耗方面非常高效。例如,考虑解决背包问题的this示例。
因此,您只需生成问题的文本表示形式,将其提供给Minizinc并回读解决方案。
答案 1 :(得分:0)
使用Python,您可以安全地选择组合路线。
组合是可迭代的:每次迭代组合时,它都会返回一组唯一的对象。
您可以从非常小的一组(2,3,4个物体......)开始,然后执行值的总和并进行检查。
要执行值的总和,我建议你看一下numpy.arrays,它们会加快这个过程。
在后面,组合使用阶乘算术,这意味着组合越大,可能的组合几乎呈指数。
更多信息:
这将以强大的力量结束,您可以期望每秒检查数千种组合。我不知道这是否是最好的算法,但它很简单且有效。
示例代码:
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