假设我有一个函数 f(x,y( 和两个向量 X 和 Y,我希望两个找到值 X 和 Y 的组合,给出最大值 f .
*该函数定义良好且有界。X 和 Y 各有大约 1000 个元素。
*该函数是连续的,但我只需要向量 X 和 Y 的最高点,即使最大值可能介于两者之间。
一种可能的实现是使用两个嵌套的 for 循环,如本例所示;其中每个 x 和 y 是 10 个元素向量,z=f(x,y(=x+y
max =-1 for (x in 1:10){ for (y in 2:20){ z = x+y if (z>max){ z=max x_sol = x y_sol = y } } } x_sol #10 y_sol #20
此代码显示 x 和 y 的所有可能组合的最大值为 (x,y(=(10,20(。这段代码很好;问题是,当 x 和 y 保存更多值时,z 更复杂,并且此过程必须运行数百次,速度很慢。我想知道是否有一种更优雅的方法可以替换嵌套循环。
如果你真的想使用这种蛮力方法来优化,矢量化通常是实现你想要做的事情的最快方法:
x <- 1:100
y <- 1:100
df <- expand.grid(x=x,y=y)
df$z <- df$x + df$y
max(df$z)
当然,此解决方案取决于您要使用的功能类型。
如果函数具有某些属性,则可以使用各种优化方法代替暴力搜索。如果函数是线性的,则可以使用线性规划技术,例如单纯形算法。如果函数是线性的,并且自变量必须是整数,这就是整数线性规划,存在许多算法。 如果它不仅是连续的而且是可微的,则可以使用梯度来查找局部最大值。