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

标签 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!) 规模的蛮力更好的解决方案。

我正在考虑一种分支定界算法来降低成本,但我还没有能够成功地设计出一种边界方法,即如何计算给定部分订单的最短可能时间和最大可能时间。

如有任何建议或帮助,我们将不胜感激!

最佳答案

让我们假设订单是固定的(以某种方式)。让我们仔细看看 2 个连续的目标(没有一个是最后一个)。假设瞄准时间是t1t2命中的概率是p1p2 , 分别。我们可以看到,当且仅当 p1 * t1 + (1 - p1) * p2 * (t1 + t2) > p2 * t2 + (1 - p2) * p1 * (t1 + t2) 交换它们时,答案会得到改善。 , 这意味着 p2 * t1 > p1 * t2 .因此,在最佳答案中 p2 * t1 <= p1 * t2 , 或 t1 / p1 <= t2 / p2 .这个比较器定义了所有元素的顺序(我们不能陷入局部最小值,因为比较器是可传递的)。但是,如果这两个元素中没有一个是最后一个元素(因为我们保证会击中最后一个目标),这也是正确的。

它给了我们一个简单的多项式解:

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

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

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

关于algorithm - 如何解决武器目标分配变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27724591/

相关文章:

algorithm - 计算具有更新的段中的反转

algorithm - 迭代 n * F(n - 1)+((n - 1) * F(n - 2))

python - Fisher Yates Shuffle 错误实现中的顺序偏差

javascript - JavaScript 或 IEEE-754 中的舍入怪癖?

math - 找出圆周上像素坐标的算法

c - 在c中按运算符、标识符等拆分字符串

algorithm - 查找给定范围内大于 x 的元素数

algorithm - QuickSort 的优化或错误实现

algorithm - 找到 x^2 + y^2 = m 的解的最佳时间复杂度是多少,其中 m 可以是任何自然数?

math - 使用模数会偏向高数吗?