基于基础搜索算法(BFS)和 Deep QLearning 算法的机器人

基于基础搜索算法(BFS)和 Deep QLearning 算法的机器人

文章目录

  • 基于基础搜索算法(BFS)和 Deep QLearning 算法的机器人
    • 1. 实验目的
    • 2. 需求分析
      • **2.1** **功能需求**
      • **2.2** **技术需求**
    • 3. 概要设计
      • **3.1**总体结构
      • **3.2**模块设计
        • **3.2.1** **基础搜索算法模块**
        • **3.2.2** **深度强化学习模块(Deep QLearning 算法)**
        • **3.2.3** **地图模块**
        • **3.2.4** **控制主模块**
      • **3.3**存储结构
    • 4. 详细设计
      • **4.1**基础搜索算法模块详细设计
        • **4.1.1**算法具体步骤
        • **4.1.2**模块流程图
        • **4.1.3**代码实现细节
      • **4.2**深度强化学习模块详细设计
        • **4.2.1** **算法具体步骤**
        • **4.2.2** **模块流程图**
        • **4.2.3** **代码实现细节**
      • **4.3**地图模块详细设计
        • **4.3.1** **算法具体步骤**:
        • **4.3.3** **模块流程图**
      • **4.4**控制主模块详细设计
        • **4.4.1** **算法具体步骤**
    • 5. 调试分析
      • 5.1测试数据和测试输出的结果
      • 5.2时间复杂度与空间复杂度分析
      • 5.3每个模块设计和调试时存在的问题和解决思路:
      • 5.4算法的改进设想
    • 5. 总结
      • **5.1**设计过程的收获
      • **5.2**问题与思考
      • **5.3**对人工智能课程的思考

1. 实验目的

​ 本次实验为基于基础搜索算法和Deep QLearning 算法的机器人,通过本次实验,学生应得到相应的提升,具体目的如下:

​ 掌握基础搜索算法,使用Python语言实现基础搜索算法,让机器人能够找到迷宫的出口。这个算法需要考虑迷宫的表示、状态转移和路径搜索等问题。

​ 深入理解并掌握基础搜索算法和Deep QLearning 算法,使用PyTorch等框架实现Deep QLearning算法,训练机器人在迷宫中自动寻找出口。

2. 需求分析

根据实验要求,本次实验的需求分析如下:

2.1 功能需求

(1) 可视化机器人走迷宫动态结果,红色标记表示起始位置,绿色标记表示目标位置即出口。

(2) 使用基础搜索算法完成机器人走迷宫。

(3) 使用Deep QLearning算法完成机器人走迷宫。

(4) 机器人通过训练学习可以从起点开始,通过错综复杂的迷宫,到达目标点。

(5) 任一位置可执行动作包括:向上走 ‘u’、向右走 ‘r’、向下走 ‘d’、向左走 ‘l’。

(6) 执行不同的动作后,根据不同的情况会获得不同的奖励,有以下几种情况:撞墙、走到出口、其余情况。

(7) 输出具体路径以及每一步对应的坐标。

2.2 技术需求

(1) 编程语言:需要熟练掌握Python语言,用于实现基础搜索算法和Deep QLearning算法。

(2) 数据结构和算法:需要对数据结构和算法有一定的了解,能够设计合适的数据结构和实现搜索算法、强化学习算法。

(3) 深度学习框架:需要熟悉Keras、PyTorch等深度学习框架,用于实现Q函数的神经网络结构和训练过程。

(4) 算法实现能力:需要具备独立实现算法的能力,包括理论推导和代码实现。

3. 概要设计

3.1总体结构

基于基础搜索算法和Deep QLearning 算法的机器人实验的整体结构包括基础搜索算法模块、深度强化学习模块、路径规划模块、控制主模块,其中每个模块的内容如下:

(1) 基础搜索算法模块:使用广度优先搜索算法的实现。这个模块负责在机器人对环境进行探索时使用基础搜索算法来规划路径和决策。

(2) 深度强化学习模块:包括Q-Learning学习网络、经验回放、目标网络等组件,用于实现基于深度强化学习的路径规划和决策。这个模块可以使用神经网络来学习环境的状态和动作之间的映射关系,以实现更智能的决策。

