【发布时间】:2017-06-12 06:44:28
【问题描述】:
我有 50 个列表,每个列表都用 0 和 1 填充。当您考虑所有 50 个列表汇总在一起时,我知道 1 的总体比例。我想找出汇集在一起最接近 1 的整体比例的 10 个列表。
我要最小化的函数是 abs(mean(pooled subset) - mean(pooled full set))
对于那些了解熊猫的人:
在熊猫方面,我有一个如下的数据框
以此类推,总共有 50 个标签,每个标签的值都在 100 到 1000 之间。 我想找到最小化 d 的 10 个标签的子集,其中 d
d = abs(df.loc[df.label.isin(subset), 'Value'].mean() - df.Value.mean())
我尝试将动态编程解决方案应用于背包问题,但问题是 每个列表(标签)对最终样本均值的贡献会根据您之后包含的其他列表而变化 (因为它们会以不可预知的方式增加样本量)。这就像背包问题,你挑选的每一个新物品都会改变你之前挑选的物品的价值。棘手。
有没有更好的算法来解决这个问题?
【问题讨论】:
-
有趣的问题。我不认为动态编程方法会起作用,因为似乎有时通过组合子问题的两个非最优解来获得最优解,所以(我不认为)你有最优的子结构属性动态规划的理论基础。如果它太大而无法暴力破解(并且如果没有巧妙的转换将其简化为标准背包或类似问题),那么遗传算法方法或类似的启发式方法可能会很好。
-
我实际上相信这可以表述为(通过一些努力:需要一些线性化)作为混合整数规划 (MIP) 模型。
-
Here 是我的 MIP 公式。并非完全微不足道。
-
@ErwinKalvelagen 不错。也许您可以将其发布为答案。也许在这里给出一个概述并包含详细信息的链接。
-
@JohnColeman 完成。我省略了重要的东西,但我认为仍然很有趣。
标签: python pandas numpy optimization knapsack-problem