数学平衡"multiple circuits"

Mathmatics to balance "multiple circuits"

我正在构建一个允许玩家在 10 个电路之间控制 "power flow" 的游戏。

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

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

编辑 2: 如果我在这里尝试做的不是 "balancing",请发表评论,我会研究它们。

现在播放器也有锁定电路的能力,这样功率水平就不能被其他电路改变,但仍然可以直接改变。

编辑 3: 有时可能无法实现请求的数量(例如:示例 3 和 6),在这些情况下,最接近的可能结果将是结果

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

  1. 变化的总和除以请求变化的电路加上请求变化的电路和不变化的电路 - 这种方法的问题是消极的,同时积极的变化可能会平衡并导致 "deadlock" 情况没有变化的地方
  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:Multi Lock + Subtraction(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)

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

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