1import numpy as np
2import matplotlib.pyplot as plt
3import random
45n =4678stage = np.zeros((n,n),dtype=np.float64)910defS(n):#Stage(2次元平面上に濃度を撒く関数)11for x inrange(0,n):12for y inrange(0,n):13if x == food_position_x and y == food_position_y:14 stage[x,y]=1.015else:16 stage[x,y]=0.5**(np.abs(x-food_position_x)+ np.abs(y-food_position_y))17return stage
181920defmain(n, step):21 count =022for i inrange(0,step):23if i ==0:24 x =0; y =025else:26 d = random.randint(1,4)#direction, 1:右 2:上 3:左 4:下27#周期境界条件28 mx =(x-1+ n)% n ; px =(x+1)% n
29 my =(y-1+ n)% n ; py =(y+1)% n
30if d ==1:31if S(n)[int(px),y]>=S(n)[int(mx),y]and S(n)[int(px),y]>=S(n)[x,int(my)]and S(n)[int(px),y]>=S(n)[x,int(py)]:#濃度最大値の確認32 x =int(px)33else:#もし違うなら、1:右以外の方向にランダムで進ませる34 e = random.choice([2,3,4])35if e ==2:36 x =int(py)37elif e==3:38 x =int(mx)39elif e ==4:40 y =int(my)41elif d ==2:#以下同上42if S(n)[x,int(py)]>=S(n)[int(px),y]and S(n)[x,int(py)]>=S(n)[x,int(my)]and S(n)[x,int(py)]>=S(n)[int(mx),y]:43 y =int(py)44else:45 e = random.choice([1,3,4])46if e ==1:47 x =int(px)48elif e ==3:49 x =int(mx)50elif e ==4:51 y =int(my)5253elif d ==3:54if S(n)[int(mx),y]>=S(n)[int(px),y]and S(n)[int(mx),y]>=S(n)[x,int(my)]and S(n)[int(mx),y]>=S(n)[x,int(py)]:55 x =int(mx)56else:57 e = random.choice([1,2,4])58if e ==1:59 x =int(px)60elif e ==2:61 x =int(py)62elif e ==4:63 y =int(my)6465elif d ==4:66if S(n)[x,int(my)]>=S(n)[int(mx),y]and S(n)[x,int(my)]>=S(n)[int(px),y]and S(n)[x,int(my)]>=S(n)[x,int(py)]:67 y =int(my)68else:69 e = random.choice([1,2,3])70if e ==1:71 x =int(px)72elif e ==2:73 x =int(py)74elif e ==3:75 y =int(mx)76if x == food_position_x and y == food_position_y:#フードのポジションにたどり着いたらカウントする77 count +=178return count