动态规划学习——机器人运动

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

问题:

一共有N个位置,机器人从start开始,走K步到end
机器人到1后只能向2运动,到N后只能向N-1运动,即不能越界,只能在1-N的位置运动
求总的路线的个数

例:

N=4,startp=1,endp=3,K=4
则路线如下:
1->2->3->4->3
1->2->3->2->3
1->2->1->2->3
总共有3条路线

#include<iostream>
using namespace std;
int N,K,startp,endp;
int ways2_temp[10000][10000]={0};
int ways3_temp[10000][10000]={0};

void ways2_initial()
{
    int i,j;
    for(i=0;i<N+1;i++)
        for(j=0;j<K+1;j++)
            ways2_temp[i][j]=-1;
}

void ways3_initial()
{
    int i,j;
    for(i=0;i<N+1;i++)
        for(j=0;j<K+1;j++)
            ways3_temp[i][j]=0;
}

//法一:递归
//N为位置数,rest为剩余步数,cur为当前位置,endp为目标位置
int process1(int N,int rest,int cur,int endp)
{
    if(rest==0) return cur==endp?1:0;  //rest等于0时应该返回,此时应检查cur是否等于endp,若相等,则返回1(这条路可以走),否则返回0(此路不通)
    if(cur==1) return process1(N,rest-1,2,endp);//若cur=1,则路线数等于cur=2,rest=rest-1时的路线数
    if(cur==N) return process1(N,rest-1,N-1,endp);//若cur=N,则路线数等于cur=N-1,rest=rest-1时的路线数
    //如果cur不等于1,也不等于N,即在中间位置,则下一步既可以向左走,又可以向右走,所以等于左右步数相加
    else return process1(N,rest-1,cur+1,endp)+process1(N,rest-1,cur-1,endp);
}

//法二:带有缓存的解决办法
//首先判断是否已经缓存了(cur,rest)的值(即路线数),若有则直接返回
//若没有则开始递推,且在返回结果前将结果保存到缓存数组中
int process2(int N,int rest,int cur,int endp)
{
    if(ways2_temp[cur][rest]!=-1) return ways2_temp[cur][rest];
    int cnt=0;
    if(rest==0) cnt=(cur==endp?1:0);  //rest等于0时应该返回,此时应检查cur是否等于endp,若相等,则返回1(这条路可以走),否则返回0(此路不通)
    else if(cur==1) cnt=process2(N,rest-1,2,endp);//若cur=1,则路线数等于cur=2,rest=rest-1时的路线数
    else if(cur==N) cnt=process2(N,rest-1,N-1,endp);//若cur=N,则路线数等于cur=N-1,rest=rest-1时的路线数
    //如果cur不等于1,也不等于N,即在中间位置,则下一步既可以向左走,又可以向右走,所以等于左右步数相加
    else cnt=process2(N,rest-1,cur+1,endp)+process2(N,rest-1,cur-1,endp);
    ways2_temp[cur][rest]=cnt;
    return cnt;
}

//法三:动态规划
//由前面的方法可知,可以构建一个数组,行数为N,列数为K+1,第i行第j列的数值表示当前位置为i剩余步数为j时的路线总数
//而对于二维数组中每个值,都等于左上和右下值之和(第一行只有右下,最后一行只有左上)
//此外,对于第一列,即剩余步数rest=0时,只有当行数等于目标位置endp时,值为1
//故可以从左到右扫描数列,填充二维数组,最后的结果为第endp行第K列的值
int process3(int N,int K,int startp,int endp)
{
    int i,j;
    for(i=0;i<=K;i++) ways3_temp[i][0]=0;
    ways3_temp[endp][0]=1;
    for(i=1;i<=K;i++){
        ways3_temp[1][i]=ways3_temp[2][i-1];
        for(j=1;j<=N;j++){
            ways3_temp[j][i]=ways3_temp[j-1][i-1]+ways3_temp[j+1][i-1];
        }
        ways3_temp[N][i]=ways3_temp[N-1][i-1];
    }
    return ways3_temp[startp][K];
}


int main()
{
    int choice;
    do
    {
        cout<<"请输入位置总数N:   ";
        cin>>N;
        cout<<"请输入开始位置startp:   ";
        cin>>startp;
        cout<<"请输入结束位置endp:   ";
        cin>>endp;
        cout<<"请输入一共要走的步数K:   ";
        cin>>K;
        int result1=process1(N,K,startp,endp);
        cout<<"法一 直接递归 得出 一共有 "<<result1<<" 种走法"<<endl;
        ways2_initial();
        int result2=process2(N,K,startp,endp);
        cout<<"法二 缓存递归 得出 一共有 "<<result2<<" 种走法"<<endl;
        ways3_initial();
        int result3=process3(N,K,startp,endp);
        cout<<"法三 动态规划 得出 一共有 "<<result3<<" 种走法"<<endl;
        cout<<"是否继续?继续输入1"<<endl;
        cin>>choice;
    }while(choice==1);

    return 0;
}


