查找具有与完整集

时间:2017-01-26 17:34:06

标签: python pandas numpy optimization knapsack-problem

我有50个列表,每个列表都填充0s ans 1s。当你考虑所有50个列表汇集在一起​​时,我知道1的整体比例。我想找到10个列表,汇集在一起​​最符合1的整体比例。

我想要最小化的函数是abs(mean( pooled 子集) - mean( pooled full set))

对于那些了解熊猫的人

在pandas术语中,我有一个数据框如下

enter image description here

等等,共有50个标签,每个标签的数值范围在100到1000之间。 我想找到最小化d的10个标签的子集,其中d

d = abs(df.loc[df.label.isin(subset), 'Value'].mean() - df.Value.mean())

我尝试将动态编程解决方案应用于背包问题,但问题是每个列表(标签)对最终样本的贡献意味着更改,具体取决于您之后将包含的其他列表 (因为它们会以不可预测的方式增加样本量)。这就像背包问题,你选择的每一个新项目都会改变你之前选择的项目的价值。棘手。

有没有更好的算法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

有一种方法,有点麻烦,将此问题表述为MIP(混合整数规划)问题。

我们需要以下数据:

mu : mean of all data
mu(i) : mean of each subset i
n(i) : number of elements in each subset
N : number of subsets we need to select

我们需要一些二元决策变量

delta(i) = 1 if subset i is selected and 0 otherwise

优化问题的正式声明如下:

min | mu - sum(i, mu(i)*n(i)*delta(i)) / sum(i, n(i)*delta(i)) |
subject to 
     sum(i, delta(i)) = N
     delta(i) in {0,1}

此处sum(i, mu(i)*n(i)*delta(i))是所选项目的总价值,sum(i, n(i)*delta(i))是所选项目的总数。

目标显然是非线性的(我们有一个绝对值和一个除法)。这有时称为MINLP问题(混合整数非线性规划的MINLP)。虽然MINLP求解器随时可用,但我们实际上可以做得更好。使用一些体操,我们可以将此问题重新表述为线性问题(通过添加一些额外的变量和额外的不等式约束)。完整的详细信息为here。生成的MIP模型可以使用任何MIP求解器求解。

有趣的是,我们不需要模型中的数据值,只需n(i),mu(i)每个子集。