php – 作业调度问题

前端之家收集整理的这篇文章主要介绍了php – 作业调度问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个应用程序,我需要在轮换时间表上自动为成员安排作业.我不太擅长解释规则,所以这里有一些数据可以帮助解决

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

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

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

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

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

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

如果您打算对此进行编码,您会怎么做?我在PHP中实现它,但伪代码也可以.

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

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

所以(n = 5):

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

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

制备:

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

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

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

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

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

分配:

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

注意事项:

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

猜你在找的PHP相关文章