/* Finer Multi-Candidates Latin Hypercube Search (Multi-dimensional Grid Search) */ new; cls; xmin={0,0,0}; xmax={10,10,10}; nc=10; /* This number can be very big even in GAUSS Light. */ nn=3; nsteps=2; p=0.2; fn f(x)=sin(x[1])-cos(x[2])-x[3]; print fLHsearch(xmin,xmax,nc,nn,nsteps,p,&f); /* ** LHSCH01f.txt - Finer Multi-Candidates Latin Hypercube Search(Multi-dimensional Grid Search). ** (C) Copyright 2005 Yosuke Amijima. All Rights Reserved. ** ** Purpose: Gets maximum values of function f(x) between xmin and xmax initially. ** ** Format: xstarstar=mLHsearch(xmin,xmax,nc,nn,nsteps,p,&f); ** ** Input: xmin vector, nn x 1 vector of initial minimum values to search ** ** xmax vector, nn x 1 vector of initial maximum values to search ** ** nc scalar, number of initial segments(i.e. nc^dim candidates) ** ** nn scalar, number of segments ** ** nstep scalar, number of steps to focus in ** ** p scalar, focus ratio in each step ** ** &f pointer to a procedure of objective function f(x) to be maximized ** ** ** Output: xstarstar vector, nn x 1 vector of maximum values ** ** Notice: This algorithm is very powerful even in GAUSS Light. Initial partition does not ** depends on any matrix expansion. Parameter nc could be very big. ** If you have some trouble to run, start over GAUSS again. */ proc fLHsearch(xmin,xmax,nc,nn,nsteps,p,&f); local dim,y1,y2,xstarstar,xmin0,range0,range,step0,step,zmax0,zmax,zmaxj,xstar,i,j,k,index,x,z,c; local f:proc; /* indexing */ dim=rows(xmin); y1=dimindex0(nn,dim); /* location index */ y2=dimindex0(nn+1,dim); /* sub-location index */ /* initial step settings */ zmax0=-1e256; xmin0=xmin; range0=(xmax-xmin)/nc; /* main */ c=0; do while c<=nc^dim-1; xmin=xmin0'+locounter(nc,dim,c)'.*range0'; xmin=xmin'; range=range0; step=range/nn; zmax=f(xmin); xstar=xmin; k=1; do while k<=nsteps; print; j=1; do while j<=nn^dim; /* regular grid including endpoints(allow overlaps) */ x=xmin'+y1[j,.].*step'+y2.*step'/nn; /* calculation f(x) in each hypercube */ z=zeros((nn+1)^dim,1); i=1; do while i<=(nn+1)^dim; z[i]=f(x[i,.]'); i=i+1; endo; zmaxj=maxc(z); /* uptate xstar if larger solution zmaxj is found */ if zmaxnc^dim-1; errorlog "ERROR: Parameter i must be 0<=i<=nn^dim-1."; retp("."); endif; x=zeros(dim,1); j=dim; do until j==1; x[j]=floor(i/(nc^(j-1))); i=i-(x[j]*(nc^(j-1))); j=j-1; endo; x[1]=i; retp(x); endp; /* ** dimindex0.txt - Dimension Indexing. ** (C) Copyright 2005 Yosuke Amijima. All Rights Reserved. ** ** Purpose: Gets index numbers for given dimension in a very easy way. ** ** Format: y=dimindex0(nn,dim); ** ** Input: nn scalar, max number of index (0,1,2,3,...,nn-1) beginning from 0 ** ** dim scalar, dimension (1,...,dim) ** ** ** Output: y matrix , (nn^dim) x (dim) of resulting index matrix ** */ proc dimindex0(nn,dim); local x,b,n,z,y; /* convert x(base 10) to y(base b) */ x=seqa(1,1,nn^dim-1); b=nn; n=maxc(log(x)/log(b))+1; z=reshape(b,n,rows(x)); y=rev(recserrc(x,z))'; /* adjustments */ y=zeros(1,dim)|y; /* insert 0's at the 1st row */ retp(y); endp;