(3) 地图模块:用于存储迷宫的地图信息,包括墙壁位置、机器人当前位置、目标位置等。地图模块可以是一个数据结构,也可以是一个地图绘制和更新的模块。

(4) 控制主模块:整合基础搜索算法模块、深度强化学习模块、路径规划模块和地图模块,负责协调它们之间的工作,实现机器人在迷宫中的自主导航和行动。

这些模块可以根据具体的需求和机器人的设计进行进一步细化和扩展。整体结构设计的目标是使机器人能够结合基础搜索算法和深度强化学习算法,实现智能的路径规划和决策,以高效地在迷宫中到达目标位置。

3.2模块设计

3.2.1 基础搜索算法模块

在本次实验中使用的基础搜索算法为广度优先搜索算法,主要通过建立一颗搜索树并进行层次遍历实现。广度优先搜索也称为宽度优先搜索,简称广搜或者BFS,是遍历图存储结构的一种算法,既适用于无向图(网),也适用于有向图(网)。

广度优先搜索以队列作为核心,其搜索核心是从始结点开始,寻找一步到达的合法可行点,并加入队列,然后弹出始结点,由依次对队列中的结点执行寻找操作,直至队列为空。

在此模块中主要的设计思路为:首先定义机器人移动方向规则,其次建立迷宫路径搜索树,然后,拓展叶子节点,即为当前的叶子节点添加执行合法动作后到达的子节点,回溯并记录节点路径,最后,对迷宫进行广度优先搜索。

3.2.2 深度强化学习模块(Deep QLearning 算法)

强化学习作为机器学习算法的一种,其模式也是让智能体在“训练”中学到“经验”,以实现给定的任务。

但不同于监督学习与非监督学习,在强化学习的框架中,我们更侧重通过智能体与环境的交互来学习。

通常在监督学习和非监督学习任务中,智能体往往需要通过给定的训练集,辅之以既定的训练目标(如最小化损失函数),通过给定的学习算法来实现这一目标。Deep QLearning 算法框架图如图1所示。

在这里插入图片描述

然而在强化学习中,智能体则是通过其与环境交互得到的奖励进行学习。

这个环境可以是虚拟的(如虚拟的迷宫),也可以是真实的。

在强化学习中有五个核心组成部分,它们分别是:环境(Environment)、智能体(Agent)、状态(State)、动作(Action)和奖励(Reward)。

在本次实验中主要使用D_Q-Learning 算法,Q-Learning 是一个值迭代(Value Iteration)算法。

与策略迭代(Policy Iteration)算法不同,值迭代算法会计算每个”状态“或是”状态-动作“的值(Value)或是效用(Utility),然后在执行动作的时候,会设法最大化这个值。

因此,对每个状态值的准确估计,是值迭代算法的核心。

通常会考虑最大化动作的长期奖励,即不仅考虑当前动作带来的奖励,还会考虑动作长远的奖励。

Q-Learning算法的学习过程为:首先初始化Q table,然后智能体与环境交互,并计算新的Q值和需要更新的Q值,最后更新Q table并返回智能体与环境交互的部分重复以上步骤。

在此模块中,设计了Robot 类,QRobot 类,其中实现了 Q 表迭代和机器人动作的选择策略,

QRobot 类的核心成员方法:

  • sense_state():获取当前机器人所处位置
  • return:机器人所处的位置坐标,如: (0, 0)
  • current_state_valid_actions():获取当前机器人可以合法移动的动作
  • return:由当前合法动作组成的列表,如: [‘u’,‘r’]
  • train_update():以训练状态,根据 QLearning 算法策略执行动作
  • return:当前选择的动作,以及执行当前动作获得的回报, 如: ‘u’, -1
  • test_update():以测试状态,根据 QLearning 算法策略执行动作
  • return:当前选择的动作,以及执行当前动作获得的回报, 如:‘u’, -1
  • reset() :重置地图信息
3.2.3 地图模块

