【问题标题】:Algorithm: Distribute n tasks to k >n people, each of whom can perform a subset of these tasks算法:将 n 个任务分配给 k >n 个人,每个人都可以执行这些任务的一个子集
【发布时间】:2013-10-16 18:49:33
【问题描述】:

我正在尝试为以下问题找到有效的解决方案:

问题: 假设我有一些任务(A、A、B、B、C)并且我有一些人可以执行以下一项或多项任务:

  • person1:A,B(人 1 可以执行任务 A 或任务 B)
  • person2:A,C
  • person3:A
  • person4: B,C
  • person5:A,B

是否可以将我所有的任务交给这些人?一个人只能完成一项任务。

可能有多种解决方案,但我只想知道是否有解决方案。

我第一次尝试有效地解决这个问题是:

  • 如果一个人只能完成一项任务,则将该任务分配给该人
  • 如果一个任务需要做n次,有n个人可以做 这个任务,把这个任务分配给这 n 个人。

这足以解决上述问题。

  • 2个人可以做B,B需要做两次。
    • 剩下的任务:A,A,C
    • 剩余人数:[A,C],[A],[B,C]
  • 2人可以做A。
    • 剩余任务:C
    • 剩余人数:[B,C]

但这还不足以解决更复杂的问题,例如: 工作: IGGGFFDDCCBBB 人: ABCDEFG CEI 北 欧盟委员会 CEGI ADGI CEGI CI 助理总干事 北 DI BCDEFI ABDF ABEFG BCEGI ACDI BD 安倍 BCDEFGI

有没有解决这个问题的有效方法?我显然可以用深度优先搜索算法解决这个问题,但我想知道我是否可以在多项式时间内解决这个问题? 我不禁相信这是一个众所周知的问题,但我一直无法在 google 上找到它。

感谢您的阅读:)

【问题讨论】:

    标签: algorithm variable-assignment jobs distribute


    【解决方案1】:

    有效解决此问题的一种方法是将其表述为maximum flow problem

    在人员和他们可以完成的任务之间添加边界(容量 1)。

    还在起点和每个人之间添加边(容量 1)

    以及任务和目的地之间的一条边(容量 = 该任务需要完成的次数)。

    使用NetworkX的示例Python代码:

    import networkx as nx
    from collections import Counter
    
    jobs = 'IGGGFFDDCCBBB'
    people = 'ABCDEFG CEI BEI CEFGI CEGI ADGI CEGI CI ADG BEI DI BCDEFI ABDF ABEFG BCEGI ACDI BD ABE BCDEFGI'
    
    G=nx.DiGraph()
    for person,tasks in enumerate(people.split()):
        P = 'person'+str(person)
        G.add_edge('start',P,capacity=1.0) # One person can do one thing
        for task in tasks:
            G.add_edge(P,'task'+task,capacity=1.0) # This person can do this task
    
    C = Counter(jobs)
    for task,count in C.items():
        G.add_edge('task'+task,'end',capacity=count) # Task appears count times in our job list
    
    print nx.max_flow(G,'start','end') >= len(jobs)
    

    【讨论】:

      【解决方案2】:

      是的,有一个有效的算法。这是最大二分匹配问题的一个例子。您所做的是创建一个二分图,其中节点是人和任务,并且有一条边将每个人与他们能够执行的每个任务连接起来。将人员分配给任务将对应于该图的匹配。

      此算法并非完全简单,但可以高效执行,例如: http://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/matching.pdf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 2020-12-16
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-28
        相关资源
        最近更新 更多