分配数字,使每个桶相对均匀

Distribute Numbers So That Each Bucket Is Relatively Even

我正在处理我的游戏中涉及仓库的某些方面。我正在尝试编写一个 Resupply(stock) 方法,以便它将重新供应这个 depot 对象,以便 depot 中的每个资源尽可能均匀分布。

仓库的最大容量是有限的(这意味着仓库的库存不可能超出其容量)。仓库定义了一组有限的资源,它们具有数量(物品数量)和乘数(即,您可以拥有 4 个单位的木材,但由于它们的尺寸较大,它们的乘数为 2,使得4个单位共占space的8个单位)

以仓库为例:

仓库 A 的最大容量为 100,当前容量为 50(因此已满 50%)

这个depot中有4种资源

A: 4 Units, Multiplier of 4     - (4 * 4) / 100 = 16%
B: 3 Units, Multiplier of 3     - (3 * 3) / 100 = 9%
C: 15 Units, Multiplier of 1    - (15 * 1) / 100 = 15%
D: 5 Units, Multiplier of 2     - (5 * 2) / 100 = 10%

现在说我希望通过给它 25 个新单位来补充这个仓库(这些单位是神奇的,出于游戏目的可以将它们自己分配到任何资源桶)。

我如何最好地分配这 25 个点,使资源 A、B、C、D 的分配大致相等?

比方说,对于第一遍,我们向 B 添加 2 个单位,向 D 添加 3 个单位:

B: Add 2 Units - (3 + 2) * 3    - 15 / 100 = 0.15
D: Add 3 Units - (5 + 3) * 2    - 16 / 100 = 0.16

赠送 5 个单位后,A、B、C、D 在仓库中共享几乎相同的存储量。 (16%,15%,15%,16%)

我将如何实现:

我会选择一个简单的贪心算法:

  • 忽略任何在不超过限制的情况下无法增加的资源 仓库容量
  • 在剩余的资源中找到占用最少的资源 space
    • 如果平局,选择乘数较小的资源
  • 向该资源类型添加 1 个单位
  • 重复,直到所有新单位都用完或 none 的资源可以 增加

下面是算法处理给定示例的方式:

      -  B  D  D  B  D  C  B  C  D  A  C  C  D  B  C  C  D  A  C  B  C  D  C  C  D
4 A  16 16 16 16 16 16 16 16 16 16 20 20 20 20 20 20 20 20 24 24 24 24 24 24 24 24
3 B   9 12 12 12 15 15 15 18 18 18 18 18 18 18 21 21 21 21 21 21 24 24 24 24 24 24
1 C  15 15 15 15 15 15 16 16 17 17 17 18 19 19 19 20 21 21 21 22 22 23 23 24 25 25
2 D  10 10 12 14 14 16 16 16 16 18 18 18 18 20 20 20 20 22 22 22 22 22 24 24 24 26