- 基本原理
1. 给定初始迭代点 x,初次行走步长 λ;
2. 初始化合适的迭代控制次数N,k = 1;
3. 当 k < N 时,随机生成一个(-1,1)之间的 D 维向量 u,并标准化:u = u / norm(u),更新初始点:x1 = x + λ* u,完成第一步行走;
4. 计算函数值,如果 f(x1) < f(x),即重置 k = 1,返回 2;否则返回 3;
5. 如果连续 N 次都找不到更优的值,则将 减小λ ,重新开始新一轮行走;
6. 若 λ < ε,则结束循环。
- 源码
function[mx, minf] = Opt_RandWalk(x, lamda, N, n)
%{
函数功能:随机行走法求函数的极小值
x:初始值;
lamda:步长;
N:为了产生较好点的迭代次数;
n:单步循环行走次数,目的是尽可能走到全局最优点附近
mx:最优解;
minf:最优值。
[mx, minf] = Opt_RandWalk([0, 0], 10, 100, 10)
%}
F = zeros(n, 1);
D = length(x);
X = zeros(n, D);
epsilon = 1e-5;
f1 = func(x);
while lamda >= epsilon
k = 1;
while(k <= N)
u = 2*rand(10, D) - 1;
for ii =1 : n
X(ii, :) = x + lamda*(u(ii, :) / norm(u(ii, :)));
F(ii) = func(X(ii, :));
end
[f11, kk] = min(F);
if f11 < f1
f1 = f11;
x = X(kk, :);
k = 1;
else
k = k + 1;
end
end
lamda = lamda / 2;
end
mx = X(kk, :);
minf = f1;
function f = func(x)
f = -sin(sqrt((x(1) - 50).^2 + (x(2) - 50).^2 ) + exp(1)) ./ (sqrt((x(1) - 50).^2 + (x(2) - 50).^2 ) + exp(1)) - 1;
% f = sum(x.^2);
% f = 3*cos(x(1)*x(2)) + x(1) + x(2)^2;
% f = 4*x(1)^2-2.1*x(1)^4+x(1)^6/3+x(1)*x(2)-4*x(2)^2+4*x(2)^4;
% f = 0.5 + (sin(sqrt(x(1)^2 + x(2)^2))^2 - 0.5) / (1 + 0.001*(x(1)^2 + x(2)^2))^2;