查找无资源槽的算法

时间:2011-08-27 23:08:42

标签: algorithm project-management

我正在为工厂设计项目管理应用程序。该应用程序有望产生项目计划草案。要安排任务,应用程序应检查三个条件:

  1. 任务依赖 - 以前不要开始,
  2. 机器可用性和
  3. 轮班工作时间
  4. 我在machine_allocations表中跟踪机器参与度:

    machine_allocations
    +------------+--------------+-----------------+---------------+
    | machine_id | operation_id | start_timestamp | end_timestamp |
    +------------+--------------+-----------------+---------------+
    

    班次按照模式进行。

    现在,为了找到一个操作的最早可能的日期时间,我正在考虑一个函数:

    function earliest_slot($machine_id, $for_duration, $no_sooner_than) {
       // pseudo code
       1. get records for the machine in question for after $no_sooner_than 
       2. put start and end timestamps into $unavailable array
       3. add non-working times as new elements to the array
       4. in a loop find timeslots which are not in the array
       5. if a timeslot is found which is equal to or bigger than $for_duration, return that
    }
    

    我的问题是,这是一个好方法吗?有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

一次查找一个操作的最早日期时间可能无法获得最佳结果。考虑操作A长时间使用机器1的示例,操作B使用机器1短时间,操作C使用机器2短时间,但操作C必须在B之后完成。

在这种情况下,最好在机器1上的A之前安排B,但是你的方法不会实现这一点。当然,编写和使用软件来管理这个比你建议的更困难,所以你需要决定这个好处是否值得付出额外的努力。

查看SchedulingJob Shop SchedulingScheduling algorithm

首先,您需要考虑可以收集哪些关于任务的信息(例如依赖关系,优先级,截止日期),然后决定如何将它们组合在一起。

您可能会发现像您提出的方法在您的情况下已经足够好了。我对你提出的算法的补充是对现有机器操作列表进行排序,以便更快地搜索它们,也就是说,只要找到适合你操作的时间就可以停止,因为它确保是最早的时间。

一个相对简单的扩展将是一个优先级系统,允许您向前冲击低优先级任务(这可能还需要调整其依赖关系),但更复杂的算法会同时考虑多个任务并尝试优化结果。最后,它归结为适合您特定问题的内容。

答案 1 :(得分:0)

这取决于你想要计划工作的时间。如果在开始机器工作之前,则可以通过Branch& Bound算法或类似的东西(可能是动态编程)。如果工作必须计划在机器工作时你无法分辨哪些工作将被执行,那么为了获得最佳解决方案你无法计算(我无法想到)。 Mayby将下一个工作放在机器上,最大时间最短? Mayby是Ford-Bellmas alg的动态版本(如果你有几层生产)。很难说。 我会做几个approches并确定女巫是最好的。你可以写一篇关于这个的文章:)