#!/usr/local/bin/XGraph
*TITLE*Ant Searching according to Muller,M & Wehner,R 1994

# *ARGUMENTS* -detach -noerr -fn0 -progress -stats -bb -tk -PrintInfo -x_ul 179.807,-83.8645 -y_ul -93.687,370.97 -legend_ul -93.687,267.201
*ARGUMENTS* -detach -stats -progress -PrintInfo -bb -tk -x_ul 184,-180 -y_ul -184,235 -legend_ul -195,-80 -noerr -fn0 -raw_display -overwrite_legend -lx -200,200
*ARGUMENTS* -plot_only_set 0,1,2,3

*EXTRATEXT*
Explanation of variables:
     MEM[1]: \d\_r: deviation (degrees) of current heading from current\n
	     (i.e. previous value of) home vector
	MEM[111]: idem, in [0,360]
     MEM[2]: world direction of walking (radians)
     MEM[20],MEM[22]:  idem, at start of search (direction resulting from homing) (radians)
	MEM[100],MXY[3,t]: direction of home vector \j\_r (ant-relative) (degrees)
	MXY[4,t]: idem, in world-angles (earthbound ref).
     MEM[3],MEM[4]: coordinates x,y of ant
     MEM[33],MEM[44]: coordinates X,Y of nest
     MEM[5]: value of search angle \d\ (mean of \d\_r)
     MEM[55],MXY[0,t]: \S(d\_r)(t)
     MEM[6],MXY[2,t]: walked distance (l)
     (MEM[7]: value of l when reset occurs)
     MEM[8],MXY[1,t]: (homing) distance from nest (d)
     MEM[9]: maximum homing distance
     MEM[10]: number of steps
     MEM[11]: time between last change of sign of \d\ \n\n
	progn functions can be replaced by Eprint for output

*BUFLEN*1526

*AUTOSCRIPT* 1 0 2 0
*PARAM_RANGE* 0,MEM[10,5000]

*PARAM_NOW* MEM[20,0],MEM[22,0],Eprint[SETMXY[5,add[1,MEM[10]]]],time[0]

*PARAM_NOW*#x0a MEM[5,100],MEM[6,0],MEM[7,300],MEM[3,0],MEM[33,000],MEM[4,0],MEM[44,000],MEM[2,0],MEM[8,0],MEM[55,0],MEM[9,0],MEM[11,0],MEM[100,0]

*PARAM_BEFORE* MEM[0,ran[-0.5,0.5]], MEM[1,\n
 add[mul[\n
          ifelse[>=[MEM[0],0],17.87,-17.87], 45, sub[ exp[mul[0.5,pow[MEM[0],2]]],1]\n
        ], MEM[5]\n
    ]\n
 ],ifelse[<[MEM[1],0],MEM[111,add[360,MEM[1]]],MEM[1]]

