在一个时间间隔内随机调度n个非重叠事件

时间:2013-03-15 22:43:44

标签: c++ algorithm statistics scheduling

请原谅我,如果这是众所周知的一类众所周知的解决方案。我一直在寻找,但显然没有成功。

假设我有一个必须在一个区间内发生的 n 事件(例如,[0,1])。每个事件与从预定义分布中随机抽取的持续时间相关联。假设间隔远大于所有组合的事件持续时间:有效的计划始终存在。在[0,1]区间内发生事件的概率不一致,但只要它们不重叠,事件就是独立的。

安排这些活动的有效且准确(随机)方式是什么?

这是我目前的伪代码:

lowerBound = min(interval)
upperBound = max(interval)
for n in numEvents {
  draw startTime 
  draw endTime
  while ( startTime is less than lowerBound || endTime exceeds upperBound ) {
    draw startTime
    draw endTime
  }
  add event
  reset lowerBound and upperBound to define largest remaining (event-free) interval
}

我认为通过选择较大的剩余时间间隔来安排新事件,我会使事件过度分散 - 比其他情况更加间隔。尽管事件的数量很少,但这似乎非常有效并且可能非常准确。

我正在使用C ++,虽然这可能无关紧要。

如果您知道这类问题是什么,我也非常感谢搜索术语。


背景:准确性对我来说非常重要。这不是整个计划中耗费时间的一步。

1 个答案:

答案 0 :(得分:2)

我只是随机地放置每个事件,检查碰撞,如果发生碰撞,请清理平板并重新开始。

你说间隔远大于事件持续时间的总和,因此碰撞很少,所以这种方法在实践中非常快。

你说你想要准确的结果。我不确定这意味着什么,但我猜想所有有效的解决方案应该是同等可能的;问题中的当前解决方案并不满足该要求,但是这个解决方案确实如此。