我正在玩一个名为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
可以不通过反复试验解决此问题吗?如果方程式具有三个输入而不是两个输入,是否可以使用类似的方法?
要找到最大值,我们可以先计算微分,然后看它为零。
方程式的最大值为x = (sqrt(30) - 2)/13
或x=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
从数学上讲,当e
和DIF(e,x)=0
为导数时,DIF(e,y)=0
的最大值出现。仅当
DIF()
或
2*y^2 = 15*x^2
在y = sqrt(30)/2*x
的表达式中使用以上内容
e