在本次实验中使用Maze类来创建迷宫,通过迷宫类 Maze 可以随机创建一个迷宫。

使用 Maze(maze_size=size) 来随机生成一个 size * size 大小的迷宫。

使用 print() 函数可以输出迷宫的 size 以及画出迷宫图

红色的圆是机器人初始位置,绿色的方块是迷宫的出口位置。

Maze 类中重要的成员方法如下:

  • sense_robot() :获取机器人在迷宫中目前的位置。
  • move_robot(direction) :根据输入方向移动默认机器人,若方向不合法则返回错误信息。
  • direction:移动方向, 如:“u”, 合法值为: [‘u’, ‘r’, ‘d’, ‘l’]
  • return:执行动作的奖励值
  • can_move_actions(position):获取当前机器人可以移动的方向
  • position:迷宫中任一处的坐标点
  • return:该点可执行的动作,如:[‘u’,‘r’,‘d’]
  • is_hit_wall(self, location, direction):判断该移动方向是否撞墙
  • location, direction:当前位置和要移动的方向,如(0,0) , “u”
  • return:True(撞墙) / False(不撞墙)
  • draw_maze():画出当前的迷宫

主要的设计思路为:首先,定义两个数组来记录每走一步的奖励值和移动方向,然后,循环随机移动机器人10次,记录下奖励,最后,输出机器人最后的位置。

3.2.4 控制主模块

整合基础搜索算法模块、深度强化学习模块、路径规划模块和地图模块,负责协调它们之间的工作,实现机器人在迷宫中的自主导航和行动。

3.3存储结构

在本实验的BFS中主要使用的存储结构为队列。队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则,即最先被插入的元素最先被移除,队列通常用于存储和管理需要按照顺序处理的数据。在Python中,可以使用列表来实现队列的功能。通过append方法在列表的末尾添加元素,通过pop(0)方法从列表的开头移除元素,就可以实现队列的基本操作。

使用队列的优势在于队列可以进行顺序处理,队列确保了元素按照插入的顺序进行处理,这对于需要按顺序处理的任务非常重要。同时队列还具有公平性,队列遵循FIFO原则,保证了先到达的任务先被处理,具有公平性。

Deep Qlearning的实现中主要使用的存储结构为张量。张量是一种多维数组的数据结构,可以在计算机内存中高效地存储和处理大规模的数据。在深度学习中,张量被广泛应用于表示神经网络的输入、输出、参数和中间数据。

使用张量的优势在于可以高效的并行计算,张量可以利用现代计算机的并行计算能力,高效地进行大规模数据的并行计算,适用于深度学习模型的训练和推理。同时张量可以灵活的表示数据,张量可以表示多维数据,适用于处理图像、视频、文本等复杂数据,具有很强的数据表示能力。张量可以利用GPU硬件加速器进行计算,提高深度学习模型的训练和推理速度。

4. 详细设计

4.1基础搜索算法模块详细设计

在下面的代码示例中,实现广度优先搜索算法;主要通过建立一颗搜索树并进行层次遍历实现。

每个节点表示为以Class SearchTree 实例化的对象,类属性有:当前节点位置、到达当前节点的动作、当前节点的父节点、当前节点的子节点;

valid_actions():用以获取机器人可以行走的位置(即不能穿墙);

expand():对于未拓展的子节点进行拓展;

backpropagation():回溯搜索路径。

4.1.1算法具体步骤
  • 首先以机器人起始位置建立根节点,并入队;接下来不断重复以下步骤直到判定条件:
  • 将队首节点的位置标记已访问;判断队首是否为目标位置(出口), 是 则终止循环并记录回溯路径。
  • 判断队首节点是否为叶子节点,是则拓展该叶子节点
  • 如果队首节点有子节点,则将每个子节点插到队尾
  • 将队首节点出队
4.1.2模块流程图

在这里插入图片描述

4.1.3代码实现细节

BFS搜索算法:

# 导入相关包
import os
import random
import time
import numpy as np
from Maze import Maze
import matplotlib.pyplot as plt

# 机器人移动方向
move_map = {
    'u': (-1, 0), # up
    'r': (0, +1), # right
    'd': (+1, 0), # down
    'l': (0, -1), # left
}

