假设我有一个函数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更复杂,并且此过程必须运行数百次,这很慢。 我想知道是否有一个更优雅的方法来取代嵌套循环。
答案 0 :(得分:1)
如果您真的想使用这种强力方法进行优化,那么矢量化通常是实现您想要做的事情的最快方法:
x <- 1:100
y <- 1:100
df <- expand.grid(x=x,y=y)
df$z <- df$x + df$y
max(df$z)
此解决方案当然取决于您要使用的功能类型。
答案 1 :(得分:0)
如果函数具有某些属性,则可以使用各种优化方法而不是强力搜索。如果函数是线性的,则可以使用线性编程技术,例如单纯形算法。如果函数是线性的并且自变量必须是整数,那就是整数线性编程,其中存在许多算法。如果它不仅是连续但可微分的,您可以使用渐变来找到局部最大值。