【问题标题】:Solving an equation with a few variables for a maximum value求解具有几个变量的方程以获得最大值
【发布时间】:2019-11-30 15:45:41
【问题描述】:

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

我编写了一个方程系统,通过查看其部件组成来确定小兵在完成给定工作方面的效率。

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

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

x 是蠕变上 CARRY 部件的数量。

y 是蠕变上 WORK 部件的数量。

e 是工作分配的总有效性

这些公式对于确定哪些小兵应该分配哪些工作非常有用。但是,我想知道是否有办法为每个方程求解 e 的最大值?这将为我提供最有效的零件比例,从而为高需求的工作构建蠕变。

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

编辑:对上述等式进行反复试验

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

不使用试错法可以解决这个问题吗?如果方程有 3 个输入而不是 2 个,类似的方法会起作用吗?

【问题讨论】:

  • 什么是z?它在数学中没有显示z
  • 最大化e 只是将xy 设置为可能的最高值,即Infitinity。在你的情况下,我怀疑它是否真的要你的意思。您能否进一步描述“最大化e”的含义?是否使用指定的积分分配,例如Maximize(e) given that x+y<=n
  • 对不起,当我第一次写 z 时,我的意思是 e。现已编辑完毕。
  • 好的,我再试一次。我的问题是你如何确定 x:y 之间的比率,当输入到方程中时,它将导致 e 的最大可能值。比率很重要,因为 f(1,1) 和 f(2, 2) 将返回相同的数字。这是因为 e,工作分配的总有效性以每滴答 ⋅ 部分单位的输出来衡量。目前,我一直在使用 x 和 y 的不同比率的试错法,并选择返回 e 的最大值的那个。但一定有更好的办法。
  • 请为f 编写显式函数。现在看起来你想要10yx / (x + y) * (15x + 2y) 的最大值,其中x=1。不存在最大值。您可能需要额外的要求,例如 x 和 y 为正且总和为 1。

标签: math max equation screeps


【解决方案1】:

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

等式的最大值为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

【讨论】:

    【解决方案2】:

    从数学上讲,e 的最大值出现在DIF(e,x)=0DIF(e,y)=0 时,其中DIF() 是导数。这仅发生在

    2*y^2 = 15*x^2
    

    y = sqrt(30)/2*x
    

    e的表达式中使用上述内容

    e = (170 - 20*sqrt(30))/169 = 0.3577247
    

    【讨论】:

    • 谢谢!要回答您之前的问题, z 不是 e - 这是一个错误。我用 f 来指代生成 e 的函数。很抱歉不清楚。 z 是后续问题的一部分,您有一个类似的方程,其中包含三个自变量(x、y 和 z)而不是两个,您再次求解 e 的最大值。然而,在我的例子中,引入 z 将上限函数添加到方程中,这使问题复杂化。由于这个问题足够不同,而且我把这个线程搞得一团糟,我认为最好只是把这个问题作为一个新问题来问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2020-09-16
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多