【问题标题】:Mathmatics to balance "multiple circuits"平衡“多重电路”的数学
【发布时间】:2015-12-24 02:10:56
【问题描述】:

我正在开发一款游戏,允许玩家控制 10 个电路之间的“能量流”。

10 个电路中的每一个都单独调整,总和必须始终等于 100%。

例如,一个完美平衡的情况是所有 10 个电路都处于 10% (10x10=100)

编辑 2:如果我在这里尝试做的事情不是“平衡”,请发表评论,我会研究它们。

现在玩家还可以锁定电路,使功率等级不能被其他电路改变,但仍然可以直接改变。

编辑 3: 在这些情况下,有时可能无法达到要求的金额(例如:示例 3 和 6),最接近的可能结果将是结果

编辑:看到我的帖子收到了反对票,我将包括我已经尝试过的内容

  1. 更改总和除以请求更改的电路加上请求更改的电路和未更改的取消电路 - 此方法的问题是负向和正向更改同时可能会平衡并导致没有发生更改的“死锁”情况
  2. 根据需要通过电路添加和获取循环电路 - 这种方法的问题是它很少能正确平衡
  3. 首先应用减法和加法,然后将所有电路平衡回范围内(因此总数变为 100) - 问题是电源将在不应该出现的地方结束,应该为 0 的电路以少量结束电源

为了简化我的问题,我们可以只使用 5 个电路。

我需要帮助来计算以下内容的数学计算。经过 20 次左右的尝试后,我想我已经把它复杂化了,因为我一直以 200 行脚本结束,还是这实际上非常复杂?

示例 1:加法示例

 20  20  20  20  20 Start values
+10 +10   0   0   0 Change
 30  30 3.3 3.3 3.3 After first iteration
 50  50   0   0   0 After x iterations (eg key held down)

示例 2:减法示例

 20  20   20   20   20 Start values
-10 -10    0    0    0 Change
 10  10 26.6 26.6 26.6 After first iteration
  0   0 33.3 33.3 33.3 After x iterations (eg key held down)

示例 3:锁定 + 加法(L 已锁定)

      L          
2.5  90  2.5  2.5  2.5 Start values
  0   0  +50    0    0 Change
  0  90   10    0    0 After first iteration
  0  90   10    0    0 After x iterations (eg key held down)

示例 4:锁定 + 减法(L 被锁定)

      L          
2.5  90  2.5  2.5  2.5 Start values
  0 -10    0    0    0 Change
  5  80    5    5    5 After first iteration
 25   0   25   25   25 After x iterations (eg key held down)

示例 5:多重锁定 + 减法(L 被锁定)

      L    L      
 2.5  90  2.5  2.5  2.5 Start values
   0 -10    0    0    0 Change
 5.8  80  2.5  5.8  5.8 After first iteration
32.5   0  2.5 32.5 32.5 After x iterations (eg key held down)

示例 6:平衡从不平衡开始的变化(这个数学可能有点偏离)

 2.5   90  2.5  2.5  2.5 Start values
 +10  +10  +10    0    0 Change
16.7 66.6 16.7    0    0 After first iteration
33.3 33.3 33.3    0    0 After x iterations (eg key held down)

【问题讨论】:

  • 您能解释一下您想要实现的目标吗?我真的无法理解你的例子。例如。在前。 3、第三列有10加50到2.5后。这是为什么?起初,我认为您希望允许玩家更改任何电路并将更改平均分配到其余电路。但情况似乎并非如此。
  • 嗨 Nico,感谢您的回复。在第三个示例中,玩家试图将 50 添加到第三个循环,但是第二个循环被锁定并且当前有 90%。由于它被锁定,第三电路只能从未锁定的电路中收集总共 10%,因为它不允许从锁定的电路中获取。您希望在电路中平均分配剩余部分是正确的,但这必须通过锁的限制来完成。我将编辑我的帖子以解释所请求的更改可能并不总是可行,并且在这些情况下它们可能会受到限制

标签: math algebra balance


【解决方案1】:

首先检索所有可能被运行时更改的电路:

Candidates = AllCircuits \ (LockedCircuits u ChangedCircuits)

这里,\ 表示集合减号运算符,u 是联合运算符。

计算每个电路的平均变化:

targetTotalChange = totalChange
averageChange = totalChange / |Candidates|

现在,开始更换候选人。考虑到限制,请按照他们当前的潮流对候选人进行排序。如果averageChange 为负数,则按升序排列。如果是正数,则按降序排列。

记住你已经处理了多少电路:

processedCircuits = 0

现在按指定顺序迭代所有候选:

for each candidate in Candidates

检查是否可以将平均变化添加到该电路中。否则,调整值:

    processedCircuits++
    prevPower = candidate.PowerFlow
    targetPower = prevPower + averageChange
    if(targetPower < 0)
    {
        totalChange += prevPower
        candidate.PowerFlow = 0
        //recalculate average change
    }
    else if(targetPower > 100)
    {
        totalChange -= 100 - prevPower
        candidate.PowerFlow = 100
        //recalculate average change
    }
    else
    {
        totalChange -= averageChange
        candidate.PowerFlow += averageChange
    }

当您需要重新计算平均变化时,请执行以下操作:

averageChange = totalChange / (|Candidates| - processedCircuits)

小心被零除。

现在您已经调整了所有其他电路。剩下的就是调整改变的电路。这很容易。我们将所有其他电路更改为targetTotalChange - totalChange。可以将此更改添加到更改的电路中。我们可以添加相应的百分比:

percentage = (targetTotalChange - totalChange) / targetTotalChange
for each circuit in ChangedCircuits
    circuit.PowerFlow += percentage * targetChange[circuit]
next

【讨论】:

  • Nico,看起来很有希望。今晚我会尝试测试它。一旦我测试过它,我会将它标记为响应。非常感谢您的回复。你能投票赞成我的问题吗?我觉得我很好地详细说明了我的问题,并且有 3 票否决
  • 在目前的形式中,这个问题正处于成为一个好问题的边缘。我想,赞成票是合法的。将来,您可能希望将重点放在问题描述上。以某种方式编写它,以便局外人知道您想做什么。一开始我也有问题。尽管有些用户这样做,但用赞成票来反对反对票并不是一个好习惯,反之亦然。只能对实际问题进行投票。不在问题的投票中。
  • 非常感谢您的帮助。稍作调整即可解决问题
猜你喜欢
  • 2018-03-02
  • 2012-06-16
  • 1970-01-01
  • 2017-03-26
  • 2018-02-27
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多