我正在尝试使用最陡的方法来最小化离散化函数。这应该是相当简单的,但我在搜索“爬出”任何局部最小值时遇到了麻烦。这是我在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;
];
];
为什么要爬山?我很困惑,因为我甚至测试新值是否小于旧值。我不会传递它!想法?
答案 0 :(得分:3)
来自无约束优化教程,第4页:(可在:http://www.wolfram.com/learningcenter/tutorialcollection/获得)
“最陡下降确实是局部最小化的可能策略,但它通常不会快速收敛。在此示例的后续步骤中,您可能会注意到搜索方向与轮廓不完全垂直。搜索使用的是信息从过去的步骤来尝试获得有关函数曲率的信息,这通常会给它一个更好的方向。另一种策略,通常收敛速度更快,但可能更昂贵,是使用函数的二阶导数。通常被称为牛顿的“方法”。
对我来说,这个想法似乎是“走错路”有助于算法学习“正确的方法” - 并提供有关函数曲率的有用信息,以指导后续步骤。
HTH ......如果没有,请查看Constrained和Unconstrained Tutorials。很多有趣的信息。
答案 1 :(得分:2)
你的渐变是负面的。使用
x1Gradient = (f[x1+h,x2]-f[x1-h,x2])/(2h);
x2Gradient = (f[x1,x2+h]-f[x1,x2-h])/(2h);
答案 2 :(得分:1)
最陡的下降陷入局部最佳状态,使禁忌搜索方面不会陷入局部最佳状态。
有关最陡上升(=最速下降)和禁忌搜索的算法,请参阅this book。