spsa.m

来自「一个用MATLAB编写的优化控制工具箱」· M 代码 · 共 148 行

M
148
字号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   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 + =
减小字号Ctrl + -
显示快捷键?