分配问题:找到作业序列的最小数量

Posted

技术标签:

【中文标题】分配问题:找到作业序列的最小数量【英文标题】:Assignment Problem: Find the minimum number of job sequences 【发布时间】:2021-09-04 22:55:16 【问题描述】:

我有N 不同的工作。有些工作可以连续完成。

需要将连续的作业排列成作业序列,使作业序列M的数量最少。

问题在于最大基数匹配的形式。

但是确定Maximum cardinality匹配时,作业序列的个数是最小的吗?

我正在寻找一种算法来解决它。

例子

N=6

可以从事以下工作:

然后作业 1 可以转到作业 2、5。

然后,作业 2 可以转到作业 3。

然后作业 4 可以转到作业 2、5。

作业 5 然后可以转到作业 6。

执行工作分配,我们得到以下 2 个工作序列:

1-2-3

4-5-6

那么 M=2。

这可以看作是找到完成所有航班(工作)的最少机组人员的问题。

【问题讨论】:

我没有答案;但如果相关关键字可以帮助您:您拥有的数据称为有向图;而你要做的是将这个有向图 partitionvertex-disjoint paths(或“node-disjoint”路径)。 感谢您的关键字。 【参考方案1】:

这个问题与拓扑排序有关。

将每个作业都视为图的一个节点。其余方法与***排序相同。

解决问题的步骤:

    最初,每个节点的入度都是0。

    现在根据给定的作业关系更改所有节点的入度。

    现在从入度为 0 的节点运行 DFS 或 BFS。其余过程与拓扑排序相同。

让我们考虑您给定的输入。

1 -> 2

1 -> 5

2 -> 3

4 -> 2

4 -> 5

5 -> 6

度数[1] = 0

度数[2] = 2 (1->2, 4->2)

度数[3] = 1 (2->3)

度数[4] = 0

度数[5] = 2 (1->2, 4->5)

度数[6] = 1 (5->6)

如果我们首先从节点 1 运行 DFS,请将其对应的节点标记为已完成 然后,1, 2, 3 节点将被处理。作为这些之间的关系 节点 (1->2->3)。

注意:这里它处理的节点可能是1, 5, 6,基于关系1->5->6。它也会给出正确的答案。 首先处理哪些节点,这取决于您制作邻接表的方式。

那么4将作为入度为0的未处理节点留下。所以 如果我们从 4 运行 DFS,则将处理 4, 5, 6。作为关系 在这些节点之间 (4->5->6)。

所以你的答案是2

注意:处理完一条路径后,可以找到未处理的入度为0的新节点。 例如,考虑关系1->2, 2->32->4

如果您首先处理路径1->2->3,则4 将保持未处理状态。

如果您首先处理路径1->2->43 将保持未处理状态。

只需遵循基本的拓扑排序过程即可为您提供答案。 您必须从多少度数为 0 的未处理节点中计算出您正在运行 DFS。

了解拓扑排序的有用资源:

Topological Sorting CP-Algorithms

Topological Sorting GFG

Topological Sort Tutorials & Notes | HackerEarth

【讨论】:

感谢 Faisal Habib 博士的回答。扩展我的问题对我很有帮助。

以上是关于分配问题:找到作业序列的最小数量的主要内容,如果未能解决你的问题,请参考以下文章

如何限制由 Pig 脚本启动的并发作业数量?

spark作业调优-------合理分配资源

函数中的错误最小和最大分配

课堂作业-找水王2

如何检查我的服务器是不是分配了任何 cron 作业

作业调度算法