📄 spsa.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Simultaneous Perturbation Stochastic Approximation (SPSA) algorithm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Kevin Passino% Version: 4/2/01% % This program simulates the minimization of a simple function with% the SPSA method.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear % Initialize memoryp=2; % Dimension of the search space thetamin=[0; 0]; % Set edges of region want to search inthetamax=[30;30];Nspsa=100; % Maximum number of iterations to produce% Next set the parameters of the algorithm:lambda=1;lambda0=1;alpha1=0.602;alpha2=0.101;c=0.01; % Next, pick the initial value of the parameter vectortheta(:,1)=[15; 15]; % Falls into one local minimum%theta(:,1)=[17; 10]; % Moves to the global minimum%theta(:,1)=[15; 20]; % Start at global maximum - goes to a local minimum%theta(:,1)=[1; 1]; % Start at a relatively flat region - moves slow% Allocate memory theta(:,2:Nspsa)=0*ones(p,Nspsa-1);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Start the SPSA loopfor j=1:Nspsa % Use projection in case update (or initial values) out of range theta(:,j)=min(theta(:,j),thetamax); theta(:,j)=max(theta(:,j),thetamin); % Set parameters and perturb parameters lambdaj=lambda/(lambda0+j)^alpha1; % Note since this corresponds to zero cj=c/j^alpha2; Delta=2*round(rand(p,1))-1; % According to a Bernoulli +- 1 dist. thetaplus=theta(:,j)+cj*Delta; thetaminus=theta(:,j)-cj*Delta; % Use projection in case perturbed out of range. thetaplus=min(thetaplus,thetamax); thetaplus=max(thetaplus,thetamin); thetaminus=min(thetaminus,thetamax); thetaminus=max(thetaminus,thetamin); % Next we must compute the cost function for thetaplus and thetaminus Jplus=optexampfunction([thetaplus(1,1);thetaplus(2,1)]); Jminus=optexampfunction([thetaminus(1,1);thetaminus(2,1)]); % Next, compute the approximation to the gradient g=(Jplus-Jminus)./(2*cj*Delta); % Then, update the parameters theta(:,j+1)=theta(:,j)-lambdaj*g; end % End main loop...%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plot the function we are seeking the minimum of:x=0:31/100:30; % For our function the range of values we are consideringy=x;% Compute the function that we are trying to find the minimum of.for jj=1:length(x) for ii=1:length(y) z(ii,jj)=optexampfunction([x(jj);y(ii)]); endend% First, show the actual function to be maximizedfigure(1)clfsurf(x,y,z);colormap(jet)% Use next line for generating plots to put in black and white documents.colormap(white);xlabel('x=\theta_1');ylabel('y=\theta_2');zlabel('z=J');title('Function to be minimized');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Next, provide some plots of the results of the simulation.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%t=0:Nspsa; % For use in plottingfigure(2) clfplot(t,theta(1,:),'k-',t,theta(2,:),'k--')ylabel('\theta_1, \theta_2')xlabel('Iteration, j')title('SPSA parameter trajectories')figure(3) clfcontour(x,y,z,25)colormap(jet)% Use next line for generating plots to put in black and white documents.colormap(gray);xlabel('x=\theta_1');ylabel('y=\theta_2');title('Function to be minimized (contour map)');hold onplot(theta(1,:),theta(2,:),'k-')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of program%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -