【问题标题】:Load Balancing of values into 8 "silos"将值负载平衡到 8 个“筒仓”中
【发布时间】:2017-11-13 11:24:53
【问题描述】:

我遇到了一个我似乎无法解决的问题。这不是那么容易解释,所以我会尽力而为:

我已经排序了一大堆值:

[ 2, 8, 26, ..., 1456, 1879, ..., 7812, 9614, ..., 20 408, 26 584 ]

我有 8 个容量无限的空“筒仓”(有点像一个数组)。

我的目标是用我所有的价值观填充这些孤岛,以使它们尽可能平衡。 当我说“平衡”时,我的意思是我希望筒仓中所有值的总和几乎彼此相等。

例如,如果我的筒仓 1 的总和为 52 000,而我的筒仓 8 的总和为 30 000,那就不好了。如果可能的话,我宁愿有 41 00043 500 这样的东西。

我已经完成了轮循,但它似乎不够精确,因为我的筒仓之间存在很大差异。 我也查了 bin-packing,但它似乎不适合我。

感谢您提供的任何帮助或建议!

【问题讨论】:

标签: c# arrays algorithm load-balancing


【解决方案1】:

优化问题绝非易事,但由于您希望最小化与平均值的偏差,您只需将值从最高值迭代到最低值,并将其添加到总和最低的筒仓中。这样您就不会在优化上浪费太多时间,并且应该(取决于您的值)获得相对较好的结果。

// Generate some random data
int[] values = new int[1000];

Random r = new Random();

for (int i = 0; i < values.Length; i++)
{
    values[i] = r.Next(1, 30000);
}

// Initialize silos
const int siloCount = 8;
List<int>[] result = new List<int>[siloCount];
for (int i = 0; i < siloCount; i++)
{
    result[i] = new List<int>();
}

int[] sums = new int[siloCount];
int[] indices = Enumerable.Range(0, siloCount).ToArray();

// Iterate all values in descending order
foreach (int value in values.OrderByDescending(i => i).ToList())
{
    // Find silo with lowest sum (or one of them)
    int siloIndex = indices.First(i => sums[i] == sums.Min());

    // Add to collection and sum - so we don't have to call .Sum() every iteration
    sums[siloIndex] += value;
    result[siloIndex].Add(value);
}

Debug.WriteLine(String.Join("\r\n", result.Select(s => s.Sum())));

.Net Fiddle

【讨论】:

  • 哇,谢谢你这么快的回答!我会试试这个,让你更新
  • 先生,我只想说一件事:太完美了。正是我需要的。谢谢。
  • @Zak 很高兴有帮助,请单击我的答案左上角的复选标记,将此答案标记为已接受并且问题已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2022-01-10
  • 2022-06-13
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多