分配数字,使每个桶相对均匀
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%)
我将如何实现:
- 在一个软件仓库中定义了 n 个资源?
- 最大容量是多少?
- 任意n个当前容量?
- 从不添加超过最大容量的单位? (多余的单位被丢弃)
我会选择一个简单的贪心算法:
- 忽略任何在不超过限制的情况下无法增加的资源
仓库容量
- 在剩余的资源中找到占用最少的资源
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
我正在处理我的游戏中涉及仓库的某些方面。我正在尝试编写一个 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%)
我将如何实现:
- 在一个软件仓库中定义了 n 个资源?
- 最大容量是多少?
- 任意n个当前容量?
- 从不添加超过最大容量的单位? (多余的单位被丢弃)
我会选择一个简单的贪心算法:
- 忽略任何在不超过限制的情况下无法增加的资源 仓库容量
- 在剩余的资源中找到占用最少的资源
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