我正在尝试实现一个协调调度独占资源的多个用户的应用程序。计划数据必须在具有单个主节点的网络上保持强一致性。计划的资源可以是从会议室到工作站点上的工人的任何资源。
我们假设会议室不能同时安排两个会议,并且一个工人不能同时在两个工作地点。应用程序的业务逻辑不能允许用户“超额预订”资源。
我不明白的是如何表示数据,以便如果两个或更多用户同时按计划操作,并且存在冲突,则其中一个更新将中止。
到目前为止,我看到的唯一解决方案是跟踪每个排他性资源的时隙。因此,如果会议室的使用时间间隔为5分钟,并且安排在上午9-9:30,则9-9:30上午对应的5分钟时间段将全部返回TRUE,而未计划的时间段将返回FALSE或NULL。然后,DB事务将会议室对象从存储中拉出,检查所有时隙,如果更新与现有时隙冲突,则中止。
然而,这看起来会变得非常大,非常快。也许它可以被垃圾回收?此外,设计的目标之一是支持可变粒度,因此一些对象将以分钟为单位进行调度,而其他对象可能以天为单位进行调度,而这种数据设计并不能很好地支持这一点。
目前,我正在尝试使用Python在Google App Engine上实现这一点,但我真的很有兴趣看到这个问题的一些更通用的解决方案。我想出的Googling就是计划重复的任务,或者执行一次性操作的算法,以自动构建优化的计划。
发布于 2009-10-08 04:00:24
您只需要跟踪每个排他性资源的开始和结束时间。你的问题中的数据存储实际上是容易的部分-困难的(Er)部分是精心设计的查询来查找时间间隔中的冲突。
如果我的逻辑在开机21小时后是正确的,下面的psuedo-code应该检查会议冲突。
# 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!
发布于 2010-01-10 20:26:39
要自动优化学校或大学的时间表(甚至是其他问题),请看下面的Java工具:
TimeFinder、UniTime或Drools Solver
我认为,用户交互的问题并不像你解释的那样容易解决,因为还可能有其他违反约束的情况(时间表可能会变得复杂得多)。
首先,我只允许时间表设计者访问/更改时间表数据。
其次,我会为每个时间表创建一个独立的解决方案,然后用上面提出的工具优化这个解决方案。然后可以将解决方案存储到数据库中,时间表制定者可以使用它们来进一步优化日程安排或与其他解决方案进行比较。
https://stackoverflow.com/questions/1535391
复制相似问题