如何解决武器目标分配变体

时间:2014-12-31 17:54:07

标签: algorithm math

我特意试图解决这个变化:

我有50个目标和1个武器。武器有一定的概率击中每个目标,每个目标需要一定的时间才能击中。我只需要成功击中1个目标就可以成功,如果我错过了49个目标,我保证能够击中最终目标。我试图找到达到目标的顺序,这将最大限度地减少成功所需的时间。

有3个目标的例子:

Input: ([time to hit target, numerator of probability, denominator of probability])
targets = [[5, 1, 5], [10, 1, 2], [20, 1, 5]]

Output: (order of targets)
[1, 0, 2]

最佳时间计算如下:

T(1,0,2)
= (1/2)(10) + (1 - 1/2)(1/5)(10 + 5) + (1 - 1/2)(1 - 1/5)(20 + 10 + 5)
= 5 + 1.5 + 14 
= 20.5 minutes

我几天来一直在努力解决这个问题作为一项有趣的练习,并且找不到比O(N!)那样强大的蛮力更好的解决方案。

我正在考虑使用分支定界算法来降低成本,但我还未能成功设计边界方法,即如何计算给定偏序的最小可能时间和最大可能时间。

非常感谢任何建议或帮助!

1 个答案:

答案 0 :(得分:2)

我们假设订单是固定的(不知何故)。让我们仔细看看2个连续的目标(不是它们是最后一个)。我们假设瞄准时间分别为t1t2,并且命中的概率分别为p1p2。当且仅当p1 * t1 + (1 - p1) * p2 * (t1 + t2) > p2 * t2 + (1 - p2) * p1 * (t1 + t2)代表p2 * t1 > p1 * t2时,我们才能看到答案得到改善。因此,在最佳答案p2 * t1 <= p1 * t2t1 / p1 <= t2 / p2中。这个比较器定义了所有元素的排序(我们不能卡在局部最小值,因为比较器是可传递的)。但是,如果两个元素中没有一个是最后一个元素(因为我们保证会击中最后一个目标),这也适用。

它为我们提供了一个简单的多项式解决方案:

  1. 修复最后一个元素(O(n)选项)。

  2. 使用上述比较器对其余元素进行排序。更新答案。这部分适用于O(n * log n)时间。具有0概率的元素应该单独处理(它们应该总是被推到最后)。

  3. 总时间复杂度为O(n^2 * log n)