基于Python实现机器人自动走迷宫【100011016】( 三 )


图4 基础搜索地图()
搜索出的路径: ['d', 'r', 'u', 'r', 'r', 'r', 'r', 'd', 'r', 'd', 'r', 'r', 'r', 'r', 'd', 'd', 'r', 'd', 'd', 'd', 'd', 'r', 'r', 'r', 'r', 'r', 'd', 'r', 'r', 'd', 'r', 'd', 'd', 'l', 'l', 'd', 'd', 'd', 'd', 'd', 'r', 'd', 'd', 'r']恭喜你,到达了目标点Maze of size (20, 20)
图5 基础搜索地图()
部分代码如下:
def myDFS(maze):"""对迷宫进行深度优先搜索:param maze: 待搜索的maze对象"""start = maze.sense_robot()root = SearchTree(loc=start)queue = [root]# 节点堆栈,用于层次遍历h, w, _ = maze.maze_data.shapeis_visit_m = np.zeros((h, w), dtype=np.int)# 标记迷宫的各个位置是否被访问过path = []# 记录路径peek = 0while True:current_node = queue[peek]# 栈顶元素作为当前节点#is_visit_m[current_node.loc] = 1# 标记当前节点位置已访问if current_node.loc == maze.destination:# 到达目标点path = back_propagation(current_node)breakif current_node.is_leaf() and is_visit_m[current_node.loc] == 0:# 如果该点存在叶子节点且未拓展is_visit_m[current_node.loc] = 1# 标记该点已拓展child_number = expand(maze, is_visit_m, current_node)peek+=child_number# 开展一些列入栈操作for child in current_node.children:queue.append(child)# 叶子节点入栈else:queue.pop(peek)# 如果无路可走则出栈peek-=1return path
4.2
在算法训练过程中,首先读取机器人当前位置,之后将当前状态加入Q值表中,如果表中已经存在当前状态则不需重复添加 。之后,生成机器人的需要执行动作,并返回地图奖励值、查找机器人现阶段位置 。接着再次检查并更新Q值表,衰减随机选取动作的可能性 。
算法实现过程中,主要是对Q值表的计算更新进行了修改和调整,调整后的Q值表在运行时性能优秀,计算速度快且准确性、稳定性高 。之后调节了随机选择动作可能性的衰减率 。因为在测试过程中发现,如果衰减太慢的话会导致随机性太强,间接的减弱了奖励的作用,故最终通过调整,发现衰减率取0.5是一个较为优秀的且稳定的值 。
部分代码如下:
def train_update(self):"""以训练状态选择动作,并更新相关参数:return :action, reward 如:"u", -1"""self.state = self.maze.sense_robot()# 获取机器人当初所处迷宫位置# 检索Q表,如果当前状态不存在则添加进入Q表if self.state not in self.q_table:self.q_table[self.state] = {a: 0.0 for a in self.valid_action}action = random.choice(self.valid_action) if random.random() < self.epsilon else max(self.q_table[self.state], key=self.q_table[self.state].get)# action为机器人选择的动作reward = self.maze.move_robot(action)# 以给定的方向移动机器人,reward为迷宫返回的奖励值next_state = self.maze.sense_robot()# 获取机器人执行指令后所处的位置# 检索Q表,如果当前的next_state不存在则添加进入Q表if next_state not in self.q_table:self.q_table[next_state] = {a: 0.0 for a in self.valid_action}# 更新 Q 值表current_r = self.q_table[self.state][action]update_r = reward + self.gamma * float(max(self.q_table[next_state].values()))self.q_table[self.state][action] = self.alpha * self.q_table[self.state][action] +(1 - self.alpha) * (update_r - current_r)self.epsilon *= 0.5# 衰减随机选择动作的可能性return action, reward
测试结果如下:
图6 强化学习搜索gif地图(size3)