【问题标题】:Select N locations from list to maximize sum, with min distance constraint从列表中选择 N 个位置以最大化总和,具有最小距离约束
【发布时间】:2013-05-23 01:05:39
【问题描述】:

我想从 250 个地点中选择 5 个地点,以最大化预期利润,使每个地点之间的最小距离为 5 英里。给出了与每个位置和它们之间的距离相关的预期利润。

我试图找出这是否是一个标准问题。应用过滤器来获得解决方案似乎是计算密集型的。我一直在探索模拟退火等方法,以达到足够好的解决方案。

【问题讨论】:

  • 这可能更适合programmers.stackexchange.com
  • 要清楚一点,maximize expected profit such that minimum distance between each locality is 5 miles,你想要 5 个选定的地区,它们的利润总和在集合中最大化,并且这 5 个中任何两个地区之间的距离大于或等于5 英里?
  • 这听起来一点计算成本都不算高,您肯定可以轻松地暴力破解“250 中最好的 5”。
  • 我怀疑你甚至不得不暴力破解它。这实际上只是一个相对简单的对约束的最大子集问题(即 O(kn))。 “贪心对”算法 O(kn^2) 可能非常接近最优。
  • 一般来说,这是一个最大利润的打包问题,并且是 NP 难的。 Binomial[250, 5] 小于 8e9;这肯定不是太多的可能性。

标签: algorithm


【解决方案1】:

由于您使用的是大圆距离,因此有几种可能性可以提供一些质量保证:欧几里得图的近似方案和整数规划。前者在理论上更具可扩展性,但后者给出了精确的最优值,并且在假设求解器可用的情况下更容易实现。 (当然,你总是可以做一些特别的事情。)因为你的位置太少了,这就是我要描述的那个。

我将通过将您的问题表述为整数程序来简要解释整数程序。

maximize profit1 * x1 + profit2 * x2 + ... + profit250 * x250
subject to
x1 + x2 + ... + x250 = 5  (select exactly 5 localities)
for every pair of localities {i, j} less than 5 miles from each other,
    xi + xj <= 1
x1, x2, ..., x250 in {0, 1}

变量xi的含义是如果localityi被选中则为1,如果localityi未被选中则为0。

您需要编写一个小子例程,以将该程序以其首选格式传达给您最喜欢的求解器。要查找求解器,请搜索“MIP 求解器”;有与多种语言绑定的免费和商业产品。尝试获得一个支持 clique 切割的工具(我知道商业 CPLEX 和免费的 GLPK 都可以)。如果没有,那没关系;你可以自己实现 Bron–Kerbosch 来生成表单的约束

xa + xb + ... + xz <= 1

a, b, ..., z 是彼此相距 5 英里以内的地点。

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2019-05-08
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多