У нас есть групповой проект, и я думаю, что проект, который мы предложили, был немного выше нашей зарплаты.Он требовал изменить алгоритм поиска в глубину в OpenNero Maze в интерактивную DFS.Мы думали, что это будет просто добавление нескольких строк, но, как 3 новичка на Python, мы не могли даже пройти через DFS намного реже, изменив его, чтобы сделать только 1 уровень в = a = время.Буду признателен за любые идеи.В качестве примера, код ниже показывает def act. Я понятия не имею, как это вызывается.Мне удалось добавить две метрики в инструкции prit в методах начала и конца, НО между этими двумя я потерян.Как бы я мог сказать, искать только итеративно и вернуться вверх, а не погружаться вниз через все узлы 1 ветви?
class DFSSearchAgent(SearchAgent):
"""
Depth first search implementation
"""
def __init__(self):
"""
A new Agent
"""
# this line is crucial, otherwise the class is not recognized as anAgentBrainPtr by C++
SearchAgent.__init__(self)
self.visited = set([])
self.adjlist = {}
self.parents = {}
def dfs_action(self, observations):
r = observations[0]
c = observations[1]
current_cell = (r, c)
# if we have not been here before, build a list of other places we can go
if current_cell not in self.visited:
tovisit = []
for m, (dr, dc) in enumerate(MAZE_MOVES):
r2, c2 = r + dr, c + dc
if not observations[2 + m]: # can we go that way?
if (r2, c2) not in self.visited:
tovisit.append((r2, c2))
self.parents[(r2, c2)] = current_cell
# remember the cells that are adjacent to this one
self.adjlist[current_cell] = tovisit
# if we have been here before, check if we have other places to visit
adjlist = self.adjlist[current_cell]
k = 0
while k < len(adjlist) and adjlist[k] in self.visited:
k += 1
# if we don't have other neighbors to visit, back up
if k == len(adjlist):
next_cell = self.parents[current_cell]
else: # otherwise visit the next place
next_cell = adjlist[k]
self.visited.add(current_cell) # add this location to visited list
if current_cell != self.starting_pos:
get_environment().mark_maze_blue(r, c) # mark it as blue on the maze
v = self.constraints.get_instance() # make the action vector to return
dr, dc = next_cell[0] - r, next_cell[1] - c # the move we want to make
v[0] = get_action_index((dr, dc))
# remember how to get back
if next_cell not in self.backpointers:
self.backpointers[next_cell] = current_cell
return v
def initialize(self, init_info):
self.constraints = init_info.actions
return True
def start(self, time, observations):
# return action
print '####### start of DFS located in class DFS Search ####'
self.startT = timeit.default_timer()
print self.startT
################################# TEST FOR RESOURCE #############################################
process=psutil.Process(os.getpid())
r = observations[0]
c = observations[1]
self.starting_pos = (r, c)
get_environment().mark_maze_white(r, c)
return self.dfs_action(observations)
def reset(self):
self.visited = set([])
self.parents = {}
self.backpointers = {}
self.starting_pos = None
def act(self, time, observations, reward):
# return action
return self.dfs_action(observations)
def end(self, time, reward):
print "Final reward @@@@ : %f, cumulative: %f" % (reward[0], self.fitness[0])
elapsedT = timeit.default_timer() - self.startT
print self.startT
print'\nElapsed time below expressed in seconds'
print elapsedT
print 'Printing process ID stats '
#print (process.memory_info()[0])
print 'Resource tracker '
print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
self.reset()
return True
def mark_path(self, r, c):
get_environment().mark_maze_white(r,c)