# 迷宫路径搜索树
class SearchTree(object):
    def __init__(self, loc=(), action='', parent=None):
        """
        初始化搜索树节点对象
        :param loc: 新节点的机器人所处位置
        :param action: 新节点的对应的移动方向
        :param parent: 新节点的父辈节点
        """

        self.loc = loc  # 当前节点位置
        self.to_this_action = action  # 到达当前节点的动作
        self.parent = parent  # 当前节点的父节点
        self.children = []  # 当前节点的子节点

    def add_child(self, child):
        """
        添加子节点
        :param child:待添加的子节点
        """
        self.children.append(child)

    def is_leaf(self):
        """
        判断当前节点是否是叶子节点
        """
        return len(self.children) == 0

def expand(maze, is_visit_m, node):
    """
    拓展叶子节点,即为当前的叶子节点添加执行合法动作后到达的子节点
    :param maze: 迷宫对象
    :param is_visit_m: 记录迷宫每个位置是否访问的矩阵
    :param node: 待拓展的叶子节点
    """
    can_move = maze.can_move_actions(node.loc)
    for a in can_move:
        new_loc = tuple(node.loc[i] + move_map[a][i] for i in range(2))
        if not is_visit_m[new_loc]:
            child = SearchTree(loc=new_loc, action=a, parent=node)
            node.add_child(child)

def back_propagation(node):
    """
    回溯并记录节点路径
    :param node: 待回溯节点
    :return: 回溯路径
    """
    path = []
    while node.parent is not None:
        path.insert(0, node.to_this_action)
        node = node.parent
    return path

def breadth_first_search(maze):
    """
    对迷宫进行广度优先搜索
    :param maze: 待搜索的maze对象
    """
    start = maze.sense_robot()
    root = SearchTree(loc=start)
    queue = [root]  # 节点队列,用于层次遍历
    h, w, _ = maze.maze_data.shape
    is_visit_m = np.zeros((h, w), dtype=np.int32)  # 标记迷宫的各个位置是否被访问过
    path = []  # 记录路径
    while True:
        current_node = queue[0]
        is_visit_m[current_node.loc] = 1  # 标记当前节点位置已访问

        if current_node.loc == maze.destination:  # 到达目标点
            path = back_propagation(current_node)
            break

        if current_node.is_leaf():
            expand(maze, is_visit_m, current_node)

        # 入队
        for child in current_node.children:
            queue.append(child)

        # 出队
        queue.pop(0)
        
    return path

maze = Maze(maze_size=1000)
height, width, _ = maze.maze_data.shape
start = time.time()
path_1 = breadth_first_search(maze)
print("广度优先搜索算法搜索出的路径:", path_1)
for action in path_1:
    maze.move_robot(action)

if maze.sense_robot() == maze.destination:
    print("恭喜你,到达了目标点")
end = time.time()
execution_time = end - start
print("训练所用时间时间:", execution_time, "秒")
print(maze)

4.2深度强化学习模块详细设计

4.2.1 算法具体步骤

以下是深度强化学习模块的具体实现步骤解释:

初始化迷宫和机器人:首先,创建了一个迷宫对象,并将其传递给了一个名为MinDQNRobot 的机器人对象。这个机器人使用了PyTorch 框架来实现深度Q-Learning 网络。

获取全局信息使用神经网络进行训练:通过调用 robot.memory.build_full_view(maze=maze),机器人获取了整个迷宫的全图视野作为神经网络训练所使用的数据集,这可以帮助机器人更好地学习环境。

