分配问题:找到作业序列的最小数量
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。
这可以看作是找到完成所有航班(工作)的最少机组人员的问题。
【问题讨论】:
我没有答案;但如果相关关键字可以帮助您:您拥有的数据称为有向图;而你要做的是将这个有向图 partition 成 vertex-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->3
、2->4
。
如果您首先处理路径1->2->3
,则4
将保持未处理状态。
如果您首先处理路径1->2->4
,3
将保持未处理状态。
只需遵循基本的拓扑排序过程即可为您提供答案。 您必须从多少度数为 0 的未处理节点中计算出您正在运行 DFS。
了解拓扑排序的有用资源:
Topological Sorting CP-Algorithms
Topological Sorting GFG
Topological Sort Tutorials & Notes | HackerEarth
【讨论】:
感谢 Faisal Habib 博士的回答。扩展我的问题对我很有帮助。以上是关于分配问题:找到作业序列的最小数量的主要内容,如果未能解决你的问题,请参考以下文章