参考资料:

bilibili 马士兵教育——左程云

【应B友要求火速上线!算法大神(左程云)教你从暴力递归到动态规划,吊打所有暴力递归、动态规划问题】https://www.bilibili.com/video/BV1ET4y1U7T6?p=13&vd_source=4e9b7dd8105df854ae96830c97920252文章来源地址https://www.toymoban.com/news/detail-815306.html

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

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

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

相关文章

  • 【运动规划算法项目实战】如何实现机器人多目标点导航

    在ROS机器人应用中,实现机器人多目标点导航是非常常见的需求。本文将介绍如何使用ROS和actionlib来实现机器人的多目标点导航,目标点信息将被记录在YAML文件中。 我们可以通过使用MoveBaseAction来实现机器人的导航功能。MoveBaseAction是一个ROS中的action类型,它提供了控制机器

    2024年02月02日
    浏览(47)
  • 六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介

    毕业设计做了六轴机器人相关的课题,做完之后学到很多,在这里分享一下。本篇首先对六轴机器人及其研究内容进行简单的介绍。 六轴机器人中的六轴指个六自由度,由关节和连杆组成。常见的六轴机器人为 串联型旋转关节机器人 。这里以一款川崎机器人为例,展示一下

    2024年02月02日
    浏览(47)
  • 【深蓝学院】移动机器人运动规划--第5章 最优轨迹生成--笔记

    Ch2讲了基于搜索的路径规划方法,Ch3讲了基于采样的路径规划方法,这些都是global methods,框架都是Exploration and Exploitation,且在算力足够大的情况下,一定能够找到全局最优解。 除了global methods,还有local methods,主要是Deterministic Optimization确定性优化。基于优化的方法,主要

    2024年02月19日
    浏览(46)
  • MATLAB算法实战应用案例精讲-【人工智能】基于机器视觉的机器人及机械臂运动规划(补充篇)

    目录 前言 几个高频面试题目 机器人抓取时怎么定位的?用什么传感器来检测?

    2024年02月07日
    浏览(57)
  • Ros noetic 机器人坐标记录运动路径和发布 实战教程(A)

             网上记录Path的写入文件看了一下还挺多的,有用 yaml 作为载体文件,也有用 csv 文件的路径信息,也有用 txt 来记录当前生成的路径信息,载体不重要,反正都是记录的方式,本文主要按 yaml 的方式写入,后文中将补全其余两种方式。          其中两种方式的主要

    2024年02月10日
    浏览(41)
  • 【运动规划算法项目实战】如何实现机器人多目标点导航(附ROS C++代码)

    在ROS机器人应用中,实现机器人多目标点导航是非常常见的需求。本文将介绍如何使用ROS和actionlib来实现机器人的多目标点导航,目标点信息将被记录在YAML文件中。 我们可以通过使用MoveBaseAction来实现机器人的导航功能。MoveBaseAction是一个ROS中的action类型,它提供了控制机器

    2024年02月10日
    浏览(44)
  • MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模  正向运动学,逆向运动学 关节空间轨迹规划 五次多项式轨迹规划 笛卡尔空间轨迹规划 直线插补    还包含机器人工具箱建立的模型对比 MATLAB仿真UR5机器人simulink simscape 自制建模及运动学规划 摘要:本文介绍了利用MATLAB仿真UR5机器

    2024年02月04日
    浏览(68)
  • 动态规划—机器人移动问题(Java)

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

    2024年04月28日
    浏览(43)
  • 基于粒子群算法的机器人动态路径规划

    基于粒子群算法的机器人动态路径规划 粒子群算法(Particle Swarm Optimization,PSO)是一种基于群体智能的优化算法,常用于解决优化问题。在机器人动态路径规划中,粒子群算法可以被应用于寻找最优路径,以使机器人在动态环境中能够高效地规划路径并避免障碍物。 本文将

    2024年02月07日
    浏览(53)
  • 动态规划算法--机器人到达指定位置的方法数量

    一、背景         暴力递归和动态规划的本质是一样的, 动态规划就是尝试减少重复计算的技巧而已 。这种技巧是一个大型套路,先写出用尝试的思路解决问题的递归函数,而不用操心时间复杂度。         动态规划的优化大致分为三个过程,第一阶段是暴力递归,

    2024年01月15日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包