训练机器人:首先实例化一个迷宫地图,然后实例化一个Robot类,在实例化Robot类时会对机器人进行训练,具体的训练细节为**(AI生成)**:

  • 首先,它检查存储器中的数据是否足够进行训练,如果不够就打印一条消息并返回。
  • 接着,它从存储器中随机抽样出一个批次的数据,包括状态(state)、动作索引(action_index)、奖励(reward)、下一个状态(next_state)和是否终止(is_terminal)。
  • 然后,它将这些数据转换成张量(tensor)类型,并将它们发送到指定的设备(比如 GPU)上。
  • 接下来,它将评估模型(eval_model)设置为训练模式,将目标模型(target_model)设置为评估模式。
  • 然后,它从目标模型中获取下一个状态的最大预测 Q 值,并计算当前状态的 Q 值目标。
  • 接着,它将优化器的梯度归零,计算当前状态的预期 Q 值,并计算损失(使用均方误差损失函数)。
  • 然后,它打印出损失值,并根据损失值来更新模型的权重。
  • 最后,它将评估模型的权重复制到目标模型中,并返回损失值。

测试机器人:在训练结束后,机器人被进行了测试。在测试中,机器人被重置,并进行了10次动作选择和奖励获取的循环。如果机器人获得了目标的奖励,就会输出 “success”。

4.2.2 模块流程图

在这里插入图片描述

4.2.3 代码实现细节
    def _learn(self, batch: int = 16):
        if len(self.memory) < batch:
            print("the memory data is not enough")
            return
        state, action_index, reward, next_state, is_terminal = self.memory.random_sample(batch)

        """ convert the data to tensor type"""
        state = torch.from_numpy(state).float().to(self.device)
        action_index = torch.from_numpy(action_index).long().to(self.device)
        reward = torch.from_numpy(reward).float().to(self.device)
        next_state = torch.from_numpy(next_state).float().to(self.device)
        is_terminal = torch.from_numpy(is_terminal).int().to(self.device)

        self.eval_model.train()
        self.target_model.eval()

        """Get max predicted Q values (for next states) from target model"""
        Q_targets_next = self.target_model(next_state).detach().min(1)[0].unsqueeze(1)

        """Compute Q targets for current states"""
        Q_targets = reward + self.gamma * Q_targets_next * (torch.ones_like(is_terminal) - is_terminal)

        """Get expected Q values from local model"""
        self.optimizer.zero_grad()
        Q_expected = self.eval_model(state).gather(dim=1, index=action_index)

        """Compute loss"""
        loss = F.mse_loss(Q_expected, Q_targets)
        loss_item = loss.item()
        print(loss_item)

        """ Minimize the loss"""
        loss.backward()
        self.optimizer.step()

        """copy the weights of eval_model to the target_model"""
        self.target_replace_op()
        return loss_item

4.3地图模块详细设计

4.3.1 算法具体步骤:
  • 初始化列表:首先,代码创建了两个空列表rewards和actions,用来分别记录每一步的奖励值和移动方向。
  • 循环随机移动:代码使用了一个for循环,循环了10次,每次在迷宫中随机选择一个可行的移动方向,并记录下移动的奖励值和移动方向。这里使用了 maze.can_move_actions(maze.sense_robot()) 来获取当前可行的移动方向,然后用random.choice(valid_actions) 随机选择一个方向进行移动,并记录下移动后的奖励值和移动方向。
  • 输出奖励和移动方向:代码输出了记录下的奖励值和移动方向,分别打印了rewards 和 actions 列表。
  • 输出机器人最后的位置:代码使用maze.sense_robot() 获取了机器人最后的位置,并进行了输出。
  • 输出迷宫状态:最后,代码输出了迷宫的状态,可以看到机器人的位置和迷宫的布局情况。

下图为Q-Network网络结构图

在这里插入图片描述

4.3.2 迷宫全局视野具体步骤

