在 7D 空间中爬山

Posted

技术标签:

【中文标题】在 7D 空间中爬山【英文标题】:Hill climbing in 7D space 【发布时间】:2013-12-22 19:42:07 【问题描述】:

我在 7D 空间中有以下函数(表示 x=(x1,x2,x3,x4,x5,x6,x7)),我想在 matlab 中通过爬山找到该函数的最小值。

我发现this link 很有用,但我不知道如何在 Matlab 中实现我的功能。

更新:

我实现了下面的代码,但我真的不知道它是否正确。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Create a grid of states     %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all ,close all;
n=7;
range=[-32.768:0.1:32.768];
x=[0,0,0,0,0,1,1];
F=-20*exp(-0.2*sqrt(1/n*sum(x.^2)))-exp(1/n*sum(cos(2*pi*x)))+20 +exp(1);
F1=zeros(7,2);

best = -100000000;  % Best value found so far.

for (j=1:20)
    % Pick a starting location at random, and try and find the maximum state by hill climbing.
    % Repeat this a (to be precise, repeat it until j = 20).
    s=floor(100*rand(7,1)) ;
     % Generate successors, and compute the one with the maximum value.
    % Only consider states to the N, S, E, W, and NoMove.
    for (i=1:100)
        % Find successors
        S0=s;
        F0=-20*exp(-0.2*sqrt(1/n*sum(S0.^2)))-exp(1/n*sum(cos(2*pi*S0)))+20 +exp(1);
        for tt=1:7
            arr=[0;0;0;0;0;0;0]; 
            arr(tt)=1;
            S1=s+arr;
            F1(tt,1)=-20*exp(-0.2*sqrt(1/n*sum(S1.^2)))-exp(1/n*sum(cos(2*pi*S1)))+20 +exp(1);
            arr(tt)=-1;
            S1=s+arr;
            F1(tt,2)=-20*exp(-0.2*sqrt(1/n*sum(S1.^2)))-exp(1/n*sum(cos(2*pi*S1)))+20 +exp(1);
        end

        [v,vi] = max([F1(:,1)',F1(:,1)',F0]);
         arr=[0;0;0;0;0;0;0]; 
         index=mod(vi,7);
         if(index==0)
             index=7;
         end
        if(vi<=7 && vi ~= 15)
            arr(index)=1;
            s=s+arr;
        elseif(vi>7 && vi ~= 15)
            arr(index)=-1;
            s=s+arr;
            else
             s=s ; %% for better understanding   
        end     
    end

end

【问题讨论】:

你可能意识到这个函数充满了局部最小值;通过检查,最小值为 [0,0,0,0,0,0,0]... @Floris,是的,我知道,但我想通过爬山来实现,方法很重要,不能真正达到局部最优。,你能帮我吗? @zhilevan:使用***上的描述,考虑一个有用的邻居定义并实现它。 您在寻找最小值还是最大值?您需要最陡峭的下降,而不是爬山。 在寻找更好的价值之前,您是否拥有best = -100000000;?你不会找到更小的最小值... 【参考方案1】:

我在这里实现它。我希望对其他有问题的读者有用。

clear all ,close all;
clc;
n=7;
range=[-32.768:0.1:32.768];
%x=[0,0,0,0,0,1,1];
%F=-20*exp(-0.2*sqrt(1/n*sum(x.^2)))-exp(1/n*sum(cos(2*pi*x)))+20 +exp(1);
F1=zeros(7,2);
for (j=1:20)
    s=floor(rand(7,1)*64-32) ;
    i=0;
    convergence=0;
    while(convergence~=1 && i <10000)
        % Find successors
        S0=s;
        F0=-20*exp(-0.2*sqrt(1/n*sum(S0.^2)))-exp(1/n*sum(cos(2*pi*S0)))+20 +exp(1);
        %step=rand();
        step=0.005; % this is step of climbing
        for tt=1:7
            arr=[0;0;0;0;0;0;0]; 
            arr(tt)=step;
            S1=s+arr;
            F1(tt,1)=-20*exp(-0.2*sqrt(1/n*sum(S1.^2)))-exp(1/n*sum(cos(2*pi*S1)))+20 +exp(1);
            arr(tt)=-step;
            S1=s+arr;
            F1(tt,2)=-20*exp(-0.2*sqrt(1/n*sum(S1.^2)))-exp(1/n*sum(cos(2*pi*S1)))+20 +exp(1);
        end

        [v,vi] = max([F1(:,1)',F1(:,1)',F0]);
         arr=[0;0;0;0;0;0;0]; 
         index=mod(vi,7);
         if(index==0)
             index=7;
         end
        if(vi<=7 && vi ~= 15)
            arr(index)=step;
            s=s+arr;
        elseif(vi>7 && vi ~= 15)
            arr(index)=-step;
            s=s+arr;
            else
             convergence=1; %this means no neighbor has better value than current a
                            %maybe this point be local optimom
        end     
        i=i+1;
    end
    disp('*****************************');
    disp(sprintf('Step of convergence %i:',i));
    disp('coordination of optimum point :');
    disp(s');
    disp('*****************************');
end

【讨论】:

以上是关于在 7D 空间中爬山的主要内容,如果未能解决你的问题,请参考以下文章

模拟退火

模拟退火算法

模拟退火算法

TyvjP2018 「Nescafé26」小猫爬山

模拟退火算法和遗传算法

tyvj P2018 「Nescafé26」小猫爬山 解题报告