机器人的路径.docx
- 文档编号:5447084
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:13
- 大小:83.04KB
机器人的路径.docx
《机器人的路径.docx》由会员分享,可在线阅读,更多相关《机器人的路径.docx(13页珍藏版)》请在冰豆网上搜索。
机器人的路径
毕业设计<论文)
题目:
机器人的优化路径设计
学院(部>:
机电项目学院
专业:
机电一体化
学生姓名:
黄文杰
学号:
0950243310
指导教师:
王端义老师
2018年11月28日
第一章、对C语言的初步了解;
1.C语言的概述;
2.程序的灵魂——算法;
3.数据类型、运算符与表达式;
4.函数;
第二章、机器人的优化路径设计;
1.设计前的准备工作——实验、计算得出程序所需的数据;
2.机器人优化路径C语言程序的设计及详解;
第一章、对C语言的初步了解;
1.C语言的概述;
C语言是一种计算机程序设计语言。
它既具有高级语言的特点,又具有汇编语言的特点。
它由美国贝尔研究所的D.M.Ritchie于1972年推出。
1978后,C语言已先后被移植到大、中、小及微型机上。
它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。
具体应用比如单片机以及嵌入式系统开发。
2.程序的灵魂——算法;
1)算法的定义;
算法 也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。 不同的算法可能用不同的时间、空间或效率来完成同样的任务。 一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 2)算法的分类; 算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法。 算法可以宏泛的分为三类: 有限的,确定性算法这类算法在有限的一段时间内终止。 他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。 这类算法得出的结果常取决于输入值。 有限的,非确定算法这类算法在有限的时间内终止。 然而,对于一个<或一些)给定的数值,算法的结果并不是唯一的或确定的。 无限的算法是那些因为没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。 通常,无限算法的产生是因为未能确定的定义终止条件。 3)算法的表现形式; 描述算法的方法有多种,常用的有自然语言、结构化流程图、伪代码和PAD图等,其中最普遍的是流程图。 4)算法设计与分析的基本方法 1.递推法 递推算法是一种用若干步可重复的简运算<规律)来描述复杂问题的方法. 递推是序列计算机中的一种常用算法。 它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定象的值。 其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。 2.递归法 程序调用自身的编程技巧称为递归 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的能力在于用有限的语句来定义对象的无限集合。 一般来说,递归需要有边界条件、递归前进段和递归返回段。 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意: (1>递归就是在过程或函数里调用自身。 (2>在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 3.穷举法 穷举法,或称为暴力破解法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止。 例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。 理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。 因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。 4.贪心算法 贪婪算法是一种对某些求最优解问题的更简单、更迅速的设计技术。 用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。 贪婪算法是一种改进了的分级处理方法。 其核心是根据题意选取一种量度标准。 然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量。 如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。 这种能够得到某种量度意义下最优解的分级处理方法称为贪婪算法。 对于一个给定的问题,往往可能有好几种量度标准。 初看起来,这些量度标准似乎都是可取的,但实际上,用其中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并不是问题的最优解,而是次优解。 因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。 一般情况下,要选出最优量度标准并不是一件容易的事,但对某问题能选择出最优量度标准后,用贪婪算法求解则特别有效。 最优解可以通过一系列局部最优的选择即贪婪选择来达到,根据当前状态做出在当前看来是最好的选择,即局部最优解选择,然后再去解做出这个选择后产生的相应的子问题。 每做一次贪婪选择就将所求问题简化为一个规模更小的子问题,最终可得到问题的一个整体最优解。 5.分治法 分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 分治法所能解决的问题一般具有以下几个特征: (1>该问题的规模缩小到一定的程度就可以容易地解决; (2>该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3>利用该问题分解出的子问题的解可以合并为该问题的解;( 4>该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 6.动态规划法 动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。 其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。 动态规划的思想是多种算法的基础,被广泛应用于计算机科学和项目领域。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。 不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。 动态规划程序设计往往是针对一种最优化问题,因为各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。 因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。 7.迭代法 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法<或者称为一次解法),即一次性解决问题。 迭代法又分为精确迭代和近似迭代。 “二分法”和“牛顿迭代法”属于近似迭代法。 迭代算法是用计算机解决问题的一种基本方法。 它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令<或一定步骤)进行重复执行,在每次执行这组指令<或这些步骤)时,都从变量的原值推出它的一个新值。 8.分枝界限法 分枝界限法是一个用途十分广泛的算法,运用这种算法的技巧性很强,不同类型的问题解法也各不相同。 分支定界法的基本思想是对有约束条件的最优化问题的所有可行解<数目有限)空间进行搜索。 该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集<称为分支),并为每个子集内的解的值计算一个下界或上界<称为定界)。 在每次分支后,对凡是界限超出已知可行解值那些子集不再做进一步分支。 这样,解的许多子集<即搜索树上的许多结点)就可以不予考虑了,从而缩小了搜索范围。 这一过程一直进行到找出可行解为止,该可行解的值不大于任何子集的界限。 因此这种算法一般可以求得最优解。 与贪心算法一样,这种方法也是用来为组合优化问题设计求解算法的,所不同的是它在问题的整个可能解空间搜索,所设计出来的算法虽其时间复杂度比贪婪算法高,但它的优点是与穷举法类似,都能保证求出问题的最佳解,而且这种方法不是盲目的穷举搜索,而是在搜索过程中通过限界,可以中途停止对某些不可能得到最优解的子空间进一步搜索<类似于人工智能中的剪枝),故它比穷举法效率更高。 3.数据类型、运算符与表达式; 1)数据类型; C语言有五种基本数据类型: 字符、整型、单精度实型、双精度实型和空类型。 尽管这几种类型数据的长度和范围随处理器的类型和C语言编译程序的实现而异,但以bit为例,整数与CPU字长相等,一个字符通常为一个字节,浮点值的确切格式则根据实现而定;<如下图所示) 2)运算符和表达式; 运算符是告诉编译程序执行特定算术或逻辑操作的符号。 C语言的运算范围很宽,把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 主要分为三大类: 算术运算符、关系运算符与逻辑运算符、按位运算符。 除此之外,还有一些用于完成特殊任务的运算符。 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 (> 圆括号 <表达式)/函数名(形参表> . 成员选择<对象) 对象.成员名 -> 成员选择<指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型> 强制类型转换 (数据类型>表达式 ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变量名/变量名-- 单目运算符 * 取值运算符 *指针变量 单目运算符 & 取地址运算符 &变量名 单目运算符 ! 逻辑非运算符 ! 表达式 单目运算符 ~ 按位取反运算符 ~表达式 单目运算符 sizeof 长度运算符 sizeof(表达式> 3 / 除 表达式/表达式 左到右 双目运算符 * 乘 表达式*表达式 双目运算符 % 余数<取模) 整型表达式/整型表达式 双目运算符 4 + 加 表达式+表达式 左到右 双目运算符 - 减 表达式-表达式 双目运算符 5 << 左移 变量<<表达式 左到右 双目运算符 >> 右移 变量>>表达式 双目运算符 6 > 大于 表达式>表达式 左到右 双目运算符 >= 大于等于 表达式>=表达式 双目运算符 < 小于 表达式<表达式 双目运算符 <= 小于等于 表达式<=表达式 双目运算符 7 == 等于 表达式==表达式 左到右 双目运算符 ! = 不等于 表达式! =表达式 双目运算符 8 & 按位与 表达式&表达式 左到右 双目运算符 9 ^ 按位异或 表达式^表达式 左到右 双目运算符 10 | 按位或 表达式|表达式 左到右 双目运算符 11 && 逻辑与 表达式&&表达式 左到右 双目运算符 12 || 逻辑或 表达式||表达式 左到右 双目运算符 13 ? : 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符 14 = 赋值运算符 变量=表达式 右到左 /= 除后赋值 变量/=表达式 *= 乘后赋值 变量*=表达式 %= 取模后赋值 变量%=表达式 += 加后赋值 变量+=表达式 -= 减后赋值 变量-=表达式 <<= 左移后赋值 变量<<=表达式 >>= 右移后赋值 变量>>=表达式 &= 按位与后赋值 变量&=表达式 ^= 按位异或后赋值 变量^=表达式 |= 按位或后赋值 变量|=表达式 15 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算 4.函数 1)简介 函数是位于数学领域中的一种对应关系,是从非空数集A到实数集B的对应。 简单地说,甲随着乙变,甲就是乙的函数。 精确地说,设X是一个非空集合,Y是非空数集,f是个对应法则,若对X中的每个x,按对应法则f,使Y中存在唯一的一个元素x与之对应,就称对应法则f是X上的一个函数,记作y=f 对应法则、定义域是函数的两要素。 对应法则并不等同于函数,因为运算法则并不依赖于某个定义域,它可以作用于任何一个非空集合,如。 1X1=1<“X1”可以通用于任意一个算术式里一样) 2)与函数有关的概念 在一个变化过程中,发生变化的量叫变量,有些数值是不随变量而改变的,我们称它们为常量。 自变量,函数一个与它量有关联的变量,这一量中的任何一值都能在它量中找到对应的固定值。 因变量(函数>,随着自变量的变化而变化,且自变量取唯一值时,因变量(函数>有且只有唯一值与其相对应。 函数值,在y是x的函数中,x确定一个值,Y就随之确定一个值,当x取a时,Y就随之确定为b,b就叫做a的函数值。 3)由映射定义 设A和B是两个非空集合,如果按照某种对应关系f,对于集合A中的任何一个元素a,在集合B中都存在唯一的一个元素b与之对应,那么,这样的对应<包括集合A,B,以及集合A到集合B的对应关系f)叫做集合A到集合B的映射(Mapping>,记作f: A→B。 其中,b称为a在映射f下的象,记作: b=f(a>。 a称为b关于映射f的原象。 集合A中所有元素的象的集合记作f(A>。 则有: 定义在非空数集之间的映射称为函数。 <函数的自变量是一种特殊的原象,因变量是特殊的象) 4)几何含义 函数与不等式和方程存在联系<初等函数)。 令函数值等于零,从几何角度看,对应的自变量的值就是图像与X轴的交点的横坐标;从代数角度看,对应的自变量是方程的解。 另外,把函数的表达式<无表达式的函数除外)中的“=”换成“<”或“>”,再把“Y”换成其它代数式,函数就变成了不等式,可以求自变量的范围。 5)函数的集合论<关系)定义 如果X到Y的二元关系f: X×Y,对于每个x∈X,都有唯一的y∈Y,使得 f: X→Y。 当X=X1×…×Xn时,称f为n元函数。 其特点: 前域和定义域重合 单值性: 6)定义域、对应域和值域 输入值的集合X被称为f的定义域;可能的输出值的集合Y被称为f的值域。 函数的值域是指定义域中全部元素通过映射f得到的实际输出值的集合。 注意,把对应域称作值域是不正确的,函数的值域是函数的对应域的子集。 计算机科学中,参数和返回值的数据类型分别确定了子程序的定义域和对应域。 因此定义域和对应域是函数一开始就确定的强制进行约束。 另一方面,值域是和实际的实现有关。 第二章、机器人的优化路径设计; 1、设计前的准备工作——实验、计算得出程序所需的数据; 1)、设定小车行驶等边三角形的直角边所用时间为3秒,计算出行驶等边三角形的斜边所用时间为4.3秒<如下图所示); 2)、实验得出小车转动三角形直角所用时间为1秒,转到三角形锐角所用时间为1.5秒; 2、机器人优化路径C语言程序的设计及详解; #include #include intmain(void>/*主函数(void表示空类型函数>*/ { intcounter。 /*对调用函数counter的声明*/ for(counter=0。 counter<130。 counter++> /*for语句实现循环作用,表示counter从0开始一直循环加到130,其中“130”由直角边所用时间3秒除以一个周期所用时间1300us+1700us+20ms=23ms得到,代表经过130个循环达到3秒*/ { P1_1=1。 /*P1_1表示小车的其中一个轮子*/ delay_nus(1700>。 /*1700表示小车轮子的正转*/ P1_1=0。 P1_0=1。 /*P1_0表示小车的另一个轮子*/ delay_nus(1300>。 /*1300表示小车轮子的反转*/ P1_0=0。 delay_nms(20>。 } /*以上步骤表示小车完成第一个直角边的行驶,行驶了3秒,因为两个轮子的电机反方向安装,所以两个电机转动方向相反,这样实现两个轮子同方向转动*/ for(counter=0。 counter<43。 counter++> { P1_1=1。 delay_nus(1700>。 P1_1=0。 P1_0=1。 delay_nus(1700>。 /*这一段两个都是“1700”表示两个电机都正转,这样正好是想两个轮子的相反方向转动,达到拐弯的作用*/ P1_0=0。 delay_nms(20>。 } /*上面一段与第一段大致相同,改变的“43”是由实验得到小车转一个直角所用时间为1秒,在把1秒除以周期23.4ms得到的43*/ for(counter=0。 counter<130。 counter++> { P1_1=1。 delay_nus(1700>。 P1_1=0。 P1_0=1。 delay_nus(1300>。 P1_0=0。 delay_nms(20>。 } for(counter=0。 counter<64。 counter++> { P1_1=1。 delay_nus(1700>。 P1_1=0。 P1_0=1。 delay_nus(1700>。 P1_0=0。 delay_nms(20>。 } /*上面一段与第二段大致相同,改变的“64”是由实验得到小车转135度所用时间为1.5秒,在把1.5秒除以周期23.4ms得到的64*/ for(counter=0。 counter<186。 counter++> { P1_1=1。 delay_nus(1700>。 P1_1=0。 P1_0=1。 delay_nus(1300>。 P1_0=0。 delay_nms(20>。 } /*最后这一段与第一段大致相同,改变的“186”是把4.3秒除以周期23ms得到的,这一段让小车走玩直角三角形的斜边,回到原点,完成优化路径*/ while<1) /*while<1)表示“当型循环,表示一个循环周期结束*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器人 路径