迷宫全局视野方法 build_full_view,它用于生成一个迷宫全图视野的数据集。下面是对代码的分析**(AI生成)**:

  • 方法接受一个名为 maze 的迷宫对象作为参数,该迷宫对象是由 Maze 类实例化的。

  • 使用 copy.deepcopy 创建了迷宫对象的副本 maze_copy,以避免对原始迷宫对象进行修改。

  • 通过 maze_copy 的 maze_size 属性获取迷宫的大小。

  • 定义了一个包含四个方向的动作列表 actions,分别表示上、右、下、左。

    使用嵌套的循环遍历迷宫的每一个位置。外层循环遍历行,内层循环遍历列。

    在每个位置上,创建一个状态 state,表示当前位置的坐标。

  • 如果当前位置是目标位置 maze_copy.destination,则跳过当前位置,不进行后续操作。

  • 对于每个位置和动作的组合,执行以下操作:

    设置迷宫机器人的位置为当前状态 maze_copy.robot[“loc”] = state。

    执行 maze_copy.move_robot(action) 方法,将机器人移动到下一个状态,并获取奖励 reward。

    使用 maze_copy.sense_robot() 方法获取机器人移动后的下一个状态 next_state。

    判断下一个状态是否为终止状态,如果是,将 is_terminal 设置为 1,否则设置为0。

    调用 self.add() 方法,将状态、动作、奖励、下一个状态和终止状态添加到经验集合中。

  • 将经验集合的值转换为列表,并将其赋值给 self.full_dataset。

该方法通过遍历迷宫的每个位置和动作的组合,生成一个包含状态、动作、奖励、下一个状态和终止状态的数据集。这个数据集可以用于训练机器学习模型或进行其他分析。

具体代码实现如下所示。

    def build_full_view(self, maze: Maze):
        """
            获取迷宫全图视野的数据集
            :param maze: 由Maze类实例化的对象
        """
        maze_copy = copy.deepcopy(maze)
        maze_size = maze_copy.maze_size
        actions = ["u", "r", "d", "l"]
        for i in range(maze_size):
            for j in range(maze_size):
                state = (i, j)
                if state == maze_copy.destination:
                    continue
                for action_index, action in enumerate(actions):
                    maze_copy.robot["loc"] = state
                    reward = maze_copy.move_robot(action)
                    next_state = maze_copy.sense_robot()
                    is_terminal = 1 if next_state == maze_copy.destination or next_state == state else 0
                    self.add(state, action_index, reward, next_state, is_terminal)
        self.full_dataset = list(self.Experience.values())
4.3.3 模块流程图

在这里插入图片描述

4.4控制主模块详细设计

4.4.1 算法具体步骤

首先初始化迷宫地图和机器人位置、路径规划模块;使用起点和终点位置进行路径规划初始化。然后根据选择的路径规划算法,计算起点到终点的最短路径。

初始化深度强化学习模块:创建深度强化学习模型、设置模型的输入状态和输出动作空间、初始化模型的参数和优化器。接下来进入主循环,检查当前机器人位置和迷宫状态,如果当前位置是终点,导航结束;否则,执行以下步骤:

  1. 使用路径规划模块获取下一步的最优行动(移动方向)。
  2. 根据当前状态和模型选择的行动,使用模型预测当前最优行动;
  3. 执行预测行动,将机器人移动到新位置。
  4. 根据机器人的行动结果计算奖励,将当前状态、行动、奖励、新状态等信息存储到经验回放缓冲区中。从经验回放缓冲区中随机采样一批数据进行训练。
  5. 更新深度强化学习模型的参数。重复以上步骤直到到达终点或满足停止条件。

5. 调试分析

基于基础搜索算法(BFS、DFS、A*)和深度强化学习(Deep Q-Learning)算法的机器人调试分析是一个复杂而有挑战性的任务。在这个过程中,我们需要考虑测试数据和测试输出的结果、时间复杂度分析、每个模块设计和调试时存在的问题的思考,以及算法的改进设想。

5.1测试数据和测试输出的结果

对于基础搜索算法,测试数据包括不同大小的迷宫,不同起点和终点的位置,测试输出的结果应包括机器人找到的路径,路径的长度,搜索过程中的状态转移情况。对于基础搜索算法,本文做了大量的对比试验,包括使用DFS、A※以及对于BFS算法使用路径剪枝进行搜索,以下为实验结果。

算法名称 迷宫大小 起点坐标 运行时间 路径长度
BFS 10*10 (0,0) 0.02sec 20
BFS 100*100 (0,0) 0.145sec 218
BFS 1000*1000 (0,0) 17.538sec 2136
BFS 1000*1000 (10,10) 16.872sec 2152
BFS_pruning 100*100 (0,0) 0.146sec 216
DFS 100*100 (0,0) 0.07sec 206
A* 100*100 (0,0) 0.066sec 218
A* 1000*1000 (0,0) 1.740sec 2198

