资源调度应用

时间:2009-10-08 03:01:13

标签: python google-app-engine resources scheduling schedule

我正在尝试实现一个应用程序来协调调度独占资源的多个用户。调度数据必须在具有单个主节点的网络上保持高度一致性。计划的资源可以是从会议室到工作现场的工作人员。

我们假设会议室不能同时安排两次会议,而且工作人员不能同时在两个工作地点。应用程序的业务逻辑不得允许用户“超量预订”资源。

我无法弄清楚如何表示数据,以便如果两个或多个用户同时按计划运行,并且存在冲突,其中一个更新将中止。

到目前为止,我看到的唯一解决方案是跟踪每个排他性资源的时间段。因此,如果会议室每隔5分钟使用一次,并且计划在9-9:30am,那么9-9:30am的相应5分钟时间段将全部返回TRUE,而未安排的时隙将返回FALSE或NULL 。然后,数据库事务会将会议室对象拉出存储,检查所有时隙,并在更新与现有时隙冲突时中止。

然而,这似乎会变得非常大,非常快。也许它可能是垃圾收集?此外,设计的目标之一是支持可变粒度,因此一些对象将在一分钟到一分钟的基础上进行调度,而其他对象可能每天进行,而且这种数据设计不能很好地支持。 / p>

目前,我正在尝试使用Python在Google App Engine上实现此功能,但我真的很想看到一些针对此问题的更通用的解决方案。我提出的所有Googling都在安排重复任务,或者执行一次性操作以自动构建优化计划的算法。

2 个答案:

答案 0 :(得分:3)

您只想跟踪每个排他性资源的开始和结束时间。问题中的数据存储实际上是一个简单的部分 - 硬(呃)部分正在制作查询以查找时间间隔内的冲突。

如果我的逻辑在21小时后正确,则以下伪代码应检查是否存在会议冲突。

# Set up your proposed meeting
proposed.start = <thursday, 1pm>
proposed.end   = <thursday, 2pm>

# Look for meetings that intersect with or straddle proposed meeting
conflicts = <SELECT * FROM meeting WHERE
             meeting.start BETWEEN proposed.start AND proposed.end OR
             meeting.end   BETWEEN proposed.start AND proposed.end OR
             meeting.start <= proposed.start AND meeting.end >= proposed.end>


if conflicts.length > 0:
   # We have a conflict!

答案 1 :(得分:1)

要自动优化学校或大学的时间表(甚至其他问题),请查看以下Java工具:

TimeFinderUniTimeDrools Solver

用户交互的问题并不像你想象的那样容易解决,因为也可能存在其他约束违规(时间表会变得更加复杂)。

首先,我只允许时间表访问/更改时间表数据。

其次,我将为每个时间表创建一个独立的解决方案,然后使用上面提出的工具优化此解决方案。然后,解决方案可以存储到数据库中,时间表可以使用它们来进一步优化计划或与其他解决方案进行比较。