algorithm - 如何获得一个作品序列的最短时间?

标签 algorithm sorting parallel-processing

我正在针对流程管理问题进行编程。假设有一系列工作需要一个接一个地完成,您必须在每个项目的工作 2 之前完成工作 1。使用以下示例:

work1   8   6   2   4
work2   3   1   3   12

我们需要用 8 小时来完成第一列的工作 1,然后再用 3 小时,但是如果我们先完成第 4 列,在接下来的 12 小时内,我们有一些时间来完成第 3 列和第 2 列。它最好将此列放在第一步。

我的直觉,work2是瓶颈,也就是说,我们至少需要用到3+1+3+12=20才能完成这笔交易。也就是说,尽可能让work2进程一直处于working状态。我的算法:反向排序 work2 和排序 work1,因为我们想让 work2 进程尽可能忙。

这是我的算法,看起来可行:

class Solution(object):
    def least_time(self, intervals):
        intervals.sort(key = lambda x: (-x[1], x[0]))
        time1 = time2 = 0 
        print intervals
        for inv in intervals:
            item1, item2 = inv
            if time1 + item1 <= time2 + item2:
                time1 += item1 
                time2 += item2
            else:
                time1 += item1
                time2 = time1 + item2

        return time2


if __name__ == "__main__":
    s = Solution()
    invs = [(8,3), (6,1), (2,3), (4,12)]
    print(s.least_time(invs))




>>>[(4, 12), (2, 3), (8, 3), (6, 1)]
>>>21

能够在21小时内完成以上顺序的事情。

我的问题是: 1.我的算法正确吗? 2.如何将这个问题扩展到n个作品? (work1 -> work2 -> work3 ->...->workn)

最佳答案

我在下面举了一个例子,但我认为网络搜索可以找到您真正想要的答案。

对于两台机器的情况,问题可以用约翰逊规则(https://en.wikipedia.org/wiki/Job_shop_scheduling#Jobs_consisting_of_multiple_operations)解决(https://en.wikipedia.org/wiki/Johnson%27s_rule)。

由于第一个引用文献谈到了使用 Johnson 规则来处理多于两台机器的情况,我认为对于这种情况没有其他更令人满意的解决方案。

假设您兼有两种工作。一个人走 A 两步,然后 B 走三步。另一个让 A 走三步,然后 B 走两步。一种似乎有效的模式是交替执行这两项工作。 A忙了两步,B空闲了。然后 B 在该工作上工作三个步骤,而 A 则从事另一种工作。在那段时间结束时,A 交给 B 一份工作,B 分三步完成,而 A 接手第一种工作。

因此,两者都一直忙于在每个工作的两步和三步之间交替。

我认为这不会来自您的预排序算法。

一种通用的(但计算量很大)算法是使用带有启发式的 A* 搜索,该算法表示从特定状态完成的时间为最大值(如果 A 持续忙碌所花费的时间,如果 B 所花费的时间一直忙)。有大量关于调度问题的文献,不幸的是我脑子里没有——我只知道它存在,而且大多数不平凡的问题结果都是 NP 完全问题。

关于algorithm - 如何获得一个作品序列的最短时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52799051/

相关文章:

Python NetworkX max_flow_min_cost 函数永远运行

javascript - D3 按序数排序并选择前 5 个

linux - 如何使用 xargs 运行 nohup 子进程池?

algorithm - 根据过去搜索过的关键词推荐关键词

python - 旋转时检测碰撞

python - 如何对 Python 列表进行部分排序?

mysql - 如何根据MySQL表中的时间戳重置主键?

c# - .Net 4.0 并行 foreach 循环无法在 "production"应用程序中生成新线程

java - 并行实现这一点的最有效方法是什么?

algorithm - 从许多二进制序列中选择一些,使得 "or"它们加在一起的结果是 1111111111....111