对于深度强化学习算法,测试数据可以包括迷宫的状态空间和动作空间的定义,奖励函数的设计,以及训练和测试阶段的环境设置。测试输出的结果可以包括机器人在训练和测试阶段的奖励累积值、策略改进情况、训练Loss曲线。对于深度强化学习,本文也做了相应的对比试验,分别设计了包含三层感知机以及四层感知机的网络模型进行训练,以下为训练结果。

网络结构 迷宫大小 训练时间
五层感知机 10*10 120.38s
三层感知机 10*10 499.24s
五层感知机 100*100 48h+
三层感知机 100*100 48h+

不同参数的网络模型与不同规格的迷宫训练时的Loss如下图所示:

|在这里插入图片描述

| | | 在这里插入图片描述

|

| ———————————————————— | ———————————————————— | —- | —- |

5.2时间复杂度与空间复杂度分析

  1. 对于基础搜索算法,可以分析不同大小迷宫的搜索时间,以及搜索路径的复杂度。可以通过理论分析和实验结果来评估算法的时间复杂度。

BFS算法时间复杂度分析:

  • 在最坏情况下,广度优先搜索算法需要遍历整个迷宫,因此时间复杂度为 O(V + E),其中 V 是顶点数,E 是边数。在这里,V 是迷宫的格子数,E 是格子之间的相邻关系,通常情况下可以认为是 O(V)。
  • 在每个节点的拓展过程中,需要检查每个方向上是否可以移动,这个过程的时间复杂度也是 O(1)。
  • 因此,广度优先搜索算法的时间复杂度可以认为是 O(V)。

BFS算法空间复杂度分析:

  • 在广度优先搜索算法中,需要使用队列来存储待访问的节点,队列的长度最大可以达到迷宫的格子数,因此空间复杂度为 O(V)。
  • 此外,还需要使用一个二维数组来记录迷宫中每个位置是否被访问过,因此空间复杂度也是 O(V)。

2.对于深度强化学习算法,可以分析训练过程中神经网络的收敛速度、训练时间和迭代次数,以及环境模拟的复杂度。可以通过实验结果来评估算法的时间复杂度。

5.3每个模块设计和调试时存在的问题和解决思路:

1.在基础搜索算法中,在迷宫大小足够大时,遇到路径搜索不完整、性能不佳的问题。可以通过调整改进启发式函数的方式来解决。例如,对A*算法可以尝试不同的启发式函数来改进搜索性能。具体的代码实现如下。

def euclidean_heuristic_cost_estimate(loc, destination):
    """
    使用欧几里得距离作为启发式函数,估计从当前位置到目标位置的代价
    """
    return math.sqrt((loc[0] - destination[0])**2 + (loc[1] - destination[1])**2)

2.在深度强化学习算法中,遇到训练不稳定、收敛速度慢的问题。通过调整神经网络结构的方式来解决如采用多层感知机的网络结构,修改每一层的具体参数进行训练。

5.4算法的改进设想

1.对于基础搜索算法,使用了路径剪枝的方式来改进算法的性能。路径剪枝是一种优化技术,通常应用于搜索算法中,旨在减少搜索空间并提高搜索效率。在路径剪枝中,我们会在搜索过程中剪掉一些不必要的路径,从而避免重复访问已经访问过的节点或者剪掉明显不符合要求的路径,以加速搜索过程。

2.对于深度强化学习算法,改变了深度学习模型的方式来改进算法的稳定性和收敛速度。

5. 总结

5.1设计过程的收获

