动态规划算法--机器人到达指定位置的方法数量

这篇具有很好参考价值的文章主要介绍了动态规划算法--机器人到达指定位置的方法数量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

        暴力递归和动态规划的本质是一样的,动态规划就是尝试减少重复计算的技巧而已。这种技巧是一个大型套路,先写出用尝试的思路解决问题的递归函数,而不用操心时间复杂度。

        动态规划的优化大致分为三个过程,第一阶段是暴力递归,即不使用任何技巧优化时间复杂度,目的仅仅是通过尝试得到正确的递归函数;第二阶段是记忆化搜索, 即将前面计算得到结果记录下来,从而避免后续重复计算造成的超时问题;第三阶段是严格表结构,即采用斜率优化等数学模型来优化时间和空间复杂度,是一种高级的动态规划。

二、动态规划算法步骤

      动态规划算法的一般步骤总结如下:

  • 找到什么可变参数可以代表一个递归状态,也就是哪些参数一旦确定,返回值就确定了
  • 把可变参数的所有组合映射成一张表,有 1 个可变参数就是一维表,2 个可变参数就 是二维表,......
  • 最终答案要的是表中的哪个位置,在表中标出
  • 根据递归过程的 base case,把这张表的最简单、不需要依赖其他位置的那些位置填好值
  • 根据递归过程非base case的部分,也就是分析表中的普遍位置需要怎么计算得到,那 么这张表的填写顺序也就确定了
  • 填好表,返回最终答案在表中位置的值

三、机器人到达指定位置的方法数量算法

1.算法问题介绍

         假设有排成一行的 N 个位置,记为 1~N(N 一定大于或等于 2)。开始时机器人在其中的 M 位置上(M 一定在 1~N 中),机器人可以往左走或者往右走,如果机器人来到 1 位置, 那么下一步只能往右来到 2 位置;如果机器人来到 N 位置,那么下一步只能往左来到 N-1 位置。 规定机器人必须走 K 步,最终能来到 P 位置(P 也一定在1~N 中)的方法有多少种。给 定四个参数 N、M、K、P,返回方法数。

        【举例】 N=5,M=2,K=3,P=3。上面的参数代表所有位置为 1 2 3 4 5。机器人最开始在 2 位置上,必须经过 3 步,最后到 达 3 位置。走的方法只有如下 3 种:

从2到1,从1到2,从2到3
从2到3,从3到2,从2到3
从2到3,从3到4,从4到3
        所以返回方法数 3。

        N=3,M=1,K=3,P=3 上面的参数代表所有位置为 1 2 3。机器人最开始在 1 位置上,必须经过 3 步,最后到达 3 位置。怎么走也不可能,所以返回方法数 0。

2.算法思路

2.1 暴力尝试

        首先用尝试的方法写出暴力递归函数f,f的返回值为方法数。暴力递归之所以暴力,是因为它遇到每一种情况时都需要分析能导致这种情况的子情况。例如 f(rest=4,cur=2) 时,需要调用 f(rest=3,cur=1)和f(rest=3,cur=3)这两种子情况,分析f(rest=3,cur=1)时又要调用f(rest=2,cur=2);分析f(rest=3,cur=3)时要调用f(rest=2,cur=2)和f(rest=2,cur=4)……到达底层以后再向上回溯汇总方法数。 

这种调用方式是树型结构,需要耗费大量时间和空间。时间复杂度为O(2n).

//暴力递归:f函数返回方法数
//N是位置总数,P是最终位置,rest表示剩余步数,cur表示当前位置
int f1(int N, int P, int rest, int cur)
{
	if (rest == 0)//base case 当步数走完,若在P点,返回一个结果
		return cur == P ? 1 : 0;
	if (cur == 1)//若在左边界,只能往右
		return f1(N, P, rest - 1, 2);
	if (cur == N)//若在有边界,只能往左
		return f1(N, P, rest - 1, N - 1);
	//在中间位置时,有向左和向右两种选择
	return f1(N, P, rest - 1, cur - 1) + f1(N, P, rest - 1, cur + 1);
}

 2.2 记忆化搜索

        分析暴力递归的情况我们很容易发现调用递归函数时,经常会发生重复计算的问题,上例中就发升了连续两次调用f(rest=2,cur=2)函数。所以如果能将这个函数的返回值记录下来,那么在下次调用时就可以节省大量时间。时间复杂度为O(n*k).

        使用dp数组来记录返回值,初始化数组为全“-1”,数组中的值记录每种情况下的方法数。

int dp[100][100];
int walkWay(int N, int P, int K, int M)
{
	for (int i = 0; i <= K; i++)
	{
		for (int j = 0; j <= N; j++)
			dp[i][j] = -1;
	}
	return f2(N, P, K, M);
}
int f2(int N, int P, int rest, int cur)
{
	if (dp[rest][cur] != -1)//缓存命中,直接返回方法数
		return dp[rest][cur];
	//缓存未命中,记录
	if (rest==0)//base case
	{
		dp[rest][cur] = cur == P ? 1 : 0;
		return dp[rest][cur];
	}
	//有路可以继续走
	if (cur == 1)
	{
		dp[rest][cur] = f2(N, P, rest - 1, cur + 1);
		return dp[rest][cur];
	}
	if (cur == N)
	{
		dp[rest][cur] = f2(N, P, rest - 1, cur - 1);
		return dp[rest][cur];
	}
	dp[rest][cur] = f2(N, P, rest - 1, cur - 1) + f2(N, P, rest - 1, cur + 1);
	return dp[rest][cur];
}

