Python 动态规划 实现机器人躲避障碍物获取最短路径

Python 动态规划 实现力扣问题:实现机器人躲避障碍物获取最短路径。

要设计一种算法来寻找机器人从左上角移动到右下角的路径,可以使用动态规划来解决这个问题。下面是一种可能的算法:

  • 创建一个处理机器人运动的函数find_path,函数接受一个矩阵grid 作为参数,用于表示机器人移动的网格环境,该矩阵一个由 0 和 1 组成的二位列表,其中 0 表示空位置,1 表示障碍物。
  • 创建一个大小为r * c与网格相同的二维列表dp,并将起点的路径数目初始化为 1,用于存储从左上角到每个网格点的路径状态,为后面的路径搜索和动态规划求解提供基础。
  • 初始化dp[0][0]为 1,表示机器人已经位于左上角。
  • 遍历第一行和第一列的网格点:
    • 如果当前网格点没有障碍物,并且前一个网格点可达,即dp[i][j-1]为 1,则将dp[i][j]设为 1,表示可以从前一个网格点到达当前网格点。
    • 否则,将dp[i][j]设为 0,表示无法到达当前网格点。
  • 对于其他的网格点dp[i][j]
    • 如果当前网格点没有障碍物,并且上方和左方的网格点至少有一个可达,即dp[i-1][j]dp[i][j-1]至少一个为 1,则将dp[i][j]设为 1,表示可以从可达的网格点到达当前网格点。
    • 否则,将dp[i][j]设为 0,表示无法到达当前网格点。
  • 最后,如果dp[r-1][c-1]为 1,表示右下角的网格点可达,可以通过回溯从右下角开始,根据dp数组中的值找到机器人的路径。具体回溯过程如下:
    • 创建一个空的列表path,用于存储路径。
    • 将回溯的起点设为右下角的网格点,即将xy分别设为r - 1c - 1,其中rc分别是网格的行数和列数。
    • 进入循环,条件为x >= 0y >= 0,以确保在网格内部。
    • 在每次循环中,将当前位置添加到路径列表path中,如果当前位置是左上角的网格点,即x == 0y == 0,则说明已经回溯到起点,跳出循环。否则,检查当前位置的上方的网格点是否可达,即dp[x - 1][y] == 1,如果可达,则将x减 1,表示向上移动一格;否则,将y减 1,表示向左移动一格。
    • 循环结束后,路径列表path中存储了从左上角到右下角的最短路径中的所有网格点,但是顺序是反过来的,所以需要将其反转。
    • 最后,如果右下角的网格点不可达,即dp[r - 1][c - 1] != 1,则返回一个空的路径列表。

使用上述步骤寻找机器人从左上角移动到右下角的路径其时间复杂度为 O ( r ∗ c ) O(r*c) O(rc),其中r是网格的行数,c是网格的列数,这是由于在填充dp列表的过程中,对于每个网格点,都需要访问其上方和左方的网格点,该部分的时间复杂度为 O ( 1 ) O(1) O(1),而路径回溯部分的时间复杂度为 O ( r + c ) O(r+c) O(r+c),因为最多需要遍历r行和c列的网格点。因此,最终代码的时间复杂度为 O ( r ∗ c ) O(r*c) O(rc)

如下是代码示例:

def find_path(grid):
    # 网格的行数
    r = len(grid)
    # 网格的列数
    c = len(grid[0])
    # 创建 dp 数组,并初始化第一个网格点的值为 1
    dp = [[0] * c for _ in range(r)]
    dp[0][0] = 1
    # 初始化第一行和第一列的值
    for i in range(1, r):
        if grid[i][0] == 0 and dp[i - 1][0] == 1:
            dp[i][0] = 1
    for j in range(1, c):
        if grid[0][j] == 0 and dp[0][j - 1] == 1:
            dp[0][j] = 1
    # 填充 dp 数组的其他网格点的值
    for i in range(1, r):
        for j in range(1, c):
            if grid[i][j] == 0:
                dp[i][j] = dp[i - 1][j] or dp[i][j - 1]
    # 如果右下角的网格点可达,则进行路径回溯
    if dp[r - 1][c - 1] == 1:
        path = []
        x, y = r - 1, c - 1
        while x >= 0 and y >= 0:
            path.append((x, y))
            if x == 0 and y == 0:
                break
            if x > 0 and dp[x - 1][y] == 1:
                x -= 1
            else:
                y -= 1
        # 将路径反转,使其按从左上角到右下角的顺序
        return path[::-1]
    else:
        return []

grid = [
    [0, 1, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 0, 0]
]
path = find_path(grid)
print(path)

上述代码通过find_path函数实现了寻找机器人从左上角移动到右下角的路径的功能,函数接收一个二维列表grid作为参数,返回机器人从左上角移动到右下角的最短路径。
注意,这只是一个简单的示例,执行代码时你可以根据实际需求自定义网格的大小,并在其中放置起点、终点和障碍物。

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab,有一个名为SHPATH的函数可以于计算避障最短路径规划。该函数可以通过给定一个由0(代表开放空间)和1(代表障碍物)组成的"地形"矩阵,计算两个指定点之间的最短路径,并自动避开障碍物。这个函数采用了两阶段解决方案。在第一阶段,算法通过搜索开放空间找到两个指定点之间的路径。在第二阶段,算法通过避开障碍物来优化第一阶段找到的路径,以确保生成的最短路径是有效且可行的。 如果您想要获取完整的代码并直接运行,可以在网上搜索"海神之光 Matlab避障最短路径规划",找到相应的下载链接。请注意,该代码适用于Matlab 2014a或2019b版本。如果在运行代码时遇到任何问题,您可以私信博主进行咨询。 总结来说,Matlab的避障最短路径规划可以通过SHPATH函数实现,并且可以通过海神之光提供的代码进行运行。该方法适用于多种领域,包括路径规划、优化求解、神经网络预测、图像处理和语音处理等。如果您对这方面的内容感兴趣,可以点击博主的主页,了解更多相关信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [避障最短路径(版本 1.3):计算平面两点之间的最短路径,避开障碍物。-matlab开发](https://download.csdn.net/download/weixin_38691199/19308755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【路径规划】基于matlab A_star算法机器人避障最短路径规划【含Matlab源码 2522期】.zip](https://download.csdn.net/download/TIQCmatlab/87710424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【路径规划】基于A_star算法机器人避障最短路径规划附matlab代码.zip](https://download.csdn.net/download/qq_59747472/87673994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值