在设计机器人走迷宫的过程中,学习和理解了不同的路径规划算法,例如深度优先搜索、广度优先搜索、A算法、Deep QLearning等。帮助我们更好地理解和应用这些算法来解决实际问题。在本次实验中我们实现了基础搜索算法(BFS、DFS、A)和深度强化学习(Deep Q-Learning)算法使机器人成功的走出迷宫,深入理解了算法的原理和实现方式。回顾了如何使用栈、队列等数据结构来实现搜索算法,以及如何利用神经网络和深度学习框架来构建和训练Q值函数。在设计机器人走迷宫的过程中会面临各种问题和挑战,例如如何表示迷宫、如何选择合适的路径规划算法等;在这个过程中需要思考如何表示迷宫的数据结构、如何选择合适的搜索算法、如何定义奖励函数等,以达到机器人自动走到出口的目标。通过思考和解决这些问题,我们能够锻炼自己的问题解决能力和创造力。实践编程技能的提升,在编写代码来表示迷宫、实现路径规划算法的过程中提升了我们的编程能力和算法实现能力。能够将所学的人工智能模型与算法课程应用于实际问题中,这种实践性的学习能够更好地让我们理解和应用所学的知识,同时也提高了解决实际问题的能力。除此之外,也认识到人工智能这门课程的重要性,它为我提供了学习和应用人工智能的核心知识和技能,并且需要通过实践来深化理解和提升能力。通过此次实践,我们还能够发现人工智能模型和算法在实际问题中的局限性和改进空间,进一步提高我们的学习和研究能力。

5.2问题与思考

在设计机器人走迷宫的过程中,可能会遇到各种问题。解决这些问题需要我们思考问题的本质、分析可能的原因,并采取适当的解决方法。

如何将迷宫表示为计算机可以理解的数据结构是一个关键问题。可以使用数组等数据结构来表示迷宫,并根据迷宫的特点选择合适的数据结构。选择合适的路径规划算法是解决迷宫问题的核心。可以根据迷宫的特点和要求选择不同的算法。广度优先搜索可以找到最短路径,但在处理较大迷宫时可能造成较高的内存消耗。Deep Q-Learning算法通过学习和训练,能够逐步改进路径规划策略。它可以通过与环境的交互,通过试错和反馈机制来学习最优的路径选择策略。在迷宫中可能存在死路,即无法到达目标点的路径。为了避免陷入死路,可以在路径规划算法中引入回溯机制。当机器人走到死路时,回溯到上一个节点,并尝试其他路径。

在设计机器人走迷宫的过程中,需要具备调试程序的能力,通过观察程序运行的中间结果、输出信息和日志信息等,来定位问题的出现位置和原因。当程序出现问题时,首先需要仔细观察和分析问题的表现形式、出现的条件和可能的原因。使用断点设置、变量监视、堆栈跟踪等调试工具。通过使用这些工具可以帮助定位问题和跟踪程序执行的流程。通过注释代码块、逐行调试或二分法排除法,可以逐步缩小问题所在的代码段,从而更有效地定位问题。在问题解决后,反思调试过程中的经验和教训。记录下问题的根本原因、解决方法和调试技巧,以便在未来遇到类似问题时能够更快速、更有效地解决。

5.3对人工智能课程的思考

人工智能是一门非常有前景和挑战性的学科。通过学习人工智能课程,我们能够了解和掌握人工智能的基本原理、常见算法和应用场景。这门课程不仅能培养我们的算法思维和编程能力,还能拓宽我们的知识视野,提高我们解决实际问题的能力。人工智能在各个领域都有广泛的应用,掌握人工智能的知识和技能将为我们未来的发展提供更多机会和可能性。人工智能是一门涵盖广泛领域的学科,它涉及机器学习、自然语言处理、计算机视觉等众多领域。

人工智能的发展对社会和经济具有重要影响。它已经在许多领域取得了显著的成就,如智能助手、自动驾驶、医疗诊断等。在设计过程中对《人工智能模型与算法》课程的认识逐渐深化。意识到这门课程涵盖了人工智能领域的核心内容,包括机器学习、深度学习、数据挖掘等关键技术和算法。这些技术和算法是实现人工智能应用的基础,掌握它们对于理解和应用人工智能具有重要意义。此外,《人工智能模型与算法》课程的学习需要不断地进行实践和探索。仅仅学习理论知识是不够的,需要通过实际的项目和案例来加深理解和提升能力。设计机器人走迷宫的过程正是一个很好的实践项目,它将所学的知识与实际问题相结合,培养了在人工智能领域的应用能力。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/bc84861357.html