# *PARAM_AFTER* ifelse[ >[MEM[8],MEM[7]],\n
*PARAM_AFTER* ifelse[ >[MEM[8],mul[17.5,log[add[1,mul[0.02,MEM[6]]]]]],\n
   progn[progn[\n
            degrees[MEM[20,arg[MEM[3],MEM[4]]]],\n
            MEM[6,add[MEM[6],floor[MEM[8]]]],\n
            return[MEM[5,add[9,mul[abs[MEM[5]],0.95]]]]\n
        ],\n
# reset the ant to a position within a radius of 1 from the origin (nest)\n
#         progn[MEM[8,sub[MEM[8],floor[MEM[8]]]],MEM[3,mul[MEM[8],cos[MEM[20]]]],MEM[4,mul[MEM[8],sin[MEM[20]]]]],\n
# ant walks back according to home vector in one timestep:\n
        progn[MEM[100,add[MEM[2],radians[MEM[100]]]],\n
	         MEM[3,sub[MEM[3],mul[MEM[8],cos[MEM[100]]]]],\n
	         MEM[4,sub[MEM[4],mul[MEM[8],sin[MEM[100]]]]],\n
		    MEM[20,MEM[100]]\n
        ],\n
	   MEM[8,0],MEM[100,0]\n
   ],\n
#else:\n
   progn[MEM[6,add[MEM[6],1]], MEM[3, add[ MEM[3], cos[MEM[2]]]], MEM[4, add[ MEM[4], sin[MEM[2]]]],\n
     return[MEM[8,add[0,len[MEM[3],MEM[4]]]]],MEM[22,MEM[20]],MEM[20,0]\n
   ]\n
 ],\n
 MEM[2,add[MEM[20],radians[sub[180,MEM[1]]],arg[MEM[3],MEM[4]]]],\n
 MEM[22,0],MEM[55,add[MEM[55],MEM[1]]],\n
 MEM[100,add[MEM[100],div[mul[4.009e-5,MEM[111],sub[360,MEM[111]],sub[180,MEM[111]]],MEM[5]]]],\n
 progn[self,MXY[2,self,MEM[6]],MXY[1,self,MEM[8]],MXY[0,self,MEM[55]],MEM[9,MAX[MEM[9],MEM[8]]],\n
       MXY[3,self,MEM[100]],MXY[4,self,degrees[add[MEM[2],radians[MEM[100]]]]]\n
 ],\n
 ifelse[ >[MEM[11],ran[100,200]],\n
		progn[progn[self,return[MEM[5,mul[ifelse[>=[ran,0.5],1,-1],MEM[5]]]]],MEM[11,0]],\n
         MEM[11,add[MEM[11],1]]\n
 ]

*PARAM_NOW*#x0a MEM[5,100],MEM[6,0],MEM[7,100],MEM[3,0],MEM[33, 0],MEM[4,0],MEM[44, 0],MEM[2,0],MEM[8,0],MEM[55,0],MEM[9,0],MEM[11,0]
*LEGEND*Example, resetting when d>17.5*log(0.02l+1)
*PARAM_NOW* elapsed[1]
*PARAM_FUNCTIONS* add[MEM[33],MEM[3]],add[MEM[44],MEM[4]],elapsed[1]

# now show the calculated homing distance, and the cumulative search angle \d\
*PARAM_NOW*#x0a MEM[5,100],MEM[6,0],MEM[7,100],MEM[3,0],MEM[33,30],MEM[4,0],MEM[44,30],MEM[2,0],MEM[8,0],MEM[55,0]
*PARAM_BEFORE* elapsed[1]
*PARAM_AFTER*
*LEGEND*d against l/(0.5*MAX(d))
*PARAM_FUNCTIONS* div[MXY[2,self],div[MEM[9],2]],MXY[1,self],elapsed[1]

*PARAM_NOW*#x0a MEM[5,100],MEM[6,0],MEM[7,100],MEM[3,0],MEM[33,30],MEM[4,0],MEM[44,30],MEM[2,0],MEM[8,0],MEM[55,0]
*LEGEND*\S(d\_r)/3600 (deg) against l/(0.5*MAX(d))
*PARAM_FUNCTIONS* div[MXY[2,self],div[MEM[9],2]],fmod[div[MXY[0,self],3600],360],elapsed[1]

*PARAM_NOW*#x0a MEM[5,100],MEM[6,0],MEM[7,100],MEM[3,0],MEM[33,30],MEM[4,0],MEM[44,30],MEM[2,0],MEM[8,0],MEM[55,0]
*LEGEND*\j\_r (ant-rel) against l/(0.5*MAX(d))
*PARAM_FUNCTIONS* div[MXY[2,self],div[MEM[9],2]],MXY[3,self],elapsed[1]

*LEGEND* d against \j\_r (world-angles)
*PARAM_FUNCTIONS* MXY[4,self],MXY[1,self],0

*PARAM_NOW* SETMXY[0,0]

*ULABEL* 109 150 -68.8406 200 2
total angle turned


*ULABEL* 86.2319 56.9909 105.797 200 1
distance from nest


*ULABEL* -20.2899 -32.5075 -139.13 184.526 0
actual trace


*ULABEL* 94.9275 -45.9323 82.6087 -139.906 3
ant's home vector


