new; cls; size=100; fn df(x)=(1/2)^(x-1); /* distance function */ ngen=100; alpha=0.8; n=3; sig=0.1; etasb=0.5; d=0; s=0.01; ppert=0.05; ctype=-1; /* 0: linear crossover 1: blend crossover(alpha) 2: arithmetic crossover */ /* 3: UNDX crossover(sig) 4: SBX crossover(etasb) */ /* 5: unimodal averaging crossovers(alpha,n) 6: bimodal averaging(alpha,n) */ /* negative: mix at random between 1 and 6 except 0 */ lstype=7; /* 0: random 1: elitist 2: probabilistic 3: random by distance 4: random&prob */ /* 5: 2D dish random 6: 2D dish random&probabilistic */ /* 7: 3D bulb random 8: 3D bulb random&probabilistic */ range1={0,3}; range2={0,3}; range=range1~range2; dim=2; xx={4.2,4.8,6.0,3.7,4.5,3.2,5.3,4.9,4.8,6.8}; y={5.4,5.9,5.9,6.7,3.7,2.3,4.2,3.2,7.3,6.6}; data=xx~y; xs=CellularRealGA(size,ngen,alpha,n,sig,etasb,d,s,ppert,ctype,lstype,range,dim,&df,&f); print xs; proc f(x); local n,sse,x1,y,i; n=rows(x); sse=zeros(n,1); x1=ones(rows(data),1)~data[.,1:cols(data)-1]; y=data[.,cols(data)]; i=1; do while i<=n; sse[i]=sumc((y-x1*x[i,.]')^2); i=i+1; endo; retp(-sse); endp; proc CellularRealGA(size,ngen,alpha,n,sig,etasb,d,s,ppert,ctype,lstype,range,dim,&df,&f); local size1,x,fitv,minfitv,fitv0,i,j,k,di,rorder,i1,i2,i3,ii,inc,inew,seq,p,cp,ks,f:proc; local min,max,xs,x1,x2,x3,fitv1,fitv2,fitv3,wi,u,betaq,min1,min2,max1,max2,e,actinc,mdist; local rii,v,w,cdata,df:proc; if rows(ctype)==1; ctype=ctype*ones(ngen,1); elseif rows(ctype)cp)+1]; elseif lstype==3 or lstype==5 or lstype==7; fitv0=df(mdist); p=fitv0/sumc(fitv0); cp=cumsumc(p); ks=seq[sumc(rndu(1,1).>cp)+1]; elseif lstype==4 or lstype==6 or lstype==8; fitv0=df(mdist).*fitv[seq]; p=fitv0/sumc(fitv0); cp=cumsumc(p); ks=seq[sumc(rndu(1,1).>cp)+1]; endif; if ctype[j]==0; /* linear crossover between rorder[i]-th and ks-th */ x1=zeros(1,dim); x2=zeros(1,dim); x3=zeros(1,dim); di=1; do while di<=dim; if x[rorder[i],di]<=x[ks,di]; x1[di]=maxc((3/2*x[rorder[i],di]-1/2*x[ks,di])|range[1,di]); x2[di]=1/2*x[rorder[i],di]+1/2*x[ks,di]; x3[di]=minc((-1/2*x[rorder[i],di]+3/2*x[ks,di])|range[2,di]); else; x1[di]=minc((3/2*x[rorder[i],di]-1/2*x[ks,di])|range[2,di]); x2[di]=1/2*x[rorder[i],di]+1/2*x[ks,di]; x3[di]=maxc((-1/2*x[rorder[i],di]+3/2*x[ks,di])|range[1,di]); endif; di=di+1; endo; fitv1=f(x1); fitv2=f(x2); fitv3=f(x3); if f(x[rorder[i],.])fitv2 and fitv1>fitv3; fitv1=fitv1-minc(minfitv|0); x[rorder[i],.]=x1; fitv[rorder[i]]=fitv1; elseif fitv2>fitv1 and fitv2>fitv3; fitv2=fitv2-minc(minfitv|0); x[rorder[i],.]=x2; fitv[rorder[i]]=fitv2; else; fitv3=fitv3-minc(minfitv|0); x[rorder[i],.]=x3; fitv[rorder[i]]=fitv3; endif; endif; elseif ctype[j]==1; /* blend crossover between rorder[i]-th and ks-th */ x1=zeros(1,dim); di=1; do while di<=dim; min=minc(x[rorder[i],di]|x[ks,di])-alpha*abs(x[rorder[i],di]-x[ks,di]); max=maxc(x[rorder[i],di]|x[ks,di])+alpha*abs(x[rorder[i],di]-x[ks,di]); x1[di]=min+(max-min)*rndu(1,1); if x1[di]fitv2; fitv1=fitv1-minc(minfitv|0); x[rorder[i],.]=x1; fitv[rorder[i]]=fitv1; else; fitv2=fitv2-minc(minfitv|0); x[rorder[i],.]=x2; fitv[rorder[i]]=fitv2; endif; endif; elseif ctype[j]==3; /* UNDX crossover between rorder[i]-th and ks-th */ x1=zeros(1,dim); di=1; do while di<=dim; x1[di]=(x[rorder[i],di]+x[ks,di])/2+sig*(x[ks,di]-x[rorder[i],di])*rndn(1,1); if x1[di]fitv2; fitv1=fitv1-minc(minfitv|0); x[rorder[i],.]=x1; fitv[rorder[i]]=fitv1; else; fitv2=fitv2-minc(minfitv|0); x[rorder[i],.]=x2; fitv[rorder[i]]=fitv2; endif; endif; elseif ctype[j]==5; /* unimodal averaing n blend crossover between rorder[i]-th and ks-th */ x1=zeros(1,dim); di=1; do while di<=dim; min=minc(x[rorder[i],di]|x[ks,di])-alpha*abs(x[rorder[i],di]-x[ks,di]); max=maxc(x[rorder[i],di]|x[ks,di])+alpha*abs(x[rorder[i],di]-x[ks,di]); x1[di]=sumc(min+(max-min)*rndu(n,1))/n; if x1[di]fitv2; fitv1=fitv1-minc(minfitv|0); x[rorder[i],.]=x1; fitv[rorder[i]]=fitv1; else; fitv2=fitv2-minc(minfitv|0); x[rorder[i],.]=x2; fitv[rorder[i]]=fitv2; endif; endif; endif; /* perturbation(uniform) */ if d/=0; /* no uniform perturbation if d=0 */ x1=zeros(1,dim); di=1; do while di<=dim; if rndu(1,1)