2.3 严格表结构的动态规划

        通过递归的对应关系,很容易列出dp数组的每一个元素。如图所示,当从2出发,走4步到达4位置的走法共有4种。这张dp表就是严格表结构。严格表结构的时间复杂度显然是填表的时间O(k*n)

        严格表结构和记忆化搜索最大的区别是:记忆化搜索时不用整理数据间的依赖关系,只需要列出递归函数,并用dp表记录递归函数的返回值即可;严格表结构中则需要弄清楚位置间依赖的顺序。 弄清楚了位置间的依赖关系,就不需要使用递归函数了,直接按照依赖关系正序填表即可。动态规划的核心不在于状态转换方程,而是在于明确表结构中元素位置的依赖关系。

四、代码实现如下文章来源地址https://www.toymoban.com/news/detail-791718.html

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
 
int dp[100][100];
int dpWay(int N, int P, int K, int M)
{
	dp[0][P] = 1;
	for (int rest = 1; rest <= K; rest++)
	{
		for (int cur = 1; cur <= N; cur++)
		{
			if (cur == 1)
				dp[rest][cur] = dp[rest - 1][cur + 1];
			else if (cur == N)
				dp[rest][cur] = dp[rest - 1][cur - 1];
			else dp[rest][cur] = dp[rest - 1][cur - 1] + dp[rest - 1][cur + 1];
		}
	}
	return dp[K][M];
}
 
int main()
{
	int N = 5, P = 4, M = 2, K = 4;
	cout << dpWay(N, P, K, M);
}

到了这里,关于动态规划算法--机器人到达指定位置的方法数量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划—机器人移动问题(Java)

    😀前言 机器人移动问题是一个经典的动态规划应用场景,它涉及到在给定范围内的位置上进行移动,并计算到达目标位置的方法数。本文将介绍三种解决这一问题的方法:暴力递归、缓存法和动态规划。通过比较不同方法的优缺点,我们将深入理解动态规划在解决问题中的

    2024年04月28日
    浏览(26)
  • 左神算法题系列:动态规划机器人走路

    假设有排成一行的N个位置记为1~N,N一定大于或等于2 开始时机器人在其中的start位置上(start一定是1~N中的一个) 如果机器人来到1位置,那么下一步只能往右来到2位置; 如果机器人来到N位置,那么下一步只能往左来到N-1位置; 如果机器人来到中间位置,那么下一步可以往左走

    2024年02月06日
    浏览(32)
  • 迷路的机器人(递归回溯+动态规划两个方法实现)

    题目: 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。 示例: 输入: [   [0,0,0],   [0,1,0],   [0,0,0] ] 输出: [[0,0],[0,1],[0,2],[1,2],[2,2]] 解

    2024年02月12日
    浏览(23)
  • Python 动态规划 实现机器人躲避障碍物获取最短路径

    要设计一种算法来寻找机器人从左上角移动到右下角的路径,可以使用动态规划来解决这个问题。下面是一种可能的算法: 创建一个处理机器人运动的函数 find_path ,函数接受一个矩阵 grid 作为参数,用于表示机器人移动的网格环境,该矩阵一个由 0 和 1 组成的二位列表,其

    2024年04月09日
    浏览(31)
  • SLAM+路径规划:巡检机器人算法设计

    标题:Research on SLAM and Path Planning Method of Inspection Robot in Complex Scenarios 作者:Xiaohui Wang,Xi Ma,Zhaowei Li 编译:东岸因为 编辑:郑欣欣@一点人工一点智能 入群邀请:7个专业方向交流群+1个资料需求群 原文:SLAM+路径规划:巡检机器人算法设计 工厂安全检查对于保持生产环境

    2024年02月03日
    浏览(29)
  • 改进灰狼算法实现机器人栅格地图路径规划

    改进灰狼算法实现机器人栅格地图路径规划 在机器人路径规划领域中,灰狼算法是一种具有全局搜索能力的优化算法。为了进一步提高其性能,可以结合和声算法对其进行改进。本文将介绍如何使用改进的灰狼算法实现机器人在栅格地图上的路径规划,并提供相应的MATLAB源代

    2024年02月06日
    浏览(39)
  • 基于灰狼算法的机器人栅格地图路径规划

    基于灰狼算法的机器人栅格地图路径规划 路径规划是机器人领域中一项重要的任务,它涉及在给定的环境中找到机器人从起始点到目标点的最优路径。灰狼算法是一种基于自然界中灰狼群体行为的优化算法,可以用于解决路径规划问题。在本文中,我们将介绍如何使用灰狼算

    2024年02月06日
    浏览(40)
  • 一套简单的机器人短途路径规划算法

    适用场景 效果 机器人在收到目标点后, global_planner先生成一条直达该点的路径 机器人转向目标点 机器人移动至目标点 机器人旋转到目标位姿 具体可以参考上篇文章, 修改了ROS自带navigation包中的carrot_planner, 使之具有以下特点 global_plan这个vector中包含的路径点的数量增加, 适配

    2024年02月19日
    浏览(37)
  • 基于Dijkstra算法的机器人编队路径规划问题

    基于Dijkstra算法的机器人编队路径规划问题 路径规划是机器人领域中的一个重要问题,它涉及确定从起点到目标点的最佳路径。Dijkstra算法是一种经典的图算法,用于解决最短路径问题。在本文中,我们将介绍如何使用Dijkstra算法来实现机器人编队的路径规划,并提供相应的

    2024年02月08日
    浏览(34)
  • 基于粒子群算法的机器人栅格地图路径规划

    基于粒子群算法的机器人栅格地图路径规划 路径规划是机器人导航和自主移动的重要任务之一。在栅格地图中,机器人需要找到一条最优路径以避开障碍物并到达目标位置。粒子群算法(Particle Swarm Optimization,PSO)是一种模拟自然群体行为的优化算法,可以用于解决路径规划

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包