forked from rlucas92/AnimatSimulation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
World.py
137 lines (104 loc) · 3.74 KB
/
World.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# -*- coding: utf-8 -*-
# Author - RJ
"""
Created on Sun Feb 16 21:33:58 2014
Main Simulation Driver File
Doubles as simulation driver and simulated "World"
contains all objects in simulated world
as well as controls flow of operations of simulation
"""
import numpy as np
import AnimatShell
import Stimuli
import random
import SimParam
class World:
def __init__(self,simParam):
self.sP = simParam
self.arenaSize = (self.sP.getWorldSize(1),self.sP.getWorldSize(1)) #square arena
self.numBounds = [0 - self.arenaSize[0]/2., 0 + self.arenaSize[0]/2.,0 - self.arenaSize[1]/2., 0 + self.arenaSize[1]/2.]
self.animats = []
for x in range(1,self.sP.getAnimNum(1)+1):
id = "Animat " + str(x)
self.animats.append(AnimatShell.WheelAnimat(self.sP.getAnimParams(x)))
self.smells = []
self.foods = []
foodArray = self.setup_food()
self.smells.append(["Type 1", foodArray])
def setup_food(self):
food_loc = self.sP.getFoodLocs(self.sP.worldToRun)
food_str = []
for loc in food_loc:
food = Stimuli.Food(loc = loc)
self.foods.append(food)
food_str.append(food.amt)
food_loc = np.vstack(food_loc)
food_str = np.hstack(food_str)
return [food_loc, food_str]
def determineTraction(self,pos):
pass
def copyDynamicState(self):
state = []
foodState = []
for food in self.foods:
foodState.append(food.getAmount())
state.append(foodState)
animat_state = []
for animat in self.animats:
animat_state.append(animat.copyDynamicState())
state.append(animat_state)
return DynamicWorldState(state)
def loadDynamicState(self, state):
state = state.state
foodState = state[0]
animat_state = state[1]
for i in range(0, len(foodState)):
self.foods[i].amt = foodState[i]
for i in range(0, len(animat_state)):
self.animats[i].loadDynamicState(animat_state[i])
def update(self, t, dt):
for foodArray in self.smells:
for animat in self.animats:
animat.smell(foodArray)
animat.runNetwork(t, dt)
traction = self.determineTraction(animat.pos)
animat.move(traction, t)
foodArray[1][1] = animat.eat(foodArray) #returns array with updated food amounts
self.updateFood(foodArray[1][1]) #updates food objects
#get rid of foods that are eaten
def updateFood(self,amts):
for amt,food in zip(amts,self.foods):
food.amt = amt
def getFoodLocs(self):
return [food.getPos() for food in self.foods]
class DynamicWorldState:
def __init__(self, state):
self.state = state
def getFood(self):
return self.state[0]
def getAnimatState(self):
return self.state[1][0] #hardcoded for only one animat in simulation
def getEnergy(self):
#depending on state, may be stored as integer or an array object
try:
return self.getAnimatState()[2][0]
except:
return self.getAnimatState()[2]
def getPos(self):
return self.getAnimatState()[4]
def getA(self):
return self.getAnimatState()[7][0]
def getB(self):
return self.getAnimatState()[7][1]
def getC(self):
return self.getAnimatState()[7][2]
def getD(self):
return self.getAnimatState()[7][3]
def getU(self):
return self.getAnimatState()[7][4]
def getV(self):
return self.getAnimatState()[7][5]
def getS(self):
return self.getAnimatState()[7][6]
def getI(self):
return self.getAnimatState()[7][7]