求解带有几个变量的方程式以获得最大值

问题描述 投票:0回答:2

我正在玩一个名为Screeps的游戏,您在其中使用javascript编写了一个殖民地。游戏的核心是小的可编写脚本的单元,称为小兵,可以从不同部分动态构建以赋予它们不同的属性。

我编写了一个方程组,通过查看零件的组成来确定其对完成给定工作的有效性。

例如,升级殖民地中心的工作的简化方程为:

e = 10yx /((x + y)*(15x + 2y))

x是蠕变上的携带零件数。

y是蠕变上的工作零件数。

e是工作分配的总效率

这些等式非常适合于确定应为哪些工作指定哪些蠕变。但是,我想知道是否有一种方法可以解决每个方程式中e的最大值?这将为我提供最有效的零件比率,以构建高要求工作的零件。

如果这是可能的,因为我正在考虑用另一个变量来扩展方程式,例如说MOVE零件的数量为z,这仍然可能吗?

编辑:对上述方程式使用反复试验

f(1, 1); // returns 0.294
f(1, 2); // returns 0.350
f(1, 3); // returns 0.357 --- Highest value, therefore best ratio
f(1, 4); // returns 0.347
f(1, 5); // returns 0.333

可以不通过反复试验解决此问题吗?如果方程式具有三个输入而不是两个输入,是否可以使用类似的方法?

math max equation screeps
2个回答
0
投票

要找到最大值,我们可以先计算微分,然后看它为零。

方程式的最大值为x = (sqrt(30) - 2)/13x=0.26748, y=0.73252

这是一些计算它的Python代码:

from sympy import evalf, solve
from sympy.abc import x, y

f = 10*y*x / ((x + y) * (15*x + 2*y))
f = f.subs(y, 1-x)  # we know x + y == 1
df = f.diff(x)
sol = solve([df], x)
print(f'solutions found: {sol}')
for s in sol:
    x0 = s[0].evalf()
    if x0 >= 0 and x0 <= 1:
        print(f'extremum at f({x0, 1-x0}) = {f.subs(x, x0).evalf()}')

输出:

solutions found: [(-2/13 + sqrt(30)/13,), (-sqrt(30)/13 - 2/13,)]
extremum at f((0.267478890388589, 0.732521109611411)) = 0.357724784017555

0
投票

从数学上讲,当eDIF(e,x)=0为导数时,DIF(e,y)=0的最大值出现。仅当

DIF()

2*y^2 = 15*x^2

y = sqrt(30)/2*x 的表达式中使用以上内容

e
© www.soinside.com 2019 - 2024. All rights reserved.