php – 作业调度问题
我正在开发一个应用程序,我需要在轮换时间表上自动为成员安排作业.我不太擅长解释规则,所以这里有一些数据可以帮助解决:
职位:职称,每周一至周三等规则. 对于该月中的每个日期,成员被分配到职位(均按升序排列).如果成员被分配到一个类别中的位置,则下次出现相同类别中的位置时,按字母顺序(或列表的开头)分配下一个成员,例如. 成员:M1,M2,M3,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 这样可以轻松按优先级和名称对成员进行排序. 制备: 一个晴天.您正在检索指定的位置和给定日期的类别.每个成员都加载在一个长列表中.没有出现在工作中的每个成员都没有加载,但是他的价值减去了两个.鲍勃不在这里,所以它的新值达到99997Bob.这意味着下次将自动选择Bob. 为特定日分配的位置已映射(使用SplObjectStorage): P1-> M1,M4等 地图仅包含今天必须分配的位置. 过滤: 分配: >您选择要分配的位置 注意事项: >你必须要小心,总有足够的人担任某个职位. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |