3

将测试拆分为偶数时间奴隶。

我有每个测试需要多长时间的完整列表。

它们是 python 行为测试功能。

从站是通过 Jenkins 创建的。


我对 x 数量的奴隶进行了测试。这些从站运行测试并返回报告。

问题:一些从站的运行时间比其他从站更大。例如。一个需要 40 分钟,另一个需要 5 分钟。

我想平均一下。

我目前有一个文件列表和所需时间。

[
    ['file_A', 501],
    ['file_B', 350],
    ['file_C', 220],
    ['file_D', 100]
]

额外...有n个文件。

目前这些按文件数拆分为列表,我想按总时间拆分它们。例如......运行这 4 个测试的 3 个从站看起来像......

[
[
     ['file_A', 501],
],
[
     ['file_B', 350],
],
[
     ['file_C', 220],
     ['file_D', 100]
]
]

那样的东西...

请帮忙

谢谢!

4

4 回答 4

3

您可以执行以下操作:

def split_tasks(lst, n):
    # sorts the list from largest to smallest
    sortedlst = sorted(lst, key=lambda x: x[1], reverse=True)
    # dict storing the total time for each set of tasks
    totals = dict((x, 0) for x in range(n))
    outlst = [[] for x in range(n)]
    for v in sortedlst:
        # since each v[1] is getting smaller, the place it belongs should
        # be the outlst with the minimum total time
        m = min(totals, key=totals.get)
        totals[m] += v[1]
        outlst[m].append(v)
    return outlst

这会产生预期的输出:

[[['file_A', 501]], [['file_B', 350]], [['file_C', 220], ['file_D', 100]]]
于 2013-07-21T10:06:44.207 回答
1

将您的测试按运行时间的降序排列,从列表顶部向每个从站发送一个,然后在它们完成时再给它们一个 - 如果测试挂起或花费比平时更长的时间,则使用此策略,所有其他测试将仍然在最短的时间内完成。

如果您无法在完成时分发测试,则为每个服务器分配一个列表并以相同的方式“处理”测试。

于 2013-07-21T09:37:07.263 回答
0

在我看来,问题是一个 简单的装配线平衡问题。(见第 2 页),但我猜它是Multi-way number partitioning。这是 Michael D. Moffitt 最近的一篇相关论文

我不知道是否有解决此问题的 python 模块,但也许 StackOverflow 有人知道?

您可以实现一个近似于解决方案的算法:(在6855394
引用接受的答案)

贪婪:
1. 将可用项目降序排列。
2. 创建 N 个空组
3. 开始将项目一次添加到总和最小的组中。

于 2013-07-21T09:55:04.757 回答
0

这可以使用背包算法来解决,使用所有值的总和除以从站的数量。

于 2013-07-21T10:13:41.137 回答