精华内容
下载资源
问答
  • 2021-12-28 17:59:58

    Vue图片路径问题(动/静态引入:绝对路径、相对路径)

    DEMO实例(可快速解决问题):

    注意:绝对路径方式导入的图片需要存储在 publiic 文件夹下

    静态导入相对路径:

    <img src="../../assets/1.png" />
    <!-- 或者如下 -->
    <img src="@/assets/1.png" />
    

    静态导入绝对路径:

    <img src="images/1.png" />
    <!-- 或者如下 -->
    <img src="/images/1.png" />
    

    动态导入相对路径:

    方法1( require 写在html中 ):

    <img :src="require('../../assets/' + imageUrl)" />
    
    <script>
    export default {
    	data() {
            return {
                // 图片路径变量,真实路径为 assets/images/1.png
                imageUrl: 'images/1.png'
            }
        }
    }
    </script>
    

    方法2( require 写在js中 ):

    <img :src="imageUrl" />
    
    <script>
    export default {
    	data() {
            return {
                // 图片路径变量,真实路径为 assets/images/1.png
                img: 'images/1.png',
                imageUrl: require('../../assets/' + this.img)
            }
        }
    }
    </script>
    

    动态导入绝对路径:

    <img :src="imageUrl" />
    
    <script>
    export default {
    	data() {
            return {
                // 图片路径变量,真实路径为 public/images/1.png
                imageUrl:'images/1.png'
                // 或者 imageUrl:'/images/1.png'
            }
        }
    }
    </script>
    

    需要搞明白这几点

    1. 什么是相对路径和绝对路径?
    2. 相对路径加上@为什么不一样?
    3. public文件夹有什么不同?
    4. 为什么绝对路径导入的图片需要在public文件夹下?
    5. 动态加载时为什么使用require?
    6. require为什么不能直接用变量接收地址?

    1.什么是相对路径和绝对路径?

    简单说就是:

    相对路径:以.开头的,例如./../之类的。就是相对于自己的目标文件的位置。

    绝对路径:以/开头的。就是目标文件的真实路径。表示当前站点的根目录。

    2.相对路径加上@为什么不一样?

    仔细读完这两张图片就懂啦。
    在这里插入图片描述
    在这里插入图片描述
    Vue CLI 官方介绍

    3.public文件夹有什么不同?

    来看一下通过 npm run build 打包之后生成的文件夹。简单来说,就是以后你要将这些文件部署到服务器上去。除了原来public文件夹下的data目录(红框标注),其他文件夹都是经过webpack打包后得到的。不再是原来的目录结构了,名字也不一样了。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4zXskRBO-1640685473863)(C:\Users\chengjian\AppData\Roaming\Typora\typora-user-images\image-20211228171021620.png)]

    4.为什么绝对路径导入的图片需要在public文件夹下?

    摘自 Vue CLI 官网:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ca32875a-1640685473864)(C:\Users\chengjian\AppData\Roaming\Typora\typora-user-images\image-20211228172307016.png)]

    简单来说,就是 public 目录下的文件不会被编译,部署后可以通过绝对路径获取到。如果还放在原来的 assets 目录中,就会被webpack打包成新的文件夹,故而过去不到。

    5.动态加载时为什么使用require?

    <img :src="'./assets/images/02.jpg'" alt=""> // 错误的引入方式
    <!-- 编译后 -->
    <img src="./assets/images/02.jpg" alt="">
    
    <!-- 注意(绝对路径) -->
    <img :src="'images/02.jpg'" alt="">	// 正确的引入方式
    <!-- 编译后 -->
    <img src="images/02.jpg" alt="">
    

    使用:src调用了v-bind指令处理其内容,相对路径不会被webpack的file-loader处理。编译后,资源目录assets结构已变,而代码的目录没变,所以相对路径这种方式不行,而绝对路径没有问题。

    6.require为什么不能直接用变量接收地址?`

    <!-- 错误用法 -->
    <img :src="require(imageUrl)" />   // 变量 imageUrl: '../../assets/images/1.png'
    

    解决办法:用字符串模板或变量名+空字符串。

    let url = './data/test.json';
    const json1 = require(url);			//错误用法
    const json2 = require(`${url}`);	//正确用法
    const json3 = require(url + '');	//正确用法
    

    配上一条相关解释链接:

    https://www.zhihu.com/question/421711093

    这块应该是webpack的实现问题,有兴趣去多了解下吧,使用的话看完这篇就够了!

    更多相关内容
  • 路径规划算法

    万次阅读 多人点赞 2021-11-14 10:20:44
    文章目录前言一、传统路径规划算法1.Dijkstra算法2.A*算法3.D*算法4.人工势场法二、基于采样路径规划算法1.PRM算法2.RRT算法三、智能仿生算法1.神经网络算法2.蚁群算法3.遗传算法 前言 随着机器人技术、智能控制...


    前言

    随着机器人技术、智能控制技术、硬件传感器的发展,机器人在工业生产、军事国防以及日常生活等领域得到了广泛的应用。而作为机器人行业的重要研究领域之一,移动机器人行业近年来也到了迅速的发展。移动机器人中的路径规划便是重要的研究方向。移动机器人的路径规划方法主要分为传统的路径规划算法、基于采样的路径规划算法、智能仿生算法。传统的路径规划算法主要有A算法、Dijkstra算法、D算法、人工势场法,基于采样的路径规划算法有PRM算法、RRT算法,智能仿生路径规划算法有神经网络算法、蚁群算法、遗传算法等。
    图1 路径规划算法


    一、传统路径规划算法

    1.Dijkstra算法

    Dijkstra算法是Edsger Wybe Dijkstra在1956年提出的一种用来寻找图形中结点之间最短路径的算法。Dijkstra算法的基本思想是贪心思想,主要特点是以起始点为中心向外层层扩展,直到扩展到目标点为止。Dijkstra算法在扩展的过程中,都是取出未访问结点中距离该点距离最小的结点,然后利用该结点去更新其他结点的距离值。
    Dijkstra算法流程:

    1.	将初始点s放入到集合S中,初始时集合S中只有s;
    2.	无自环的初始点s到自己的最短路径为0;
    3.	For(目标点ei不在集合S中):
    4.	   计算集合S中以外的所有结点到集合S中结点的最短距离,即从s出发,到达所有结点且只允许通过初始点s的最短路径。如果没有直达的通路,那么就设置为无穷,意味着暂时到达不了的结点。
    5.	While(集合V-S不是空集):
    6.	   选出第一次for循环之后在集合V-S中,且相对于集合S的最短路径中距离最短的目标点ej。
    7.	   将该目标点ej并入到集合S中。
    8.	   将目标点ej并入集合S之后会对V-S以外的顶点相对于集合S的最短路径长度产生影响。
    9.	   For(更新S中的结点路径)
    10.	      If(dist[s,ej]+wj,i < dist[s,ei]11.	         dist[s,ei] = dist[s,ej]+wj,i
    

    注:该算法不允许图中存在负权边。
    图2 Dijkstra算法
    优点:
    1) 如果最优路径存在,那么一定能找到最优路径
    缺点:
    1) 有权图中可能是负边
    2) 扩展的结点很多,效率低

    2.A*算法

    A算法发表于1968年,A算法是将Dijkstra算法与广度优先搜索算法(BFS)二者结合而成,通过借助启发式函数的作用,能够使该算法能够更快的找到最优路径。A算法是静态路网中求解最短路径最有效的直接搜索方法。
    A
    算法的启发式函数:f(n)=g(n)+h(n)
    f(n)表示结点的综合优先级,在选择结点时考虑该结点的综合优先级;
    g(n)表示起始点到当前结点的代价值;
    h(n)表示当前结点到目标点的代价估计值,启发式函数。
    当h(n)趋近于0时,此时算法退化为Dijkstra算法,路径一定能找到,但速度比较慢;当g(n)趋近于0时,算法退化为BFS算法,不能保证一定找到路径,但速度特别快。我们可以通过调节h(n)的大小来调整算法的精度与速度。
    在A*算法中,采用最多的是欧几里得距离,即dist = srqt((y2-y1)2+(x2-x1)2)。

    A*算法流程:

    1.	将起始点s加入到开启列表openlist中
    2.	重复以下过程:
    a)	遍历开启列表openlist,寻找F值最小的结点,并将其作为当前要处理的结点
    b)	将要处理的结点移到关闭列表closelist
    c)	对当前结点的8个相邻结点的每个结点:
    i.	如果他是不可抵达的或者已经在关闭列表closelist中,忽略; 
    ii.	如果他不在开启列表openlist中,将其加入openlist,并把当前结点设置为其父节点,记录当前结点的F、G、H值;
    iii.	如果他已经在开启列表openlist中,检查这条路径(即经由当前结点到达相邻结点)是否更好,用G值做参考,更小的G值表示这个更好的路径,如果是这样,将其父节点设置为当前结点,并重新计算他的G值和F值,如果开启列表openlist是按F值进行排序,改变后需要重新排序。
    d)	停止,当
    i.	终点加入到了开启列表openlist中,此时路径已经找到
    ii.	查找重点失败,并且开启列表openlist中是空的,此时没有路径
    3.	保存路径,从终点开始,每个结点沿着其父节点移动直到起点。
    

    图3 A*算法环境及路径点

    图4 A*算法规划路径
    图5 平滑处理后的路径
    优点:
    1) 利用启发式函数,搜索范围小,提高了搜索效率
    2) 如果最优路径存在,那么一定能找到最优路径
    缺点:
    1) A算法不适用于动态环境
    2) A
    算法不太适合于高维空间,计算量大
    3) 目标点不可达时会造成大量性能消耗

    3.D*算法

    D算法是卡耐基梅隆机器人中心的Stentz在1994年提出的主要用于机器人探路,并且美国火星探测器上就是应用的D路径规划算法。A算法适用于在静态路网中寻路,在环境变化后,往往需要replan,由于A不能有效利用上次计算的信息,故计算效率较低。D算法由于储存了空间中每个点到终点的最短路径信息,故在重规划时效率大大提升。A是正向搜索,而D特点是反向搜索,即从目标点开始搜索过程。在初次遍历时候,与Dijkstra算法一致,它将每个节点的信息都保存下来。
    D*算法流程:

    1.	先用Dijkstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h)原OPEN和CLOSE中节点信息保存。
    2.	机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijkstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值C(X,Y)+X的原实际值h(X)。X为下一节点(到目标点方向Y->X->G),Y是当前点。K值去h值变化前后的最小。
    3.	用A*或其他算法计算,这里假设用A*算法,遍历Y的子节点,放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:用A*或者其他算法计算,这里假设用A*算法,遍历Y的子节点,放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:
    while()
    {
    从OPEN表中取k值最小的节点Y;
    遍历Y的子节点a,计算a的h值 h(a)=h(Y)+Y到子节点a的权重C(Y,a)
    {
        if(a in OPEN)     比较两个a的h值 
        if( a的h值小于OPEN表a的h值 )
        {
    更新OPEN表中a的h值;k值取最小的h值
              有未受影响的最短路经存在
              break; 
        }
        if(a in CLOSE) 比较两个a的h值 //注意是同一个节点的两个不同路径的估价值
        if( a的h值小于CLOSE表的h值 )
        {
    更新CLOSE表中a的h值; k值取最小的h值;将a节点放入OPEN表
           有未受影响的最短路经存在
           break;
        }
        if(a not in both)
            将a插入OPEN表中; //还没有排序
    }
    放Y到CLOSE表;
    OPEN表比较k值大小进行排序;
    }
    

    图6 D*算法
    优点:
    1)适用于动态环境的路径规划,搜索效率高
    缺点:
    1) 不适用于高维空间,计算量大
    2) 不太适用于在距离较远的最短路径上发生变化的场景

    4.人工势场法

    人工势场法是由Khatib在1985年提出的一种基于虚拟力场的局部路径规划算法,该算法的基本思想是当机器人在周围环境中运动时,将环境设计成一种抽象的人造引力场,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过二者的合力来控制移动机器人的运动。应用人工势场法规划出来的路径一般是比较平滑并且安全的,但是存在着局部最优的问题。
    利用势场函数U来建立人工势场,势场函数是一种可微函数,空间中某点处势场函数值的大小,代表了该点的势场强度。我们采用引力势场函数与斥力势场函数,用U(q)表示二者之和。
    在这里插入图片描述
    引力势场函数:
    在这里插入图片描述
    e表示引力增益,p(q,qgoal)表示当前点到目标点的距离;
    斥力势场函数:
    在这里插入图片描述
    n表示斥力增益,p(q,qgoal)表示当前点到障碍物的距离,p0表示障碍物作用距离阈值。
    图7 人工势场法
    优点:
    1) 规划出的路径一般是比较平滑且安全
    2) 人工势场法是一种反馈控制策略,具有一定的鲁棒性
    缺点:
    1) 容易陷入局部最优的问题
    2) 距离目标点较远时,引力特别大,斥力相对较小,可能会发生碰撞
    3) 当目标点附近有障碍物时,斥力非常大,引力较小,很难到达目标点

    二、基于采样路径规划算法

    1.PRM算法

    随机路线图(PRM)算法是一种基于图搜索的算法,可以将连续状态空间转换成离散状态空间,在利用A*等搜索算法在路线图上寻找路径,提高搜索效率。PRM算法是概率完备且不是最优的算法。
    PRM算法流程:

    1.	初始化,设G(V,E)为一个无向图,其中顶点集V代表无碰撞的状态点,连线集E代表无碰撞的路径。初始状态为空。
    2.	状态点采样,在状态空间中采样无碰撞的状态点加入到无碰撞的状态点V中。
    3.	邻域计算,定义距离p,对于已经存在于无碰撞的状态点V中的点,如果他与无碰撞的点的距离小于p,则将其称作无碰撞状态点的邻域点。
    4.	边线连接,将无碰撞的状态点与其邻域相连,生成连线。
    5.	碰撞检测,检测连线是否与障碍物发生碰撞,如果无碰撞,则将其加入到连线集E中。
    6.	结束条件,当所有采样点均已完成上述步骤后结束,否则重复2~5。
    7.	最后使用A*算法在路线图上寻找最优路径。
    

    图8 PRM算法
    优点:
    1) 适用于高维空间和复杂约束的路径规划问题
    2) 搜索效率高,搜索速度快
    缺点:
    1)概率完备但不是最优

    2.RRT算法

    RRT算法是适用于高维空间,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,较好的处理带有非完整约束的路径规划问题,有效的解决了高维空间和复杂约束的路径规划问题。该算法是概率完备但不是最优的算法。
    RRT算法以初始点qinit作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当目标点位于随机扩展树上时,能够找到一天初始点到目标点的路径。首先,需要从状态空间中随机选择一个采样点qrand,然后从随机树中选择一个距离qrand最近的结点qnearest,从qnearest向qrand扩展一个步长的距离,得到一个新的结点qnew,如果qnew与障碍物发生碰撞,则返回空;否则,将qnew加入到随机树中,重复上述步骤直到qnearest和qgoal距离小于一个阈值。
    图9 未通过狭长空间
    图10 通过狭长空间
    优点:
    1) 搜索效率比较高,搜索速度比较快
    2) 适用于高维空间,不会产生维度灾难的问题
    3) 只需对状态空间采样点进行碰撞检测,避免了对空间的建模
    缺点:
    1) 规划出的路径质量一般,可能存在棱角、不够光滑
    2) RRT算法不太适用于存在狭长空间的环境
    3) 规划出的路径可能不是最优路径
    4) 不适用于动态环境的路径规划

    三、智能仿生算法

    1.神经网络算法

    随着机器人自主性的不断提高,使其具有环境感知以及环境学习的能力,许多学者提出了深度强化学习算法来解决移动机器人处于动态复杂环境中路径规划的问题。深度强化学习算法充分利用了深度学习的感知能力与强化学习的决策能力,通过机器人与环境的交互过程不断试错,通过环境评价性的反馈,实现系统更加智能的决策控制,帮助移动机器人在某些复杂未知的环境中实现一定程度的自主化与智能化。
    路径规划就是一个标准的MDP问题,强化学习可以通过值迭代等方法建立一个表格,用以存储状态s到动作a的映射。但是在复杂环境中会产生维度灾难的问题,因此神经网络可以解决维度灾难的问题。以DQN算法为例,来讲解神经网络算法在路径规划中的应用。DQN算法是Q-Learning算法与卷积神经网络(CNN)二者进行结合。DQN算法是由两个网络结构、初始参数相同的结构组成,一个是估计网络,用来输出估计值函数;另一个是目标网络,用来输出目标值函数。通过强化学习使机器人与环境进行交互得到样本(s,a,r,s’),将所有的样本集放入到经验回放池中。神经网络进行训练时,随机的从经验回放池中抽取batchsz数量的样本,将样本输入进神经网络,利用神经网络的非线性拟合能力,拟合出非线性函数来表达我们的Q值,利用e-greedy策略来进行选择智能体的动作。智能体执行完相应的动作之后,环境会反馈一个状态和奖励值,最后经过神经网络模型的训练和优化得到网络的训练参数,得到相对准确的动作输出。
    在这里插入图片描述
    其中w表示估计网络的参数, w-表示目标网络的参数。

    优点:
    1) 适合于动态复杂环境
    2) 适用于高维空间,避免维度灾难的问题
    缺点:
    1) 对硬件的要求比较高
    2) 参数调节比较困难

    2.蚁群算法

    蚁群算法(Ant Colony Optimization,ACO)是Dorigo在1992年提出的一种用来寻找优化路径的概率型算法,是由一群无智能或有轻微智能的个体通过相互写作而表现出智能行为,为求解复杂问题提供了一个新的可能性。该算法的主要思想是蚂蚁在寻找食物过程中发现路径的行为。该算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。
    蚁群算法的基本原理是利用蚂蚁在觅食过程中会释放信息素。

    1.	初始时刻,路径没有任何信息素,蚂蚁会以一定的随机性选择任意方向
    2.	更新信息素矩阵,当有信息素时,蚂蚁会优先选择信息素浓度高的路径
    3.	那么在相同时间内,信息素的浓度与路径长度成反比,越短的路径会有更多的信息素,那么后续的蚂蚁会选择信息素浓度高的路径,最优路径上的信息素浓度会越来越高
    4.	随着时间的推移,信息素会自行挥发
    5.	最终,能选择出一条最优路径即信息素浓度高的路径
    

    影响蚁群算法的因素:
    1) 信息素如何撒播
    2) 信息素如何挥发
    3) 以何种方式让蚂蚁选择运动方向,减少盲目性和不必要性
    4) 给予蚂蚁和环境一定的记忆能力能够帮助减少搜索空间
    个体分布越均匀,种群多样性就越好,得到全局最优解的概率就越大,但是寻优时间就越长;个体分布越集中,种群多样性就越差,不利于发挥算法的探索能力。正反馈加快了蚁群算法的收敛速度,却使算法较早地集中于部分候选解,因此正反馈降低了种群的多样性,也不利于提高算法的全局寻优能力。
    图11 蚁群算法
    优点:
    1) 蚁群算法的鲁棒性强
    2) 采用正反馈机制,能够逼近最优解
    3) 易与其他算法进行结合
    缺点:
    1) 盲目的随机搜索,搜索时间较长,搜索速度慢
    2) 蚁群算法容易陷入局部最优
    3) 蚁群算法参数的选择依赖于经验或试错

    3.遗传算法

    遗传算法(Genetic Algorithm,GA)是由John Holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的,来模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
    图12 遗传算法
    遗传算法的流程:

    1.评估每条染色体所对应个体的适应度
    While(未找到满意的解):
    2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方
    3.抽取父母双方的染色体,进行交叉,产生子代
    4.对子代的染色体进行变异
    

    优点:
    1) 遗传算法具有广泛的应用领域
    2) 遗传算法具有群体搜索的特性
    3) 遗传算法基于概率规则,搜索更为灵活
    4) 遗传算法直接以目标函数作为搜索信息,不涉及目标函数值求微分的过程
    缺点:
    1) 遗传算法效率比较低
    2) 遗传算法容易过早收敛
    3) 遗传算法在编码时容易出现不规范不准确的问题


    更多内容请关注微信公众号:深度学习与路径规划

    在这里插入图片描述

    展开全文
  • 最短路径算法

    万次阅读 多人点赞 2020-07-01 00:18:45
    ​ 从图的一个点到另一个点到路径不止一条,每条路径的长度可能不同,把路径长度最短的那条叫做最短路径。 有权图中,应该考虑各边的权值。无权图中,可以将每条边的权值看作是1. ​ 最短路径问题可分为两方面: ...

    最短路径


    ​ 从图的一个点到另一个点到路径不止一条,每条路径的长度可能不同,把路径长度最短的那条叫做最短路径。

    有权图中,应该考虑各边的权值。无权图中,可以将每条边的权值看作是1.

    ​ 最短路径问题可分为两方面:

    • 图中一个点到其余各点的最短路径
    • 图中每对点之间到最短路径

    Dijkstra

    基本思想

    ​ 狄克斯特拉算法解决图中一点到其余各点到最短路径的问题。其基本思想位:图G=(V,E)是一个有权有向图,把顶点V分成两组,第一组为已求出最短路径的点的集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径v,…k,就将k加入到集合S中,直到全部到点都加入S集合中,算法结束),第二组为其余未确定最短路径的点的集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入到S中。

    算法描述

    操作步骤:

    1. 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
    2. 从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。
    3. 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
    4. 重复步骤(2)和(3),直到遍历完所有顶点。

    图1在这里插入图片描述

    如上图,以A为开头,求A到各个点的最短距离。

    第一步,初始化距离,指与A直接连接的点的距离。dis[b]代表A到B点的最短距离,因而初始dis[B]=4,dis[C]=6,dis[D]=6,其余为无穷大。设置集合S用来表示已经找到的最短路径。此时,S={A}。现在得到A到各点距离**{A(0),B(4),C(6),D(6),E(*),F(*),G(*)}**,其中*代表未知数也可以说是无穷大,括号里面的数值代表A点到该点的最短距离。

    第2步:不考虑集合S中的点,因为dis[B]=4,是当中距离最短的,所以此时更新S,S={A,B}。接着我们看与B连接的点,分别有C,E,已经在集合S中的不看**,dis[B-C]=1,因而dis[C]=dis[B]+1=5(小于之前点dis[C],故需更新),dis[E]=dis[B]+dis[B-E]=11**。此时**{A(0),B(4),C(5),D(6),E(11),F(*),G(*)}**。

    第3步:在第2步中,C点的值5最小,更新S={A,B,C},此时看与C点直接连接的点,分别有E,F。dis[E]=dis[C]+dis[C-E]=5+6=11(和原来的值一样,不更新),dis[F]=dis[C]+dis[C-F]=5+4=9(更新)。此时**{A(0),B(4),C(5),D(6),E(11),F(9),G(*)}**。

    第4步:在第3步中,D点的值6最小,更新S={A,B,C,D},此时看与D点直接连接的点,有F。dis[F]=dis[D]+dis[D-F]=6+5=11(不更新)。此时**{A(0),B(4),C(5),D(6),E(11),F(9),G(*)}**。

    第5步:在第4步中,F点的值9最小,更新S={A,B,C,D,F},此时看与F点直接连接的点,有E、G。dis[E]=dis[F]+dis[F-E]=9+1=10(更新),dis[G]=dis[F]+dis[F-G]=9+8=17(更新)。此时**{A(0),B(4),C(5),D(6),E(10),F(9),G(17)}**。

    第6步:在第5步中,E点的值10最小,更新S={A,B,C,D,F,E},此时看与E点直接连接的点,只有G。dis[G]=dis[E]+dis[E-G]=10+6=16(更新)。此时**{A(0),B(4),C(5),D(6),E(10),F(9),G(16)}**。

    第7步:最后只剩下G值,直接进入集合S={A,B,C,D,F,E,G},此时所有的点都已经遍历结束,得到最终结果**{A(0),B(4),C(5),D(6),E(10),F(9),G(16)}**。

    SUA点到个点到距离
    {A}{B,C,D,F,E,G}{A(0),B(4),C(6),D(6),E(*),F(*),G(*)}
    {A,B}{C,D,F,E,G}{A(0),B(4),C(5),D(6),E(11),F(*),G(*)}
    {A,B,C}{D,F,E,G}{A(0),B(4),C(5),D(6),E(11),F(9),G(*)}
    {A,B,C,D}{F,E,G}{A(0),B(4),C(5),D(6),E(11),F(9),G(*)}
    {A,B,C,D,F}{E,G}{A(0),B(4),C(5),D(6),E(10),F(9),G(17)}
    {A,B,C,D,F,E}{G}{A(0),B(4),C(6),D(6),E(10),F(9),G(16)}
    {A,B,C,D,F,E,G}{}{A(0),B(4),C(6),D(6),E(10),F(9),G(16)}
    public class Dijkstra {
        public static int max = 99999;
    
        public static void main(String[] args) {
            int[][] graph = {{0, 4, 6, 6, max, max, max},
                    {max, 0, 1, max, 7, max, max},
                    {max, max, 0, max, 6, 4, max},
                    {max, max, 2, 0, max, 5, max},
                    {max, max, max, max, 0, max, 6},
                    {max, max, max, max, 1, 0, 8},
                    {max, max, max, max, max, max, max}};
            int startPointIndex = 0;
            int[] dis = dijkastra(graph, startPointIndex);
            System.out.println(dis.toString());
    
        }
    
        public static int[] dijkastra(int[][] graph, int startPointIndex) {
            boolean[] s = new boolean[graph.length];//集合s表示,已经求出最短路径的点的集合
            for (int i = 0; i < graph.length; i++) {//初始化s集合,只有起始点
                if (i == startPointIndex) {
                    s[i] = true;
                } else {
                    s[i] = false;
                }
            }
            int[] dis = new int[graph.length];//最短路径集合
            for (int i = 0; i < graph.length; i++) {//初始化,起始点到其他点的距离。
                dis[i] = graph[startPointIndex][i];
            }
    
            for (int i = 0; i < graph.length; i++) {//求到每个点的最短路径
    
                int tmpdis = max;
                int tmpindex = 0;
                for (int j = 0; j < graph.length; j++) {
                    if (!s[j] && dis[j] < tmpdis) {//不在s集合(未求出该店的最短路径)
                        tmpdis = dis[j];
                        tmpindex = j;
                    }
                }
                //dis中距离最短的点加入到s集合中
                s[tmpindex] = true;
                
                for (int j = 0; j < graph.length; j++) {//更新起点到其他点距离
                    if (dis[j] > dis[tmpindex] + graph[tmpindex][j]) {
                        dis[j] = dis[tmpindex] + graph[tmpindex][j];
                    }
                }
            }
            return dis;//返回起点到每个点的最短路径长度
        }
    }
    

    狄克斯特拉算法的时间复杂度O(n^2)。

    FLoyd算法

    ​ 对于第二类问题,求每对点之间的最短路径,可以通过把每个点作为源点用Dijkstra算法求最短路径。也可以用弗洛伊德(Floyd)算法。

    基本思想

    ​ 有图G=(V,E)采用邻接矩阵cost存储,另外设置一个二维数组A用来存放当前顶点之间的最短路径长度,分量A[i][j]表示当前顶点i到顶点j到最短路径长度。Floyd算法到基本思想是递推产生一个矩阵序列A0,A1,……,Ak,……,An,其中Ak[i][j]表示从顶点i到顶点j的路径上经过的顶点编号不大于k的最短路径长度。

    算法描述

    Floyd算法的思想可用如下的表达式来描述:
    A − 1 [ i ] [ j ] = c o s t [ i ] [ j ] A_{-1}[i][j]=cost[i][j] A1[i][j]=cost[i][j]

    A k + 1 [ i ] [ j ] = m i n ( A k [ i ] [ j ] , A k [ i ] [ k + 1 ] + A k [ k + 1 ] [ j ] ) ( − 1 ≤ k ≤ n − 2 ) A_{k+1}[i][j]=min(A_{k}[i][j],A_{k}[i][k+1]+A_{k}[k+1][j])(-1\leq k\leq n-2) Ak+1[i][j]=min(Ak[i][j],Ak[i][k+1]+Ak[k+1][j])(1kn2)

    图0

    图2

    以上图为例,初始时构建最短路径长度邻接矩阵如下:

    ABCDEFG
    A012***1614
    B12010**7*
    C*100356*
    D**304**
    E**54028
    F1676*209
    G14***890

    第一步,以顶点A为中介点更新矩阵。

    图3

    第二步,以顶点B为中介点更新矩阵。

    图4

    第三步,以顶点C为中介点更新矩阵。

    图5

    第四步,以顶点D为中介点更新矩阵。

    图6

    第五步,以顶点E为中介点更新矩阵。

    图7

    第六步,以顶点F为中介点更新矩阵。

    图8

    第七步,以顶点G为中介点更新矩阵。

    图9

    public class Floyd {
        public static int max = 99999;
    
        public static void main(String[] args) {
            int[][] graph = {{0, 12, max, max, max, 16, 14},
                    {12, 0, 10, max, max, 7, max},
                    {max, 10, 0, 3, 5, 6, max},
                    {max, max, 3, 0, 4, max, max},
                    {max, max, 5, 4, 0, 2, 8},
                    {16, 7, 6, max, 2, 0, 9},
                    {14, max, max, max, 8, 9, 0}};
            floyd(graph);
            for (int i = 0; i < graph.length; i++) {
                for (int j = 0; j < graph.length - 1; j++) {
                    System.out.print(graph[i][j] + ",");
                }
                System.out.println(graph[i][graph.length - 1]);
            }
        }
    
        public static void floyd(int[][] graph) {
            for (int i = 0; i < graph.length; i++) {//  floyd。
                for (int j = 0; j < graph.length; j++) {
                    for (int k = 0; k < graph.length; k++) {
                        if (graph[j][i] + graph[i][k] < graph[j][k]) {
                            graph[j][k] = graph[j][i] + graph[i][k];
                        }
                    }
                }
            }
        }
    }
    

    弗洛伊德算法的时间复杂的O(n^3),n为顶点数。

    例子

    POJ 1062.
    POJ 1125.

    展开全文
  • 文件的绝对路径与相对路径

    千次阅读 2021-01-17 17:07:15
    1.绝对路径先说在本地计算机上,文件的绝对路径当然是指:文件在硬盘上真正存在的路径。例如这个路径:D:/wamp/www/img/icon.jpg告诉我们icon.jpg文件是在D盘的wamp目录下的img子目录中。我们不需要知道其...

    用DW写HTML的时候,可以直接选择到具体文件的路径,现在改用了webstorm,只能选择到与HTML文件同一目录下的文件。就此整理一下文件的绝对路径与相对路径的区别。

    1.绝对路径

    先说在本地计算机上,文件的绝对路径当然是指:文件在硬盘上真正存在的路径。

    例如这个路径:D:/wamp/www/img/icon.jpg告诉我们icon.jpg文件是在D盘的wamp目录下的img子目录中。我们不需要知道其他任何信息就可以根据绝对路径判断出文件的位置。

    注意:有时候编好的页面,在自己的计算机上浏览一切正常,但是上传到Web服务器上浏览就很有可能不会显示图片了。因为静态HTML页面需要上传到网站,而在网站的应用中,通常我们使用"/"来表示根目录,/img/icon.jpg就表示photo.jpg文件在这个网站的根目录上的img目录里。但是要知道,这里所指的根目录并不是你的网站的根目录,而是你的网站所在的Web服务器的根目录。因为上传到Web服务器上时,可能整个网站并没有放在Web服务器的D盘, 有可能是F盘或H盘。即使放在Web服务器的D盘里,Web服务器的E盘里也不一定会存在“D:/wamp/www/img”这个目录,因此在浏览网页时是不会显示图片的。这也是应用绝对路径的风险。

    2.相对路径

    相对路径,顾名思义就是自己相对与目标位置。

    假设你要引入文件的页面名称为test.htm,它存在叫www的文件夹里(绝对路径D:/wamp/www/test.htm),那么引用同时存在www文件夹里的“icon.jpg”文件(绝对路径D:/wamp/www/icon.jpg),同一目录下相对路径icon.jpg;如果文件“icon.jpg”存在img文文件夹中(绝对路径D:/wamp/www/img/icon.jpg),那么相对路径img/icon.jpg。

    相对路径可以避免上述根目录不同的问题。只要将网页文件及引用文件的相对位置与web服务器上文件相对位置保存一致,那么他们的相对路径也会一致。例如上面的例子,“test.htm” 文件里引用了“icon.jpg”图片,由于“icon.jpg”图片相对于“test.htm”来说,是在同一个目录的,那么只要这两个文件还是在同一个目录内,那么无论上传到Web服务器的哪个位置,在浏览器里都能正确地显示图片。

    注意:相对路径使用“/”字符作为目录的分隔字符,而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。由于“img”目录是“www”目录下的子目录,因此在“img”前不用再加上“/”字符。

    在 相对路径里常使用“../”来表示上一级目录。如果有多个上一级目录,可以使用多个“../”。假设 “test.htm”文件所在目录为“D:/wamp/www/test.htm”,而“icon.jpg”图片所在目录为“D:/wamp/www”,那 么“icon.jpg”图片相对于“test.htm”文件来说,是在其所在目录的上级目录里,则引用图片的语句应该为:

    icon.jpg

    假设 “test.htm”文件所在目录为“D:/wamp/www/test.htm”,而“icon.jpg”图片所在目录为“D:/wamp/www”,那 么“icon.jpg”图片相对于“test.htm”文件来说,是在其所在目录的上级目录里的子目录——“img”中,则引用图片的语句应该为:

    icon.jpg

    3.虚拟路径

    将文件上传到远程服务器后,这些文件驻留在服务器本地目录树中的某一个文件夹中。例如,在运行MicrosoftIIS的服务器上,主页的路径可能如下所示:c:\Inetpub\wwwroot\accounts\users\jsmith\index2.htm此路径通常称为文件的物理路径。但是,用来打开文件的URL并不使用物理路径。它使用虚拟目录,是对Http访问而言的,用户在浏览网站或FPT时显示的目录结构。例如你设置了E:\Website为访问目录,那么E:\Website为虚拟目录的根目录;E:\Website\Image,就变成了\Image. )。所以接上面的例子,虚拟路径可以写成

    icon.jpg

    整理一下

    “./” 代表当前目录 icon.jpg等同于icon.jpg

    “../” 代表上一级目录

    “/”   当前根目录,是相对目录;icon.jpg

    “~/”  Web 应用程序根目录。ASP.NET 启用了 Web 应用程序根目录运算符 (~),在服务器控件中指定路径时,可以使用该运算符。ASP.NET 会将 ~ 运算符解析为当前应用程序的根目录。可以结合使用 ~ 运算符和文件夹来指定基于当前根目录的路径。在该示例中,图像文件将从 Web 应用程序根目录下的 Images 文件夹中直接读取,无论该页面位于网站的什么位置。

    展开全文
  • 绝对路径:绝对路径是指文件在硬盘上真正存在的路径。例如“1.txt”这个文件是存放在硬盘的“C:\Users\15063\Desktop”目录下,那么 “1.txt”这个文档的绝对路径就是“C:\Users\15063\Desktop\1.txt”。 相对路径...
  • 什么是相对路径?相对路径的具体写法和用法

    万次阅读 多人点赞 2021-06-08 19:02:26
    之前,我们已经介绍了什么是绝对路径?绝对路径的具体写法和用法,今天,我们就一起来看看,有关相对路径的知识以及相对路径的具体写法和用法吧!什么是相对路径?相对路径是指以当前文件资源所在的目录为参照基础,...
  • SpringBoot获取项目文件的绝对路径和相对路径
  • 图论-路径优化算法总结

    千次阅读 2020-12-30 21:15:48
    目录 1:Dijkstra算法 1.1:算法思想 1.2:算法步骤 1.3:代码演示 ...迪杰斯特拉(Dijkstra)算法是典型的最短路径的算法,用来求得从起始点到其他所有点最短路径(单源最短路径)。该算法采用了贪心的思想
  • python绝对路径怎么写

    千次阅读 2020-12-03 00:54:19
    1. python中的“绝对路径”和“相对路径”如何理解相对路径是相对脚本文件来的。比如脚本在C:/python目录下,相同目录下有一个文件叫test.txt那么绝对路径就是 C:/python/test.txt,相对路径就是test.txt使用脚本 ...
  • #------------------------------------------------我是可耻的分割线-------------------------------------------文件有两个关键属性:“文件名”(通常写成一个单词)和“路径”。路径指明了文件在计算机上的位置...
  • 最短路径

    万次阅读 2019-09-10 16:16:07
    在带权图中,把一个顶点从v0到图中任意一个顶点vi的一条路径(可能不止一条)所经过边上的权值之和,定义为该路径的带权路径长度,把带权路几个长度最短的那条路径称为最短路径。 带权有向图的最短路径分为两类 : ...
  • 人工势场法 路径规划 matlab 国外的人写的

    千次下载 热门讨论 2016-01-07 21:00:11
    印度人写的matlab程序,附有详细的解释文档,界面友好,程序比较容易懂
  • 相对路径和绝对路径(带例子,详解)

    千次阅读 多人点赞 2019-10-14 11:02:30
    一、路径问题:在SpringMVC中可能涉及路径问题的地方。 //链接、表单提交、重定向和转发如何填写相应的路径。 <a href=""></a> <form action=""> response.sendRedirect("") request....
  • 文件路径写法

    千次阅读 2021-05-24 01:13:55
    在写代码的时候难免会用到一些外部文件,比如读档存档,比如图片音乐的加载,那么这些路径应该如何去写,下面简单介绍一下.这个代码用来测试文件是否打开成功,如果路径不正确就会显示打开失败.#includeint main(){FILE*...
  • 相对路径和绝对路径详解

    千次阅读 2020-07-10 17:18:21
    相对路径 例子 绝对路径 例子 给客户端浏览器使用 给服务器使用 相对路径 不以斜杠/开头。以点.开头的路径。比如 ./:当前目录 ../:后退以及目录 既不以/开头,也不以./开头的路径,默认为./开头,...
  • 学习笔记之——路径规划

    万次阅读 多人点赞 2020-03-03 12:17:04
    最近在做移动机器人路径规划相关的topic,打算对路径规划算法做一个调研,并写下这篇记录。本博文的大部分内容来源于网络的博客或者论文,相关的参考也会给出来。本博文仅作本人学习记录用。 ...
  • 图解迪杰斯特拉算法(最短路径问题)

    万次阅读 多人点赞 2021-02-06 11:36:22
    一、单源最短路径问题 如上图给定一个带权图 G = <V,E>,其中每条边(vi,vj)上的权 W[vi,vj] 是一个非负实数。另外,给定 V 中的一个顶点 s 充当源点。现在要计算从源点 s 到所有其他各顶点的最短路径,...
  • 路径规划算法简介

    千次阅读 2019-09-24 01:50:29
    路径规划算法简介 1.涉及问题: 这里的路径规划是指如何寻找一条从给定起点到终点的路径,使机器人沿该路径移动的过程中不与障碍物发生碰撞且路程最短或移动代价最小。 2.简要介绍的算法: 1.遗传算法; 2.模拟退火...
  • 路径跟踪算法之PID路径跟踪与PP跟踪

    千次阅读 热门讨论 2021-07-31 23:38:11
    低速无人驾驶领域主流的路径跟踪算法1路径跟踪原理2 常见的路径跟踪算法2.1 Pure puresuit(pp)纯跟踪2.2 PID 跟踪 1路径跟踪原理 在运用好的路径规划算法,规划好一条从起点到目标点最优的路径后,如何 让机器人来寻...
  • 路径规划五种算法简述及对比

    万次阅读 多人点赞 2021-01-11 10:34:35
    路径规划模块性能的高低直接关系车辆行驶路径选择的优劣和行驶的流畅度,而路径规划算法的性能优劣很大程度上取决于规划算法的优劣,如何在各种场景下迅速、准确的规划出一条高效路径且使其具备应对场景动态变化的...
  • 经常我们的程序中需要访问一些特殊的路径,比如程序所在的路径、用户目录路径、临时文件夹等。在 Qt 中实现这几个功能所用的方法虽然都不难,但是各不相同,每次用到时还要现去查,很不方便。因此就写了这篇博客,把...
  • 经常我们的程序中需要接见一些特殊的路径,好比程序所在的路径、用户目录路径、暂且文件夹等。在 Qt 中实现这几个功效所用的方式虽然都不难,然则各不相同,每次用到时还要现去查,很不利便。因此就写了这篇博客,把...
  • python相对路径和绝对路径总结

    千次阅读 多人点赞 2020-07-24 14:06:43
    Contents1 当前工作目录1.1 os.getcwd() 函数可用于获取当前工作目录1.2 os.chdir() 函数可用于获取当前工作目录2 相对路径和绝对路径3 python的os.path模块提供的路径相关函数3.1 os.getcwd() 函数:获取当前工作...
  •  绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:/xyz/test.txt 代表了test.txt文件的绝对路径。http://www.baidu.com/index.html也代表了一个URL绝对路径。绝对路径,...
  • Java动态规划实现最短路径问题

    万次阅读 多人点赞 2019-07-20 21:07:45
    给定一个加权连通图(无向的或有向的),要求找出从每个定点到其他所有定点之间的最短路径以及最短路径的长度。 2.1 动态规划法原理简介 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多...
  • C/C++ 最短路径-Dijkstra算法 (路径的保存和输出)

    千次阅读 多人点赞 2020-07-11 09:52:42
    一、最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。 ...
  • python学习笔记10.1 python中的路径

    万次阅读 2021-05-13 22:31:01
    获取文件所在的路径 1. '.'和os.getcwd() python中‘.’和os.getcwd()是等价的,是运行python文件的工作目录,而不是被运行的文件所在目录,它是随着工作目录变化的。 import os print('os.cwd: ',os.getcwd()) ...
  • 机器人运动路径规划方法

    千次阅读 2020-05-29 17:27:29
    机器人运动路径规划方法 来源:-- 编辑:创泽 时间:2020/3/10 机器人运动路径规划的性能指标包括:实时性、安全性和可达性等。在动态环境中,由于环境信息是时刻变化的,如果移动机器人实时性差,滞后于动态环境...
  • python的绝对路径和相对路径

    千次阅读 2021-08-31 13:09:40
    一、绝对路径

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,896,001
精华内容 2,358,400
关键字:

路径