技术人员时间 window 调度算法

Algorithm for technician time window scheduling

我正在寻找可以执行以下操作的算法(希望是 .net 实现): 我有以下数据:

  1. 技术人员列表,每个人都有不同的技能(可能不止一个)。
  2. 一个服务时间window(例如8-12)
  3. 这段时间内所有之前安排的工作的列表window(每个都有它所需的技能)

给定一份新工作(具有所需技能),我应该检查新工作是否可用并分配给任何可用的技术人员(只要他们的技能支持,以前的工作可以在技术人员之间转移)。也不能超过服务时间 window,因此不能为 11:30

安排 1 小时的工作

最初我想做 bin packing FFD 变体是我预先加载垃圾箱(技术人员),并且在寻找垃圾箱来放置工作时我也会检查技能匹配。作业列表将包含所有以前的作业和新的作业(按大小降序排列)并且代码停止,因为无法将作业放入任何容器中,或者它在所有作业都已安排后完成。

理论上它可以工作,但后来我想到了以下场景:

可能会出现J1分配给T1,然后J2无处可放的情况。

所以我考虑在工作列表中添加第二种排序:工作将按大小降序排序,然后按实际可以完成它们的资源数量升序排序。这将首先安排 J2,因为更少的技术人员可以做到这一点。

是否有解决此问题的特定算法,或者我的方法是否足够好?

谢谢

看看Constraint Satisfaction Problems。您的问题属于该类别。

此外,为了快速回顾问题 class 和一些玩具示例,请查看 here

This 是从中截取幻灯片的(公开可用的)章节。

您将需要的约束大致如下(以非正式方式编写):

  1. 一个问题需要一套技巧来解决。
  2. 一个问题有一个时间 window 需要解决。
  3. 只有当技术人员具备所有需要的技能时,才能将问题分配给技术人员。
  4. 只有当技术人员的时间段大于或等于解决问题所需的时间时,才能将问题分配给技术人员。

然后是关于技术人员和可用时间段的限制,最后是关于技术人员和位置(应该解决问题的地方)的限制。