数学平衡“多重电路”

时间:2015-12-24 02:10:57

标签: math algebra balance

我正在建立一个允许玩家控制10个电路之间“功率流”的游戏。

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

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

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

现在播放器还具有锁定电路的能力,以便其他电路无法改变功率电平,但仍然可以直接更改。

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

编辑:看到我的帖子正在接受投票,我将包括我已经尝试过的内容

  1. 变化总和除以请求更改的电路添加到请求更改的电路和取消电路不变 - 这种方法的问题是负面的,同时正面的变化可能会平衡并导致“死锁”情况,即没有发生变化
  2. 通过电路添加和按需循环循环电路 - 这种方法的问题是很少正确平衡
  3. 首先应用减法和加法,然后将所有电路平衡回到范围内(因此总数变为100) - 这样的问题是电源会在不应该与电路结束的地方结束,电路应该是0,最后是少量的功率
  4. 为了简化我的问题,我们只能使用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)
    

1 个答案:

答案 0 :(得分:0)

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

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