The following code is not yet complete. It shows a first version where you can set some start values with the command line (startposition, size of the grid, etc.) and then will the ANIMAT operate completely at random, if MODE=0. This can give important benchmarles compared to those versions, where the ANIMAT is extended with some rules and strategies. Different to the version of Wilson (1994) we do not assume an 'infinite finite' world but a finite one with an adjustable size. This allows more detailed investigations depending from ther available space. For more informations see the chapters about GAs and LCSs)
//************************************************************** // File: zcs_wood1.sce // Authors: Gerd Doeben-Henisch // Version Start: April-14, 2010 //********************************************************** // Update: April-14, 2010 // Updatet: April-15, 2010 // Update: April-16, 2010 // Update: April-17, 2010 // Update: April-20, 2010 (Change of coordinates: X for columns and Y for rows) // Update: April-22, 2010 (Including the random number test procedures) // Update: April-23, 2010 (A GRID with less food, Searching the distance to the next food for an ANIMAT) // Update: April-24, 2010 // Update: April-25, 2010 (New Testfields for the random case) // Update: April-26, 2010 // Update: April-28, 2010 // Update: May-02, 2010 // Update: May-03, 2010 (Final Version of automatic generation of transition table transprob(), transprob_tst()) //****************************************************************** // CONTENT: Necessary code for the ZCS system of Wilson (1994) and // his wood1 environment // //*************************************************** // X-Y Coordinates // // scilab has the Y-axis 'inverted': scilab '1,2,...' = Usually '-1,-2,...' // Thus we will write 'YI' for the scilab Y-axis // Furthermore has the scilab matrix notation // M(i,j) to be interpreted M(YI,X) // //************************************************ // 2-DICE PROBABILITIES // Examples from Knuth (1981)(See lecture notes for details) PROBABILITIES= [2 3 4 5 6 7 8 9 10 11 12; 1/36 1/18 1/12 1/9 5/36 1/6 5/36 1/9 1/12 1/18 1/36] DICETEST1 =[2 4 10 12 22 29 21 15 14 9 6] DICETEST2 = [4 10 10 13 20 18 18 11 13 14 13] DICETEST3 = [3 7 11 15 19 24 21 17 13 9 5] //*********************************** // BEHAVIOR FUNCTION WITH CLASSIFIERS // CLASSIFIERS = [ '11##############:0001-100'; '##11############:0010-100'; '####11##########:0011-100'; '######11########:0100-100'; '########11######:0101-100'; '##########11####:0110-100'; '############11##:0111-100'; '##############11:1000-100'; ] //********************************** // GRID 'WOOD1' // // Y = r=1...15, X = c=1...55 // The Y-axis is from above (north) to bottom (south), the X-axis is from left (west) to right (east) // '.' := No Food; encoded '00' // 'O' := Object (Rock); encoded '10' // Attention: scilab assumes GRID(Y,X) columns first and then rows! //******************************************************************** // DYNAMIC GRID GENERATION // Using the wood1-structure as building blocks // // YYMAX := Max number of rows multiplied by 5 // XMAX := Max number of columnsXNtiplied by 5 function[GRID]=gridgen(YYMAX,XXMAX) if (YYMAX < 1) | (XXMAX < 1) then printf("gridgen:ERROR WITH YYMAX, XXMAX\n\n"), end for k=1:5:5*YYMAX i=k for j=1:5*XXMAX, GRID(i+0,j)='.',end i=k+1 for j=1:5:5*XXMAX, GRID(i,j+0)='.' GRID(i,j+1)='O' GRID(i,j+2)='O' GRID(i,j+3)='F' GRID(i,j+4)='.' end i=k+2 for j=1:5:5*XXMAX, GRID(i,j+0)='.' GRID(i,j+1)='O' GRID(i,j+2)='O' GRID(i,j+3)='O' GRID(i,j+4)='.' end i=k+3 for j=1:5:5*XXMAX, GRID(i,j+0)='.' GRID(i,j+1)='O' GRID(i,j+2)='O' GRID(i,j+3)='O' GRID(i,j+4)='.' end i=k+4 for j=1:5*XXMAX, GRID(i+0,j)='.',end end endfunction //******************************************************************** // DYNAMIC GRID GENERATION // Using theextended wood1-structure as building block // // Allows less food cells in the world // // YYMAX := Max number of rows multiplied by 5 // XMAX := Max number of columnsXNtiplied by 5 // S := Inverse scaling to lower the density of food function [GRID]=gridgen2(YYMAX,XXMAX,S) if (YYMAX < 1) | (XXMAX < 1) then printf("gridgen:ERROR WITH YYMAX, XXMAX\n\n"), end r=0 for k=1:5:5*YYMAX i=k for j=1:5*XXMAX, GRID(i+0,j)='.',end i=k+1 for j=1:5:5*XXMAX, GRID(i,j+0)='.' GRID(i,j+1)='O' GRID(i,j+2)='O' if (S>0) & (r==S) then GRID(i,j+3)='F', r=0, else GRID(i,j+3)='O', r=r+1,end GRID(i,j+4)='.' end i=k+2 for j=1:5:5*XXMAX, GRID(i,j+0)='.' GRID(i,j+1)='O' GRID(i,j+2)='O' GRID(i,j+3)='O' GRID(i,j+4)='.' end i=k+3 for j=1:5:5*XXMAX, GRID(i,j+0)='.' GRID(i,j+1)='O' GRID(i,j+2)='O' GRID(i,j+3)='O' GRID(i,j+4)='.' end i=k+4 for j=1:5*XXMAX, GRID(i+0,j)='.',end end endfunction //******************************************************************** // TESTGRIDS WITH OBJECTS // // GD3O2F1=['.' '.' '.'; 'O' 'O' '.'; '.' 'F' '.' ] GD3O2F12=['.' '.' '.'; '.' 'O' 'O'; '.' 'F' '.' ] GD3O2F13=['.' '.' '.'; '.' 'O' '.'; '.' 'F' '.' ] //************************************************* // AUTOMATIC GENERATION OF TRANSITION TABLE // Takes every cell of a given GRID and computes the transition probabilities // with regard to every possible direction 1 ... 8 // function [TGRID]=transprob(GRID) [r,c]=size(GRID) TGRID=zeros() N=r*c MAX=9 Y=0 while(Y<N) for y=1:r, for x=1:c, Y=Y+1 // printf("\n---------------Y = %d----------------------\n\n",Y) m=1 //Catch wrong indices and evaluate cases if (y-1)<1 then m=m+1, elseif GRID(y-1, x) == 'O' then TGRID(Y,(y-1)*c+x)=0, m=m+1,else TGRID(Y,(y-1-1)*c+x)=1/MAX, end if (y-1)<1|(x+1)>c then m=m+1,elseif GRID(y-1, x+1) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1-1)*c+x+1)=1/MAX, end if (x+1)>c then m=m+1,elseif GRID(y, x+1) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1)*c+x+1)=1/MAX, end if (y+1)>r|(x+1)>c then m=m+1,elseif GRID(y+1, x+1) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1+1)*c+x+1)=1/MAX, end if (y+1)>r then m=m+1,elseif GRID(y+1, x) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1+1)*c+x)=1/MAX, end if (y+1)>r|(x-1)<1 then m=m+1,elseif GRID(y+1, x-1) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1+1)*c+x-1)=1/MAX, end if (x-1)<1 then m=m+1,elseif GRID(y, x-1) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1)*c+x-1)=1/MAX, end if (y-1)<1|(x-1)<1 then m=m+1,elseif GRID(y-1, x-1) == 'O' then TGRID(Y,(y-1)*c+x)=0,m=m+1,else TGRID(Y,(y-1-1)*c+x-1)=1/MAX, end if GRID(y, x)=='O' then for z=1:N,TGRID(Y,z)=0,end else TGRID(Y,Y)=m/MAX, end end //x end //y end //Y endfunction //************************************************* // AUTOMATIC GENERATION OF TRANSITION TABLE // Takes every cell of a given GRID and computes the transition probabilities // with regard to every possible direction 1 ... 8 // function [TGRID]=transprob_tst(GRID) [r,c]=size(GRID) TGRID=zeros() N=r*c MAX=9 Y=0 while(Y<N) for y=1:r, for x=1:c, Y=Y+1 printf("\n---------------Y = %d----------------------\n\n",Y) m=1 //Catch wrong indices and evaluate cases if (y-1)<1 then printf(" __BORDER__"), m=m+1, elseif GRID(y-1, x) == 'O' then printf(" __OBJECT__"),TGRID(Y,(y-1)*c+x)=0, m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1-1)*c+x)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1-1)*c+x, TGRID(Y,(y-1-1)*c+x)), end if (y-1)<1|(x+1)>c then printf(" __BORDER__"), m=m+1,elseif GRID(y-1, x+1) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1-1)*c+x+1)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1-1)*c+x+1,TGRID(Y,(y-1-1)*c+x+1)), end if (x+1)>c then printf(" __BORDER__"), m=m+1,elseif GRID(y, x+1) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1)*c+x+1)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1)*c+x+1,TGRID(Y,(y-1)*c+x+1)), end if (y+1)>r|(x+1)>c then printf(" __BORDER__"), m=m+1,elseif GRID(y+1, x+1) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1+1)*c+x+1)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1+1)*c+x+1,TGRID(Y,(y-1+1)*c+x+1)), end if (y+1)>r then printf(" __BORDER__"), m=m+1,elseif GRID(y+1, x) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1+1)*c+x)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1+1)*c+x,TGRID(Y,(y-1+1)*c+x)), end if (y+1)>r|(x-1)<1 then printf(" __BORDER__"), m=m+1,elseif GRID(y+1, x-1) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1+1)*c+x-1)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1+1)*c+x-1,TGRID(Y,(y-1+1)*c+x-1)), end if (x-1)<1 then printf(" __BORDER__"), m=m+1,elseif GRID(y, x-1) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1)*c+x-1)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1)*c+x-1,TGRID(Y,(y-1)*c+x-1)), end if (y-1)<1|(x-1)<1 then printf(" __BORDER__"), m=m+1,elseif GRID(y-1, x-1) == 'O' then printf(" __OBJECT__"), TGRID(Y,(y-1)*c+x)=0,m=m+1,else printf(" __MOVE__"),TGRID(Y,(y-1-1)*c+x-1)=1/MAX, printf("(y,x) = (%d,%d) with m = %d TG(Y,Y) = (%d,%d) = %f\n",y,x,m,Y,(y-1-1)*c+x-1,TGRID(Y,(y-1-1)*c+x-1)), end if GRID(y, x)=='O' then for z=1:N,TGRID(Y,z)=0,end else TGRID(Y,Y)=m/MAX, end end //x end //y end //Y endfunction //********************************************** // SOME TEST RESULTS // Mean and StandardDeviation directly by scilab: // // M=[],for i=1:6, M(i,1)=mean(D2RESULTS0(i,:)), M(i,2)= st_deviation(D2RESULTS0(i,:)), end // Extracting the MAXima of a run // MAXD2=max(D2RESULTS0,"c") // Extracting the 1st row out of the results // D2R30=D2RESULTS0([1],[:]) // Starting a counter for the frequencies // F30=zeros(1,MAXD2(1,1)+1) // F40=zeros(1,MAXD2(2,1)+1) // Computing the frequency of the values of a run // for i=1:c, F30(1,D2R30(1,i)+1)=F30(1,D2R30(1,i)+1)+1,end // for i=1:c, F40(1,D2R40(1,i)+1)=F40(1,D2R40(1,i)+1)+1,end // F30 =[12 8 2 3] := 12 x 0, 8 x 1, ... // Compute the means by using the values in T and the frequencies in F // N=sum(F), MEAN=0, for i=1:length(T), MEAN=MEAN+(F(1,i)*T(1,i)),end; MEAN=MEAN/N // DIFFs=[], for i=1:length(F30), DIFFs(1,i)=(i-1)-MEAN,end // DIFs2=[],for i=1:length(F30), DIFs2(1,i)=DIFFs(1,i)^2,end // Attention: the index of the array FX30 as 'i-1' is the observed value! // SAQs=[],for i=1:length(F30), SAQs(1,i)=F30(1,i)*DIFs2(1,i),end // standard deviation // N=sum(F30),s=sqrt(sum(SAQs)/(N-1)) //********************************** // RANDOM TEST WORLD FOR BENCHMARKING // // This world has one food cell with 'F' in the center and // has a fixed diameter d according to the distance which // shall be explored. function[GRID]=testgrid(DISTANCE) D=DISTANCE //Generate normal empty space '.' for j=1:(2*D)+1, for i=1:(2*D)+1 GRID(i,j)='.', end end //Locate the food in the center GRID(D+1,D+1)='F' endfunction //************************************************* // ANIMAT STRUCTURE Xanimat = 3 Yanimat = 5 RewTotal = 0 RewActual = 0 ANIMAT = list(Xanimat, Yanimat, RewTotal, RewActual) //**************************************************** // HISTORY // Collecting data during one life-cycle // 1 := Cycle number k // 2 := Object before move // 3 := X-Pos // 4 := Y-Pos // 5 := REWTotal HISTORY =[] //*************************************************** // Function to decode the content of a cell function[CELLVALUE]=contdecode(YI,X,GRID,SHOW) [YMAX, XMAX]=size(GRID) if (SHOW==1) then printf("contdecode: SIZE OF GRID (X,Y) = (%d,%d)\n",XMAX,YMAX),end CELLVALUE=[] if (SHOW==1) then printf("contdecode: YI= %d, X= %d\n",YI,X),end if (X > XMAX) | (X < 1) | (YI > YMAX) | (YI <1) then CELLVALUE='BB' elseif GRID(YI,X) =='.' then CELLVALUE='00' elseif GRID(YI,X) =='O' then CELLVALUE='10' elseif GRID(YI,X) =='F' then CELLVALUE='11' else printf("contdecode:ERROR AT CELL =( %d,%d)\n",X,YI) end endfunction //************************************************* // SENSING ENVIRONMENT // // Loocking to the 'north' the Animat can see the content of all it's neighbouring cells clockwise around. // The encoding is as follows: // '.' := Empty space encoded '00' // 'O' := Object Rock encoded '10' // 'F' := Object Food encoded '11' // // Different to Wilson (1994) we do not assume an 'infinite finite' world by 15 rows and 55 columns // but a finite world with dynamic shape. This allows to investigate the effect of GRID size onto different parameters. // function [SENSINPUT,INPUT]=animsens(YI,X,GRID,SHOW) //Having a 'number' version of the input SENSINPUT=[] //Having a 'sring' version of the input INPUT="" //The cells will be searched from 'north' in clockwise order // The coordinates below are relativ to the actual position of the ANIMAT P=[-1,0; -1,1; 0,1; 1,1; 1,0; 1, -1; 0,-1; -1,-1 ] [r,c]=size(P) for j=1:r, SENSINPUT(j)=contdecode(YI+P(j,1),X+P(j,2),GRID), INPUT=INPUT+string(SENSINPUT(j)) end if (SHOW==1) then printf("Sens Input: %s\n\n",INPUT) end endfunction //************************************************* // RANDOM MOVEMENT GENERATOR // Generates movements based on uniform random numbers from 0 ... 8 // // XO, YO := old X-Y-Position // XN, XN := new X-Y-Position function [XN,YN] =mover(XO, YO, GRID) R=floor(9*rand()) //printf("mover:RANDOM NUMBER R= %d\n\n",R) //The cells will be searched from 'north' in clockwise order if R == 0 then XN=XO, YN=YO elseif R == 1 then YN=YO-1, XN=XO elseif R==2 then YN=YO-1, XN=XO+1 elseif R==3 then YN=YO, XN=XO+1 elseif R==4 then YN=YO+1, XN=XO+1 elseif R==5 then YN=YO+1, XN=XO elseif R==6 then YN=YO+1, XN=XO-1 elseif R==7 then YN=YO, XN=XO-1 elseif R==8 then YN=YO-1, XN=XO-1 else printf("mover:ERROR WITH MOVEMENT AT = (XO, YO) = ( %d,%d)\n",XO,YO) end endfunction //************************************************* // FOOD DISTANCE EVALUATOR // Starting the search at the actual position of the ANIMAT // the search searches all cells with distance=i in a // clockwise order. If it finds food cells these will // be 'tracked' and the distance is is fixed to i. // // Attention: If the ANIMAT is located near the boarder of the GRID one // has to 'neutralize' thoses values which point 'beyond' the GRID function [FDISTANCE,GLIST]=foodsearch(ANIMAT, GRID,SHOW) if(SHOW==1) then printf("foodsearch: START AT (%d,%d)\n\n",ANIMAT(1),ANIMAT(2)),end //The cells will be searched from 'north' in clockwise order // GOALFLAG indicates having found a food cell // FDISTANCE measures the distance // K is an index to list the goal coordinates // GLIST collects the coordinates of the goals [row,col]=size(GRID) if(SHOW==1) then printf("row = %d, col = %d\n",row,col),end GOALFLAG=0 FDISTANCE=0 X=ANIMAT(1),YI=ANIMAT(2) GLIST=[] K=1 if(SHOW==1) then printf("foodsearch: 1\n\n"),end L=1 while(GOALFLAG==0)| (2*L>floor(sqrt(row^2+col^2))) if(SHOW==1) then printf("foodsearch: 2, L=%d\n\n",L),end for j=-L:L, for i=-L:L, if(SHOW==1) then if(X+i <1)|(YI+j <1)| (X+i >col) |(YI+j>row) then printf("BEYOND\n"), else printf("foodsearch: 3 (YI,X) = (%d,%d) = %s\n\n",YI+j,X+i,GRID(YI+j,X+i)),end end if(X+i >1)&(YI+j >1)& (X+i <col) &(YI+j<row) & GRID(YI+j,X+i)=='F' then GOALFLAG=1, FDISTANCE=L,GLIST(K,1)=X+i, GLIST(K,2)=YI+j,K=K+1,end end // FOR end //FOR L=L+1 end //WHILE endfunction //************************************************* // MOVEMENT EVALUATION // DEPENDING FROM CONTENT OF NEW PROPOSED POSITION SELECT ACTION // // Borderline := -3 (negative reward) // Object := -2 (negative reward) // Empty cell := -1 (move into it, but looses energy) //// Food := (move into it, reward +1000) // // Borderline := XXMAX = YYMAX = 1 or YYMAX or XXMAX // // CONT := Decoded content // GRID := Assumed GRID // REW := Reward inferred // ACT := No Move as 0, Move as 1 function [REW,ACT,OBJ] =moveeval(CONT, GRID,SHOW) if CONT == 'BB' then REW=-1, ACT=0, OBJ=-1 elseif CONT == '00' then REW=-2, ACT=1, OBJ=0 elseif CONT == '10' then REW=-1, ACT=0, OBJ=1 elseif CONT == '11' then REW=1000, ACT=1, OBJ=2 else printf("moveeval:ERROR WITH MOVEEVAL\n\n") end if (SHOW==1) then printf("moveeval:REWARD = %d, ACTION = %d\n\n",REW,ACT) end endfunction //************************************************* // UPDATE ANIMAT // // Either keep position or move. // Summarize reward function [ANIMAT] = updateAnim(ANIMAT,REW,ACT,XN,YN,SHOW) if ACT == 1 then ANIMAT(1) = XN, ANIMAT(2) = YN, ANIMAT(4) = REW, ANIMAT(3)=ANIMAT(3)+REW else ANIMAT(4) = REW, ANIMAT(3)=ANIMAT(3)+REW end if (SHOW==1) then printf("update ANIMAT: A-POS = (%d,%d), A-REW = %d, A-REW-SUM = %d\n\n",ANIMAT(1), ANIMAT(2), ANIMAT(4), ANIMAT(3)) end endfunction //*************************************************** // Function to fetch the conditions out of the classifier set // function [CONDITIONS]=getCondition(CLASSIFIERS) [r,c]=size(CLASSIFIERS) CONDITIONS="" for j=1:r T=tokens(CLASSIFIERS(j,1),[':']), CONDITIONS(j)=string(T(1,1)) end endfunction //*************************************************** // Get set of matching conditions function [MATCHSET]=getCondition(CONDITIONS, INPUT) [r,c]=size(CONDITIONS) //...to be completed... endfunction //*************************************************** // SIMPLE AUTOMATED TEST FRAMEWORK FOR ZCS // // Automatic testing for a certain GRID with given numers of runs // // ANIMAT := Structure OF ANIMAT system // HISTORY := Protocol of movements and cumulated rewards // GRID := Content of environment // MODE := random (=0), non-random (=1) // YYMAX := Number of rows times 5 // XXMAX := Number of columns times 5 // RUNS := How many cycles the simulation shall run. 1 cycle means one action // S := scaling factor in the sparse food case // GRID := Fixed GRID from external source // DISTANCE := General distance from food in test field function [ANIMAT,HISTORY,GRID,FOOD]=liveR(ANIMAT,CLASSIFIERS,MODE,YYMAX, XXMAX, S,GRID,DISTANCE, RUNS,HISTORY,SHOW) if (RUNS<0) then error('RUNS is not specified'),end //GENERATE FIXED TEST GRID if (S==-1) then [GRID]=testgrid(DISTANCE), //GENERATE dynamic GRID elseif (S == 0) then [GRID]=gridgen(YYMAX, XXMAX), //GENERATE dynamic GRID with sparse food elseif (S == 1) then [GRID]=gridgen2(YYMAX,XXMAX,S), // USE external GRID else S =2, end //SET GLOBAL VARIABLES TO ZERO HISTORY=[] ANIMAT(3)=0 f=1 //Index to store in which cycle food has been found FOOD=[] //Storage for differences FOLD=0 FNEW=0 k=1 while(k < RUNS+1), if (SHOW==1) then printf("-----CYCLE %d---------------------------------------------------\n\n",k) end [YMAX,XMAX]= size(GRID) //printf("DIMENSION OF GRID - ROWS = %d, COLUMNS = %d\n\n",ZMAX,XMAX) // (1) Get actual position (XO,YO) from Animat // Is given with argument ANIMAT(1) = rows and ANIMAT(2) = columns XO= ANIMAT(1) YO= ANIMAT(2) if (SHOW==1) then printf("ACTUAL POSITION =(XO,YO) = (%d, %d)\n\n",XO,YO) end // Get SENSINPUT as string: INPUT if(MODE==1) then [SENSINPUT,INPUT]=animsens(YO,XO,GRID,SHOW) end // (2) Generate new move (XN,YN) [XN,YN] =mover(XO, YO, GRID) if (SHOW==1) then printf("NEW POSITION PROPOSED=(XN,YN)= (%d, %d)\n\n",XN,YN),end // (3) Decode the content of new position [CELLVALUE]=contdecode(YN,XN,GRID,SHOW) if (SHOW==1) then, printf("CONTENT OF NEW POSITION= %s\n\n",CELLVALUE),end // (4) Depending from content finalize move [REW,ACT,OBJ] =moveeval(CELLVALUE, GRID,SHOW) // (5) Update ANIMAT [ANIMAT] = updateAnim(ANIMAT,REW,ACT,XN,YN,SHOW) if (REW==1000) then FNEW=k,FOOD(f,1)=FNEW-FOLD, FOLD=FNEW, f=f+1, end if (SHOW==1) & (REW==1000) then printf("FOOD in CYCLE = %d\n\n",k),end // Update PATHHISTORY [r,c]=size(HISTORY) //INDEX HISTORY(r+1,1)=k //CONTENT HISTORY(r+1,2)=OBJ // POSITION HISTORY(r+1,3)=XN, HISTORY(r+1,4)=YN //REWARDTOTAL HISTORY(r+1,5)=ANIMAT(3) //Update while loop k=k+1, end MEAN=mean(FOOD) printf("REWSUM/1000 = %f\n, TIMES FOOD = %f, MEAN LENGHT = %f\n\n",ceil((ANIMAT(3)/1000)),length(FOOD),MEAN) endfunction //*************************************************** // SIMPLE AUTOMATED TEST FRAMEWORK FOR ZCS // WITH REPETITION // // ANIMAT := Structure OF ANIMAT system // HISTORY := Protocol of movements and cumulated rewards // GRID := Content of environment // MODE := random (=0), non-random (=1) // YYMAX := Number of rows times 5 // XXMAX := Number of columns times 5 // RUNS := How many cycles the simulation shall run. 1 cycle means one action // S := scaling factor in the sparse food case // GRID := Fixed GRID from external source // DISTANCE := General distance from food in test field // N:= Number of repetitions of an experiment with RUNS-many actions // FOODHITS := List of food hits per repetition // MEAN := statistical mean // STD := standard deviation function [FOODHITS,MEAN, STD]=experiment(ANIMAT,CLASSIFIERS,MODE,YYMAX, XXMAX, S,GRID,DISTANCE, RUNS,HISTORY,SHOW,N) FOODHITS=[] for i=1:N, [ANIMAT,HISTORY,GRID,FOOD]=liveR(ANIMAT,CLASSIFIERS,MODE,YYMAX, XXMAX, S,GRID,DISTANCE, RUNS,HISTORY,SHOW), [r,c]=size(FOODHITS), //INDEX FOODHITS(r+1,1)=length(FOOD), end MEAN=mean(FOODHITS) STD=st_deviation(FOODHITS) endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // N := Numbers of psyeudo random numbers to generate // EQUISUMS := counting each number r_i within N // SHOW := Flag, if '1' then print random numbers, otherwise not // C := Number of categories +1 function [EQUISUMS] =countingrands(N,C,SHOW) // Matrix for counting the C-many different events EQUISUMS=zeros(1,C) //Loop to generate pseudo random numbers i=0 while (i<N), R=floor(C*rand()) //PRINT 'on demand' if (SHOW==1) then printf("countingrands:RANDOM NUMBER R= %d\n",R) end //Counting occurences of different numbers for j=1:C, if (R==j-1) then EQUISUMS(j)= EQUISUMS(j)+1,end end i=i+1 end endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // N := Numbers of psyeudo random numbers to generate // EQUISUMS := counting each number r_i within N // SHOW := Flag, if '1' then print random numbers, otherwise not // C := Number of categories +1 function [EQUISUMS] =countingMatrix1(N,C,SHOW) // Matrix for counting the C-many different events EQUISUMS=zeros(1,C) //Generate pseudo random numbers RANDMATRIX=rand(1,N) //Counting occurences of different numbers for i=1:N RANDMATRIX(1,i)=floor(RANDMATRIX(1,i)*C) for j=1:C, if (RANDMATRIX(1,i)==j-1) then EQUISUMS(j)= EQUISUMS(j)+1,end end end endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // N := Numbers of psyeudo random numbers to generate // EQUISUMS := counting each number r_i within N // SHOW := Flag, if '1' then print random numbers, otherwise not // C := Number of categories +1 function [EQUISUMS] =countingMatrix2(N,C,SHOW) // Matrix for counting the C-many different events RANDMATRIX=zeros(1,N) EQUISUMS=zeros(1,C) //Generate pseudo random numbers RANDMATRIX=grand(1,N,'uin',0,C-1) printf("\nSeed after %d\n",rand('seed')) //Counting occurences of different numbers for i=1:N for j=1:C, if (RANDMATRIX(1,i)==j-1) then EQUISUMS(j)= EQUISUMS(j)+1,end end end endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // Computing the differences between theoreticalyl expected and observed values function [DIFFSUMS] =sumdifferences(N,C,EQUISUMS) DIFFSUMS=zeros(1,C) for i=1:C, DIFFSUMS(i)=(N/C)-EQUISUMS(i), DIFFSUMS(i)=DIFFSUMS(i)/(N/(C/100)),end endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // Computing the Chi-square statistics assuming equally distributed probabilities function [CHISQUARE] =chisquare1(N,C,EQUISUMS,SHOW) np=(1/C)*N S=0 for i=1:C, if (SHOW==1) then printf(" i= %d, Observed= %d, Expected = %f\n",i,EQUISUMS(i), np), printf(" i= %d,Diff= %f,Diff-Square = %f\n",i,EQUISUMS(i)- np, (EQUISUMS(i)- np)^2), printf(" i= %d,Quotient = %f\n",i,((EQUISUMS(i)- np)^2)/np), end S=S+((EQUISUMS(i)-np)^2)/np, end CHISQUARE=S endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // Computing the Chi-square statistics assuming different probabilities // PROBABILITIES := Array of different probabilities function [CHISQUARE] =chisquare1b(N,C,EQUISUMS,SHOW) [r,c]=size(EQUISUMS) if(c <> C) then printf("chisquare1b: c and C DIFFERENT!!!\n\n"),end PROBABILITIES=zeros(r,c) for i=1:c, PROBABILITIES(1,i)=1/C,end S=0 for i=1:c S=S+((EQUISUMS(i)-N*PROBABILITIES(1,i))^2)/(N*PROBABILITIES(1,i)),end CHISQUARE=S endfunction //************************************************* // RANDOM NUMBER GENERATOR SIMULATING TWO DICES // // N := Numbers of psyeudo random numbers to generate // EQUISUMS := counting each number r_i within N // SHOW := Flag, if '1' then print random numbers, otherwise not // C := Number of overall categories +1 // MAXDICE := MAximum of onbe dice function [EQUISUMS] =counting2rands(N,SHOW,MAXDICE) // Matrix for counting the C-many different events EQUISUMS=zeros(1,(MAXDICE*2)-1) //Loop to generate pseudo random numbers i=0 while (i<N), R1=floor(MAXDICE*rand())+1 R2=floor(MAXDICE*rand())+1 X = R1+R2 //PRINT 'on demand' if (SHOW==1) then printf("countingrands:RANDOM NUMBERs R1= %d, R2=%d, X=%d\n",R1,R2,X) end //Counting occurences of different numbers for j=2:MAXDICE*2, if (X==j) then EQUISUMS(j-1)= EQUISUMS(j-1)+1, end end i=i+1 end endfunction //************************************************* // RANDOM NUMBER GENERATOR TESTs // Testing the quality of the produced pseudo-random numbers // according to some procedures described by Knuth 1989. // // Computing the Chi-square statistics assuming different probabilities // PROBABILITIES := Array of different probabilities function [CHISQUARE] =chisquare2(N,EQUISUMS,PROBABILITIES,SHOW) [RR,CC]=size(PROBABILITIES) [r,c]=size(EQUISUMS) if (c <> CC) then printf("chisquare2:EQUISUMS and PROBABILITIES have DIFFERENT columns\n\n"),end CHISQUARE=0 S=0 for i=1:CC, if (SHOW==1) then printf(" i= %d, Observed= %d, Expected = %f\n",i,EQUISUMS(i), N*PROBABILITIES(2,i)), printf(" i= %d,Diff= %f,Diff-Square = %f\n",i,EQUISUMS(i)- N*PROBABILITIES(2,i), (EQUISUMS(i)- N*PROBABILITIES(2,i))^2), printf(" i= %d,Quotient = %f\n",i,((EQUISUMS(i)- N*PROBABILITIES(2,i))^2)/N*PROBABILITIES(2,i)), end S=S+((EQUISUMS(i)-N*PROBABILITIES(2,i))^2)/(N*PROBABILITIES(2,i)),end CHISQUARE=S endfunction //************************************************* // CELLDISTANCE // Measured in Manhattan Distance // Not usable for movements because movements can happen as diagonal moves too! // // V1 =(X1,Y1) // V2 = (X2,Y2) function [CELLDIST] =celldistance(V1,V2) CELLDIST=( abs(V1(1,1)-V2(1,1)) + abs(V1(1,2)-V2(1,2)) ) endfunction //********************************************************* //Some common constants //Conversion of radiants into grade grad=(2*%pi)/360 //Conversion of radiants into degrees igrad=360/(2*%pi) //*************************************************** //Function to compute the sum of a vector v and the i-th row of a matrix M function[M]=vecAddMi(M,i,v) //Test whether the length of v is equal to the columns of M [r,c]=size(M); if l <> c then error('SIZE of VECTOR DOES NOT MATCH MATRIX'), else for j=1:c, M(i,j) = M(i,j)+v(j), end end endfunction //*************************************************** //Function to compute the difference of a vector v and the i-th row of a matrix M function[M]=vecSubMi(M,i,v) //Test whether the length of v is equal to the columns of M l=length(v); [r,c]=size(M); if l <> c then error('SIZE of VECTOR DOES NOT MATCH MATRIX'), else for j=1:c, M(i,j) = M(i,j)-v(j), end end endfunction //*************************************************** //Function to compute the product of two vectors v,w function[u]=vecprod(v,w) lv=length(v); lw=length(w); u=0 if lv <> lw then error('DIFFERENT LENGTH OF VECTORS'); else for i=1:lv, u=u + (v(i)*w(i)); end end endfunction //*************************************************** //Function to compute the projection of a vector v onto a line with angle theta //angle in degree function[y]=vecproj(v,t) //Convert radiants into degree t=t/igrad y=norm(v)*cos(t) endfunction //*************************************************** //Function to compute the projection of a vector v onto a line with line w function[y]=vecprojL(v,w) y=vecprod(v,w)/norm(w) endfunction //************************************************************* //Function to compute the angle of two vectors v,w in 360 degree //Vectors v,w are column or row vectors function[y]=cosvec(v,w) y=vecprod(v,w)/(norm(v)*norm(w)) //The result in y is the cos-value. We need the invers of this y=acos(y) //The inverse is given in radiants. We want the conversion to degrees y=y/grad endfunction //End of function cosvect ****************************************** //******************************************************* //Function to multiply a vector v with a quadratic matrix M generating a vector u function[u]=vmprod(v,M) [r,c]=size(M) lv=length(v) u=zeros(1,lv) if (r <> lv) then error('sizes of vector and matrix do not match') else for i=1:c //Following the columns of matrix for j=1:r //Working through all elements of v and rows of M u(j)=u(j) + (v(i) *M(i,j)) end end end endfunction //******************************************************* //Function to multiply a vector v with a selectable matrix M generating a vector u function[u]=vmprod2(M,v) [r,c]=size(M) lv=length(v) u=zeros(1,lv) if (r <> lv) then error('sizes of vector and matrix do not match') else for j=1:r //Following the rows of matrix for i=1:c //Working through all elements of v and columns of M u(j)=u(j) + (v(i) *M(j,i)) end end end endfunction //******************************************************* //Macro for the usage of vmprod2() // function [OUTPUT]=vmprod2makro(WEIGHT,INPUT,RUNS) for i=1:RUNS, [OUTPUT]=vmprod2(WEIGHT,INPUT), INPUT = OUTPUT, end endfunction //******************************************************* // DYNAMIC PROBABILITY FIELD // Function for the repeated usage of vmprod2() // // INPUT:= Initial Probability Distrbution of the Field (agent =1) function [OUTPUT, STD]=fieldprob(WEIGHT,INPUT,RUNS, SHOW) for i=1:RUNS, [OUTPUT]=vmprod2(WEIGHT,INPUT), INPUT = OUTPUT, if (SHOW==1) then printf("RUN= %d : ",i), for j=1:length(OUTPUT), printf(" %f ",OUTPUT(1,j)), end, printf("\n\n"), end end STD=st_deviation(OUTPUT) endfunction //**************************************************** //Funcion to generate a m x n - Matrix with the scalar c function[C] = matrixC(r,c,a) C=[] //New Matrix for i=1:c; for j=1:r; C(i,j)=a; end; end //Generate new matrix with scalar a C endfunction //**************************************************** //Funcion to generate a m x n - Matrix with the scalar c out of a given matrix M function[C] = matrixCC(M,a) C=[] //New Matrix [c,r]=size(M) //Get dimension of given matrix M by columns and rows for i=1:r, for j=1:c, C(i,j)=a, end, end //Generate new matrix with scalar a endfunction