【发布时间】:2011-12-17 04:28:42
【问题描述】:
让我们将此问题称为 Slinger-Bird 问题(实际上,Slinger 类似于服务器,而鸟类似于请求,但我一想到它就精神崩溃,所以我改变了他们希望获得不同的观点!) .
- 有 S 掷石者(投石者)和 B 鸟。
- 弹射器不在彼此的范围内。
- 投掷一次可以杀死投掷者视线内的所有鸟类,并且会消耗一枪和一个时间单位
我正在尝试找出最佳解决方案,以在特定鸟类到达模式的情况下最大限度地减少杀死鸟类所需的时间和射击次数。让我举一个绝对数字的例子:3 Slingers 和 4 Birds。
Time 1 2 3 4 5
Slinger
S1 B1, B2 B1, B2, B3 B4
S2 B1 B1, B2 B3,B4
S3 B1 B3, B4 B1,B2,B3,B4
我的数据如下所示:
>> print t
[
{
1: {S1: [B1, B2], S2: [], S3: [B1]},
2: {S1: [B1, B2, B3], S2: [B1], S3: [B3, B4]},
3: {S1: [B4], S2: [B1,B2], S3: []},
4: {S1: [], S2: [B3, B4], S3: [B1, B2, B3, B4]}
}
]
我能想到的解决方案有很多(Sx at t=k 意味着 slinger Sx 在时间 k 出手):
- S1 在 t=1,S1 在 t=2,S1 在 t=3 成本:3 次射击 + 3 个时间单位 = 6
- S1 在 t=2,S1 在 t=3 成本:2 次射击 + 3 个时间单位 = 5
- S1 在 t=1,S3 在 t=2 成本:2 次射击 + 2 个时间单位 = 4
- S3 在 t=4 成本:1 次射击 + 4 个时间单位 = 5
在我看来,解决方案 3 是其中的最佳解决方案。当然,我是手工完成的(所以我可能遗漏了一些东西),但我想不出一种可扩展的方式来做到这一点。另外,我担心会出现一些极端情况,因为一个射手的决定可能会改变其他人的决定,但因为我有全局观,可能没关系。
在python中解决这个问题的快速而好的方法是什么?我很难想出一个好的数据结构来做到这一点,而不管算法是什么。我正在考虑使用动态编程,因为这似乎涉及状态空间探索,但对如何进行有点困惑。有什么建议吗?
【问题讨论】:
-
供您参考:只有一个时间段,您的问题相当于Minimum Set Cover。
-
@mhum:仔细想想,我认为这个问题实际上可以通过去除时间概念并将成本函数附加到每个集合来编码为最小集合覆盖。当然,我不确定如何将 slinger 编码到问题中。您对这种方法有什么建议吗?
标签: python algorithm dynamic-programming