The following code describes an agent of type
with a simple perception of type 'birds-view' and with a fixed evaluation schema using a classifier structure without evolutionary learning. Thus ANIMAT1 represents a 'fixed character' whose reactive responses are optimized to look first for food, then selecting available spaces, and -if this all does not work- then to stay at the old position before trying again. Furthermore it is here assume that the ANIMAT1 consumes energy depending from time (= cycles). Doing 'nothing' decrements energy by '-1', moving without finding food decrements by '-2' and finding food increments by '1000'. Thus depending from its energy budget and depending from the environment has this agent some chance or no chance at all. Looking to its behavior one can observe that this agent, if he has found some food, he will get stuck to this food as long as the food does not disappear.
//**************************************************************
// File: zcs1.sce
// Authors: Gerd Doeben-Henisch
// Version Start: May-18, 2010
//---------------------------------
// Update May-19-2010-1459
// Update May-19-10-2343
// Update May-20-10-0637
//**********************************************************
// diary('H:\fh\scilab\histories\Date.txt')
//diary('/home/gerd/public_html/uffmm/science-technology/single/themes/computer-science/personal-sites/doeben-henisch/KNOW/GBBLT/SCILAB/HISTORIES/May20-10-1032.txt')
//******************************************************************
// CONTENT: Necessary code for an ANIMAT1-agent, the successor of the
// ANIMAT0-agent.
// The difference from A...0 to A...1 is that the the A...1
// uses a 'birds-view' perception and evaluates
// dirctly the 'positive' properties based on
// some 'prewired' knowledge.
//
//***************************************************
//**********************************
// 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' '.' ]
GD3O2F0=['.' '.' '.'; 'O' 'O' '.'; '.' '.' '.' ]
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
//**********************************
// 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
//***********************************
// BEHAVIOR FUNCTION WITH CLASSIFIERS
//
CLASSIFIERS = [
'11##############' '0001' '000';
'##11############' '0010' '000';
'####11##########' '0011' '000';
'######11########' '0100' '000';
'########11######' '0101' '000';
'##########11####' '0110' '000';
'############11##' '0111' '000';
'##############11' '1000' '000';
'00##############' '0001' '000';
'##00############' '0010' '000';
'####00##########' '0011' '000';
'######00########' '0100' '000';
'########00######' '0101' '000';
'##########00####' '0110' '000';
'############00##' '0111' '000';
'##############00' '1000' '000'
]
CLASSIF = [
'11##############' '1' '000';
'##11############' '2' '000';
'####11##########' '3' '000';
'######11########' '4' '000';
'########11######' '5' '000';
'##########11####' '6' '000';
'############11##' '7' '000';
'##############11' '8' '000';
'00##############' '1' '000';
'##00############' '2' '000';
'####00##########' '3' '000';
'######00########' '4' '000';
'########00######' '5' '000';
'##########00####' '6' '000';
'############00##' '7' '000';
'##############00' '8' '000'
]
//*************************************************
// ANIMAT STRUCTURE
// The ANIMAT has a POSITION = (Yanimat, Xanimat)
// has a memory for the REWARD (FITNESS) RewTotal and RewActual
// and has a set of CLASSIFIERS as his
// PREWIRED KNOWLEDGE connecting perceived PROPERTIES
// with a proposed ACTION
// The FITNESS within ANIMAT1 is not yet used
// (only for a measurement protocol)
// NEW: the ANIMAT1 has an ENERGY level which is controlled
// by TIME and by ACTIVITY
// Passiv, no move --> '-1'
// Move without food --> '-2'
// Move with food --> '-2' + '1000'
Xanimat = 3
Yanimat = 5
RewTotal = 0
RewActual = 0
Energy = 1000 //Start value, could be differently
ANIMAT = list(Xanimat, Yanimat, RewTotal, RewActual, CLASSIF, Energy)
//****************************************************
// HISTORY
// Collecting data during one life-cycle
// 1 := Cycle number k
// 2 := Object before move
// 3 := X-Pos
// 4 := Y-Pos
// 5 := REWTotal
// 6 := eNERGY
HISTORY =[]
//***************************************************
// Function to decode the content of a cell
// NEW for ANIMAT1
//
// Only change: Border 'BB' is replaced by value '01'
function[CELLVALUE]=decode(YI,X,GRID,SHOW)
[YMAX, XMAX]=size(GRID)
if (SHOW==1) then printf("decode: SIZE OF GRID (X,Y) = (%d,%d)\n",XMAX,YMAX),end
CELLVALUE=[]
if (SHOW==1) then printf("decode: YMAX=%d, XMAX=%d,YI= %d, X= %d\n",YMAX, XMAX,YI,X),end
if (X > XMAX) | (X < 1) | (YI > YMAX) | (YI <1) then CELLVALUE='01'
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("decode:ERROR AT CELL =( %d,%d)\n",X,YI)
end
endfunction
//*************************************************
// SENSING ENVIRONMENT
// Function ainp(POS,DISTANCE) from ANIMAT1-agent
//
// Loocking to the 'north' the Animat can see the content of all it's neighbouring cells clockwise around.
// Enhancing the distance by 1 extends the field to the next 'circle'
// The encoding is as follows:
// '.' := Empty space encoded '00'
// Border := has to be encoded as '01'
// 'O' := Object Rock encoded '10'
// 'F' := Object Food encoded '11'
function [PERC]=ainp(YI,X,GRID,SHOW)
//Having a 'number' version of the input
SENSINPUT=[]
PERC=""
//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)=decode(YI+P(j,1),X+P(j,2),GRID),
PERC=PERC+string(SENSINPUT(j))
end
if (SHOW==1) then
printf("Sens Input: %s\n\n",PERC)
end
endfunction
//*************************************************
// MATCH
// match: PERC x CLASSIFIERS ---> {INDX, .... }
//
// match1 is a highly specialized function which computes the index
// INDXCL of a classifier which shall be activated.
// It takes the position of food or space in the perceptional string
// PERC and then maps this position to a classifier which has to be
// prepared in an appropriate way.
//
// If INDXCL is either '0' then there is no action ACT, otherwise the
// index INDXCL is the number of an appropriate classifier
function [INDXCL,REWARD]=match1(PERC, CLASSIF,SHOW)
[r,c]=size(CLASSIF)
m=[]
f=-1
if(strindex(PERC,'11')<>[]) then
f=1, REWARD=1000-2
k=strindex(PERC,'11'),
v=floor(modulo(k+1,2))
j=1,
for i=1:length(v), if v(i)==0 then m(j)=(k(i)+1)/2,j=j+1,end,end
elseif(strindex(PERC,'00')<>[]) then
f=0, REWARD=-2
k=strindex(PERC,'00'),
v=floor(modulo(k+1,2))
j=1,
for i=1:length(v), if v(i)==0 then m(j)=(k(i)+1)/2,j=j+1,end,end
else REWARD=-1
end
maxR=length(m)
INDX=floor(maxR*rand())+1
INDXCL=m(INDX)
if (f==1) then INDXCL=INDXCL
elseif (f==0) then INDXCL=INDXCL+8
else INDXCL=0
end
endfunction
//***************************************************
// Function to fetch the action out of the classifier set
//
function [ACT]=action1(CLASSIF, INDXCL)
ACT=CLASSIF(INDXCL,2)
endfunction
//*************************************************
// MAP ACT into POS
// Function aout: ACT --> POS
function [YN, XN]=aout(ACT,SHOW, YO, XO)
// The coordinates below are relativ to the actual position of the ANIMAT
//They work 'clockwise' around beginning with 'north'
P=[-1,0; -1,1; 0,1; 1,1; 1,0; 1, -1; 0,-1; -1,-1 ]
YN=YO+P(evstr(ACT),1),
XN=XO+P(evstr(ACT),2)
endfunction
//*************************************************
// UPDATE ANIMAT
//
// Either keep position or move.
// Summarize reward
function [ANIMAT] = updateAnim(ANIMAT,REWARD,XN,YN,SHOW)
// Update Energy
ANIMAT(6) =ANIMAT(6)+REWARD
if (ANIMAT(6) < 0) then printf("update: ANIMAT HAS NO MORE ENERGY!!!\n"),
elseif (REWARD <> -1) then ANIMAT(1) = XN, ANIMAT(2) = YN, ANIMAT(4) = REWARD, ANIMAT(3)=ANIMAT(3)+REWARD
else ANIMAT(4) = REWARD, ANIMAT(3)=ANIMAT(3)+REWARD
end
if (SHOW==1) then
printf("update ANIMAT: POS(y,x) = (%d,%d), REW = %d, REW-TOTAL = %d, ENERGY=%d\n\n", ANIMAT(2),ANIMAT(1), ANIMAT(4), ANIMAT(3), ANIMAT(6))
end
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
//Prepare some parameters for liveR()
function [ANIMAT,GRID]=liveR1prep(ANIMAT,YYMAX, XXMAX, S,GRID,DISTANCE,CLASSIF, ENERGY, SHOW)
//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
ANIMAT(5)=CLASSIF
ANIMAT(6) = ENERGY
endfunction
function [ANIMAT,HISTORY,GRID,FOOD]=liveR1(ANIMAT,GRID, RUNS,HISTORY,SHOW)
if (RUNS<0) then error('RUNS is not specified'),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)
// Get SENSINPUT as string: PERC
[PERC]=ainp(YO,XO,GRID,SHOW)
// Match PERC into an appropriate classifier
[INDXCL,REWARD]=match1(PERC, CLASSIF,SHOW)
//Generate new move
[ACT]=action1(CLASSIF, INDXCL)
//Generate new POSITION (YN,XN)
[YN, XN]=aout(ACT,SHOW, YO, XO)
if (SHOW==1) then
printf("NEW POSITION PROPOSED=(YN,XN)= (%d, %d)\n\n",YN,XN),
end
// Decode the content of new position
[CELLVALUE]=decode(YN,XN,GRID,SHOW)
if (SHOW==1) then,
printf("CONTENT OF NEW POSITION= %s\n\n",CELLVALUE),
end
// Update ANIMAT
[ANIMAT] = updateAnim(ANIMAT,REWARD,XN,YN,SHOW)
if (REWARD>900) then FNEW=k,FOOD(f,1)=FNEW-FOLD, FOLD=FNEW, f=f+1, end
if (SHOW==1) & (REWARD>900) 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)=evstr(CELLVALUE)
// POSITION
HISTORY(r+1,3)=XN, HISTORY(r+1,4)=YN
//REWARDTOTAL
HISTORY(r+1,5)=ANIMAT(3)
//ENERGY
HISTORY(r+1,6)=ANIMAT(6)
//Update while loop
k=k+1,
end
MEAN=mean(FOOD)
if (SHOW==1) then
printf("ENERGY = %d, REWSUM/1000 = %f\n, TIMES FOOD = %f, MEAN LENGHT = %f\n\n",ANIMAT(6), ceil((ANIMAT(3)/1000)),length(FOOD),MEAN)
end
endfunction
//***************************************************
// SIMPLE AUTOMATED TEST FRAMEWORK FOR ZCS
// WITH REPETITION
//
// ANIMAT := Structure OF ANIMAT system
// HISTORY := Protocol of movements and cumulated rewards
// RUNS := How many cycles the simulation shall run. 1 cycle means one action
// GRID := Fixed GRID from external source
// N:= Number of repetitions of an experiment with RUNS-many actions
// FOODHITS := List of food hits per repetition
// MEAN := statistical mean
// STD := standard deviation
// YS, XS := start position
// ENERGYS := start value
function [FOODHITS,MEAN, STD]=experiment1(ANIMAT,YS, XS,ENERGYS, GRID, RUNS,HISTORY,SHOW,N)
FOODHITS=[]
for i=1:N,
[ANIMAT,HISTORY,GRID,FOOD]=liveR1(ANIMAT,GRID, RUNS,HISTORY,SHOW)
[r,c]=size(FOODHITS),
//INDEX
FOODHITS(r+1,1)=length(FOOD),
ANIMAT(1) = XS, ANIMAT(2)=YS, ANIMAT(6) = ENERGYS
end //for N
MEAN=mean(FOODHITS)
STD=st_deviation(FOODHITS)
endfunction