1

我正在尝试使用最陡峭的方法来最小化离散函数。这应该相当简单,但是我在搜索“爬升”出任何局部最小值时遇到了麻烦。这是我在 Mathematica 中的代码,但它的语法很容易理解。

x = {some ordered pair as a beginning search point};
h = 0.0000001; (* something rather small *)
lambda = 1;
While[infiniteloop == True,
  x1 = x[[1]];
  x2 = x[[2]];
  x1Gradient = (f[x1-h,x2]-f[x1+h,x2])/(2h);
  x2Gradient = (f[x1,x2-h]-f[x1,x2+h])/(2h);
  gradient = {x1Gradient,x2Gradient};

  (* test if minimum is found by normalizing the gradient*)
  If[Sqrt[x1Gradient^2 + x2Gradient^2] > 0.000001,
    xNew = x + lambda*g,
    Break[];
  ];

  (* either pass xNew or reduce lambda *)
  If[f[xNew[[1]],xNew[[2]]] < f[x1,x],
    x = xNew,
    lambda = lambda/2;
  ];
];

为什么这会爬山?我很困惑,因为我什至测试新值是否小于旧值。当它通过时,我不会通过它!想法?

4

3 回答 3

3

来自无约束优化教程,第 4 页:(可在:http ://www.wolfram.com/learningcenter/tutorialcollection/ 获得)

“最速下降确实是一种可能的局部最小化策略,但它通常不会很快收敛。在此示例的后续步骤中,您可能会注意到搜索方向并不完全垂直于轮廓。搜索使用来自过去步骤的信息尝试获取有关函数曲率的信息,这通常会给它一个更好的方向。另一种通常收敛更快但可能更昂贵的策略是使用函数的二阶导数。这通常被称为以作为牛顿的“方法”。

对我来说,这个想法似乎是“走错路”有助于算法学习“正确的路”——并提供有关函数曲率的有用信息以指导后续步骤。

HTH...如果没有,请查看受约束和不受约束的教程。很多有趣的信息。

于 2011-07-06T06:27:42.160 回答
2

你的梯度是负的。利用

 x1Gradient = (f[x1+h,x2]-f[x1-h,x2])/(2h);
 x2Gradient = (f[x1,x2+h]-f[x1,x2-h])/(2h);
于 2011-07-06T08:13:02.890 回答
1

最陡下降陷入局部最优,启用禁忌搜索方面不会陷入局部最优。

有关最速上升(=最速下降)和禁忌搜索的示例算法,请参见本书。

于 2011-07-06T09:57:14.103 回答