在 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 空间中爬山的主要内容,如果未能解决你的问题,请参考以下文章