-3

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

我发现这个链接很有用,但我不知道如何在 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
4

1 回答 1

0

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

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
于 2013-12-27T15:05:32.700 回答