【发布时间】:2021-12-12 17:45:40
【问题描述】:
我有一个函数 f(x)。我想计算 x 其中 f(x) = max。我怎样才能在脚本中做到这一点?
给定:x 是一个正数,f(x) 可以是正数或负数。 我想从 x = 1 开始。 如果 f(1) 已经是负数,我就不再感兴趣了。 随着 x 的增加,f(x) 也返回增加的值,直到达到峰值,然后 f(x) 减小。巅峰时期的x是我感兴趣的。
编辑:好的,到目前为止我尝试了什么:
我尝试从 x = 1 开始,然后 x *=2。如果 f(x) 小于最后一个结果,我将 x 设置回 x/4。
示例:f(16) = 9, f(32) = 11, f(64) = 10。峰值可以在 x=16 和 x=64 之间。所以我的新起点是 f(16)。从那以后,我想以类似的方式继续,但我找不到算法。
这是我目前得到的:
let x = 1
let lasty = 0
let holder = 1
while (iteration++ < 20) {
let y = myFunction(x)
if(y < lasty ) {
x = x / 4
holder = 1
}
x += holder * 2
holder += 1
lasty = y
}
EDIT2:我的改进版效果很好,但肯定不完美:
let x = 1
let lasty = 0
let iteration = 0
let previousX = 1
let lastX = 1
let step = 2
let maxY = -Infinity
let bestX = 0
let randomInput = Math.random
while (iteration++ < 20) {
let y = myFunction(x, randomInput) //added randomInput to show the function does not rely on x alone
if (y < 0 && iteration == 1) break
if(y > maxY) {
maxY = y
bestX = x
}
if (y < lasty) {
x = previousX
step *= 0.8
lasty = 0
} else {
previousX = lastX
lastX = x
x = x * step
lasty = y
}
}
if(bestX > 0) {
console.log(`Got best x: ${bestX}`)
}
EDIT3:添加随机附加参数以强调所需的方法
EDIT4:我还应该提到,当 0
【问题讨论】:
-
没有作业 :) 我尝试从 x = 1 开始,然后 x *=2。如果 f(x) 小于最后一个结果,我将 x 设置回 x/4。示例:f(16) = 9, f(32) = 11, f(64) = 10。峰值可以在 x=16 和 x=64 之间。所以我的新起点是 f(16)。从那里开始,我想继续,但不确定如何。
-
f连续吗? -
是的,它是连续的。
-
所以你知道有一个峰值,它是在
x大于1的时候? -
不一定。我实际上简化了我的功能。该函数也有其他输入参数,但它们对我的情况无关紧要。重要的是解决问题的一般方法。该函数只能返回负值,在这种情况下,结果并不有趣。我只对返回正值的场景感兴趣。在这种情况下,我想找到最大值和相应的 x。不需要找到确切的最大值,在一定的迭代限制内最接近就足够了。
标签: javascript algorithm