工作安排问题

Zah*_*aka 8 php pseudocode

我正在开发一个应用程序,我需要在轮换时间表上为成员自动安排作业.我不太擅长解释规则,所以这里有一些数据可以帮助解决:

职位:职称,每周一至周三等规则.
类别:一组职位
组:另一组职位.同一组中的职位不能在同一天
分配成员:分配到给定日期职位的用户.

对于该月中的每个日期,成员被分配到职位(均按升序排列).如果成员被分配到一个类别中的位置,则下一次出现相同类别中的位置时,按字母顺序(或列表的开头)分配下一个成员,例如.

成员:M1,M2,M3,M4
类别C1中的位置:P1,P2,P3
位置P1的成员:M1,M2,M3,M4
位置P2的成员:M1,M2,M3
位置P2的成员:M1,M3, M4

如果为P1分配了M1,如果接下来是P2,则将分配M2.引入了额外的复杂层,如果P3接下来,则M3被分配.系统必须跟踪M2被"跳过"的事实并在下一次分配M2(如果可用),然后分配M4,或者等到它到达M2可用的位置(当有许多'被跳过时,这变得更加复杂'成员).

如果一名成员表示他将无法在该日期上任,那么该成员也将被跳过.系统需要优先考虑跳过的成员,在它们出现时以某种方式识别它们,然后跳转到列表中的下一个逻辑人员.由于日期冲突,跳过也适用于群组.

我已经有了一个临时[和凌乱]的解决方案,我不再理解,即使我有很多评论解释每一步.它的弱点在于与被跳过的成员打交道.

如果你打算编码,你会怎么做呢?我在PHP中实现它,但伪代码也可以.

Tho*_* S. 6

我的解决方案:您需要一个PriorityQueue(在SplPriorityQueue下的PHP中可用).PriorityQueue为您提供具有降序优先级的元素(按值排序,最小值具有最高优先级).

每个成员都获得一个指定的值.此值是一个带有n位数的ASCII数字(为方便起见,您可以使用8位数字),在n个位置填充零.之后,您附加名称.您还可以向每个成员添加可用职位

所以(n = 5):

  • M1值:99999Albert P1,P2,P3
  • M2值:99999Susi P1,P2
  • M3值:99999Bob P1,P3

这样可以轻松按优先级和名称对成员进行排序.

制备:

一个晴天.您正在检索指定的位置和给定日期的类别.每个成员都加载在一个长列表中.没有出现在工作中的每个成员都没有加载,但是他的价值减去了两个.鲍勃不在这里,所以它的新值达到99997Bob.这意味着下次将自动选择Bob.所有其他成员的价值减去一减.

为特定日分配的位置已映射(使用SplObjectStorage):

P1-> M1,M2,M3,M4等P2->等

地图仅包含今天必须分配的位置.之后

过滤:您必须查找组并删除地图上今天无法分配的任何位置.你的小组描述有点不清楚.

分配:

  • 您可以选择要分配的位置
  • 获取可以填补该职位的成员列表
  • 从列表中删除可用成员并将其放入PriorityQueue
  • 通过来自PriorityQueue的extract()分配位置(正确分配是自动完成的).分配的每个成员将其值增加1(因此,如果您在这里工作,则减少和增加水平).如果你在这里并且由于某种原因没有被分配到一个职位,你会得到一个小的罚款.如果你不在这里,你将被罚两分.
  • 完成后,再次将剩余成员放在列表中,清除PQueue并继续下一个作业.

注意事项:

  • 你必须要小心,总有足够的人担任某个职位.