【问题标题】:Distribute Numbers So That Each Bucket Is Relatively Even分配数字,使每个桶相对均匀
【发布时间】:2018-01-16 15:58:51
【问题描述】:

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

仓库的最大容量是有限的(这意味着仓库的库存不应超过其容量)。仓库定义了一组有限的资源,它们有一个数量(项目的数量)和一个乘数(即,您可以拥有 4 个单位的木材,但由于它们的尺寸很大,它们的乘数为 2,使得4 个单元总共占用 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 当前容量?
  • 永远不会添加超过最大容量的单元? (多余的单位被丢弃)

【问题讨论】:

  • n在问题中重新定义,资源数和当前容量
  • 对于精确的解决方案,您可以使用混合整数编程。这个问题总体上感觉是 NP-hard。

标签: algorithm math distribution


【解决方案1】:

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

  • 忽略任何在不超过 仓库容量
  • 在剩余资源中找到占用最少的资源 空间
    • 如果出现平局,请选择乘数较小的资源
  • 为该资源类型添加 1 个单位
  • 重复直到所有新单位都用完或没有资源可用 增加

以下是算法如何处理给定示例:

      -  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

【讨论】:

  • 这看起来很容易实现,我唯一不喜欢的部分是必须在每次迭代时进行搜索/排序,因为这会导致计算量大。也许有一些方法可以减少所需的搜索/排序数量?
  • @Igneous01 这是一个有效的观点。为了评估性能影响,您需要考虑实际的最坏情况数字:单个库中的最大资源数、添加的最大单元数、库的更新速度。对于这个有 4 个资源和 25 个新单元的示例,算法的运行时间为 1.7 微秒。这只是帧时间的 0.02%(假设每秒 120 帧)。因此,除非您拥有大量资源类型,或者要添加大量单元,或者每帧更新许多 depot,否则优化它是没有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多