我正在为工厂设计项目管理应用程序。该应用程序有望产生项目计划草案。要安排任务,应用程序应检查三个条件:
我在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
}
我的问题是,这是一个好方法吗?有更简单的方法吗?
答案 0 :(得分:1)
一次查找一个操作的最早日期时间可能无法获得最佳结果。考虑操作A长时间使用机器1的示例,操作B使用机器1短时间,操作C使用机器2短时间,但操作C必须在B之后完成。
在这种情况下,最好在机器1上的A之前安排B,但是你的方法不会实现这一点。当然,编写和使用软件来管理这个比你建议的更困难,所以你需要决定这个好处是否值得付出额外的努力。
查看Scheduling,Job Shop Scheduling和Scheduling algorithm。
首先,您需要考虑可以收集哪些关于任务的信息(例如依赖关系,优先级,截止日期),然后决定如何将它们组合在一起。
您可能会发现像您提出的方法在您的情况下已经足够好了。我对你提出的算法的补充是对现有机器操作列表进行排序,以便更快地搜索它们,也就是说,只要找到适合你操作的时间就可以停止,因为它确保是最早的时间。
一个相对简单的扩展将是一个优先级系统,允许您向前冲击低优先级任务(这可能还需要调整其依赖关系),但更复杂的算法会同时考虑多个任务并尝试优化结果。最后,它归结为适合您特定问题的内容。
答案 1 :(得分:0)
这取决于你想要计划工作的时间。如果在开始机器工作之前,则可以通过Branch& Bound算法或类似的东西(可能是动态编程)。如果工作必须计划在机器工作时你无法分辨哪些工作将被执行,那么为了获得最佳解决方案你无法计算(我无法想到)。 Mayby将下一个工作放在机器上,最大时间最短? Mayby是Ford-Bellmas alg的动态版本(如果你有几层生产)。很难说。 我会做几个approches并确定女巫是最好的。你可以写一篇关于这个的文章:)