【Matlab学习手记】随机游走法求解函数极值

  • 基本原理

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;

 

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值