簡體   English   中英

將值的負載平衡裝入8個“孤島”中

[英]Load Balancing of values into 8 “silos”

我有一個似乎無法破解的問題。 解釋起來並不容易,所以我會努力的:

我已經整理了很多值:

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

我有8個空的“筒倉”(有點像一個數組),容量不受限制。

我的目標是用我所有的價值觀來填補那些孤島,以使它們盡可能平衡 當我說“平衡”時 ,是指我希望筒倉中所有值的總和彼此幾乎相等。

例如,如果我的筒倉1的總和為52 000而我的筒倉8的總和為30 000那么這不好。 如果可能的話,我寧願有41 00043 500類的東西。

我已經做過羅賓(Robin)巡回賽,但是它似乎不夠精確,因為我的筒倉之間有很大的不同。 我也查看了垃圾箱包裝,但對我來說似乎不合適。

感謝您提供的任何幫助或建議!

優化問題從來都不是一件容易的事,但是由於要使與平均值的偏差最小,您只需將值從最高值迭代到最低值,然后將其添加到總和最低的筒倉中即可。 這樣,您就不會在優化上浪費太多時間,並且應該(取決於您的值)獲得相對較好的結果。

// 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小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM