最短最优升级路径|魔兽世界最快升级路线方法

Ⅰ 最短路径问题有几种方法

在最短的路径中,一般都是2点确定一条直线,直线是应该走的最短。

Ⅱ 路径分析的最优路径分析方法

1.道路预处理进行道路数据录入时,往往在道路的交叉接合处出现重叠或相离的情况,不宜计算机处理。因此,需要对原始数据进行预处理,使道路接合符合处理要求。进行预处理时,取每条线段的首末节点坐标为圆心,以给定的阈值为半径作圆域,判断其他线段是否与圆域相交,如果相交,则相交的各个线对象共用一个节点号。2.道路自动断链对道路进行预处理之后即可获得比较理想的数据,在此基础上再进行道路的自动断链。步骤如下:(1)取出所有线段记录数n,从第一条线段开始;(2)找出所有与之相交的线段并求出交点数m;(3)将m个交点和该线段节点在判断无重合后进行排序;(4)根据交点数量,该线段被分成m+1段;(5)第一段在原始位置不变,后m段从记录尾开始递增;(6)重复(2)~(5),循环至n。3.节点匹配拓扑关系需使用统一的节点。节点匹配方法是按记录顺序将所有线段的始末点加上相应节点号,坐标相同的节点共用一个节点号,与前面所有线段首末点都不相同的节点按自然顺序递增1。4.迪杰克斯特拉(Dijkstra)算法经典的图论与计算机算法的有效结合,使得新的最短路径算法不断涌现。目前提出的最短路径算法中,使用最多、计算速度比较快,又比较适合于计算两点之间的最短路径问题的数学模型就是经典的Dijkstra算法。该算法是典型的单源最短路径算法,由Dijkstra EW于1959年提出,适用于所有弧的权均为非负的情况,主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。该算法的基本思想是:认为两节点间最佳路径要么是直接相连,要么是通过其他已找到的与起始点的最佳路径的节点中转点。定出起始点P0后,定能找出一个与之直接相连且路径长度最短的节点,设为P1,P0到P1就是它们间的最佳路径。Dijkstra算法的基本流程如下:首先将网络中所有节点分成两组,一组包含了已经确定属于最短路径中点的集合,记为S(该集合在初始状态只有一个源节点,以后每求得一条最短路径,就将其加入到集合S中,直到全部顶点都加入到S中,算法就结束了);另一组是尚未确定最短路径的节点的集合,记为V,按照最短路径长度递增的次序依次把第二组的顶点加入到第一组中,在加入的过程中总保持从源点到S中各顶点的最短路径长度不大于从源点到V中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点距离就是从源点到此顶点的最短路径长度,V中的顶点距离是从源点到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

Ⅲ 求最优路径的算法

以下是C写的广度优先的最短路径穷举法,希望对你有所帮助.#include <iostream> #include <string> #include <vector> #include <map> using namespace std; #define SIGHTS 4 //自定义景点个数为4,以后可以扩充 class Sight //景点类信息,以后可以扩充 { public: Sight(string name, string sd) { sname = name; sight_detial = sd; } string Sight_Name() { return sname; } string Sight_detial() { return sight_detial; } protected: string sname; //景点名称 string sight_detial; //景点备注 }; struct SI { string sname; //景点名称 int index; //景点编码 }; SI SightInfo[SIGHTS]; map<int, string>results; //距离与路径的映射结构体,可以动态扩充 vector<Sight> sights; //VECTOR向量保存景点信息,目前的作用只是保存 //但是其强大的功能完全可以应付以后的功能扩充 int MinDistanct = 50000; //假定最小距离为一个很大的值 string Sight_Names = "枫林园蛟桥园青山园麦庐园 "; //目标字符串 string Best_Path; //保存最佳路径的STRING字符串 int DISTANCE[4][4] = { //查找表,用于储存接点之间距离的信息 0, 1500, 2500, 2400, 1500, 0, 800, 0, 2500, 800, 0, 200, 2400, 0, 200, 0 }; bool connect[4][4] = { //查找表,用于储存接点之间连通的信息 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 }; void InitSights() { //初始化景点的各类信息 SightInfo[0].index=0; SightInfo[0].sname = "麦庐园"; SightInfo[1].index=1; SightInfo[1].sname = "枫林园"; SightInfo[2].index=2; SightInfo[2].sname = "蛟桥园"; SightInfo[3].index=3; SightInfo[3].sname = "青山园"; Sight s1("枫林园", "枫林园以计算机系的理工科学生为主,是江西财经大学的唯一一个计算机学院"); sights.push_back(s1); Sight s2("蛟桥园", "蛟桥园是江西财经大学的会计、贸易等财务教学为主的教学楼群,为本部"); sights.push_back(s2); Sight s3("青山园", "青山园是江西财经大学的会计、贸易等财务教学为主的学生的宿舍群"); sights.push_back(s3); Sight s4("麦庐园", "麦庐园是江西财经大学的外语、艺术等人文科学为主的学习园地"); sights.push_back(s4); } void Find_Ways(string start, string end, int DIST, string path, int depth) { //递归调用,逐层寻找可连通的路径,并以该路径继续重复循环查找,根据分析可以 //知道,所有最优解即最短路径所经过的接点数目必定小于N,于是采用广度优先遍历, //设置count为循环深度,当count大于SIGHTS时退出循环 int count = 1; int i,j; int start1 = 0,end1 = 0; int distanct = 0, storeDist = 0; string temp, target, pathway, storePath; //临时储存体,用于恢复递归调用后会 //改变的数据,以便之后无差别使用 count += depth; if(count > SIGHTS) return; distanct += DIST; //距离累加 if(path=="") //第一次时,pathway初始化为第一个接点名称 { pathway = start; pathway += "=>"; } if(path!="") pathway = path; storeDist = distanct; //填充临时储存值 storePath = pathway; for(i = 0; i < SIGHTS; ++i) //通过遍历,查找景点名称对应的编号 { if(start == SightInfo[i].sname) start1 = SightInfo[i].index; if(end == SightInfo[i].sname) end1 = SightInfo[i].index; } for(i = 0; i < SIGHTS; i++) //算法核心步骤 { if(connect[start1][i] != 0) { if(i==end1) //如果找到了一条路径,则保存之 { distanct += DISTANCE[start1][end1]; for(j = 0; j < SIGHTS; ++j) { if(end1==SightInfo[j].index) target = SightInfo[j].sname; } pathway += target; results.insert(make_pair(distanct, pathway)); //保存结果路径信息 distanct = storeDist; //恢复数据供下次使用 pathway = storePath; } else //分支路径 { for(j = 0; j < SIGHTS; ++j) { if(i==SightInfo[j].index) temp = SightInfo[j].sname; } pathway += temp; pathway += "=>"; distanct += DISTANCE[start1][i]; Find_Ways(temp, end, distanct, pathway, count); //以该连通的分支 //路径继续递归调用,查找子层路径信息。 distanct = storeDist; //恢复数据 pathway = storePath; } } } } void Find_Best_Way() { //该函数建立在上述函数执行完毕之后,在map映射结构中通过对比每条路径的长度,来 //选择最优解 map<int, string>::iterator itor = results.begin(); while(itor!=results.end()) //寻找最小值 { // cout<<"distanct = "<<itor->first<<endl; if(itor->first < MinDistanct) MinDistanct = itor->first; itor++; } itor = results.begin(); while(itor!=results.end()) //寻找最小值所对应的整个路径字符串 { if(itor->first == MinDistanct) Best_Path = itor->second; itor++; } } int main(int argc, char *argv[]) { int choice; size_t t1=0,t2=0; string source, termination; InitSights(); do{ cout<<"////////////////////////////////////////////////////////\n" <<"**** 请输入您所需要的服务号码: ********\n" <<"**** 1.枫林园介绍 ********\n" <<"**** 2.蛟桥园介绍 ********\n" <<"**** 3.青山园介绍 ********\n" <<"**** 4.麦庐园介绍 ********\n" <<"**** 5.查询地图路径 ********\n" <<"**** 6.退出查询系统 ********\n" <<"////////////////////////////////////////////////////////\n" <<endl; cin>>choice; switch(choice) { case 1: cout<<sights[0].Sight_Name()<<endl <<sights[0].Sight_detial()<<endl; break; case 2: cout<<sights[1].Sight_Name()<<endl <<sights[1].Sight_detial()<<endl; break; case 3: cout<<sights[2].Sight_Name()<<endl <<sights[2].Sight_detial()<<endl; break; case 4: cout<<sights[3].Sight_Name()<<endl <<sights[3].Sight_detial()<<endl; break; case 5: flag1: cout<<"请输入路径的起点"<<endl; cin>>source; cout<<"请输入路径的终点"<<endl; cin>>termination; if((t1=Sight_Names.find(source,t1))==string::npos || (t2=Sight_Names.find(termination,t2))==string::npos) { //检查输入的数据是否含有非法字符 cerr<<"输入的路径结点不存在,请重新输入:"<<endl; goto flag1; } Find_Ways(source, termination, 0, "",0); //寻找所有可能解 Find_Best_Way(); //在所有可能解中找到最优解 cout<<"最佳路径是:"<< Best_Path <<endl <<"最小路程为(米):"<< MinDistanct<<endl; t1 = 0; //恢复字符串下标,以支持下次查询 t2 = 0; break; case 6: break; default: cerr<<"您的选择超出了范围,请重新输入:"<<endl; break; } }while(choice!=6); system("pause"); return 0; }

Ⅳ 最短路径的介绍

用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Ⅳ 最短路径算法

Dijkstra算法,A*算法和D*算法Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式,Drew为了和下面要介绍的 A* 算法和 D* 算法表述一致,这里均采用OPEN,CLOSE表的方式。大概过程:创建两个表,OPEN, CLOSE。OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。1. 访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。2. 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。3. 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。4. 重复2,3,步。直到OPEN表为空,或找到目标点。提高Dijkstra搜索速度的方法很多,常用的有数据结构采用Binary heap的方法,和用Dijkstra从起始点和终点同时搜索的方法。A*(A-Star)算法是一种启发式算法,是静态路网中求解最短路最有效的方法。公式表示为: f(n)=g(n)+h(n), 其中f(n) 是节点n从初始点到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。估价值与实际值越接近,估价函数取得就越好。例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。conditions of heuristicOptimistic (must be less than or equal to the real cost)As close to the real cost as possible主要搜索过程:创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->While(OPEN!=NULL){从OPEN表中取估价值f最小的节点n;if(n节点==目标节点) break;else{if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值if( X的估价值小于OPEN表的估价值 ) 更新OPEN表中的估价值; //取最小路径的估价值if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值if( X的估价值小于CLOSE表的估价值 ) 更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值if(X not in both)求X的估价值; 并将X插入OPEN表中; //还没有排序}将n节点插入CLOSE表中;按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。}A*算法和Dijistra算法的区别在于有无估价值,Dijistra算法相当于A*算法中估价值为0的情况。动态路网,最短路算法 D*A* 在静态路网中非常有效(very efficient for static worlds),但不适于在动态路网,环境如权重等不断变化的动态环境下。 D*是动态A*(D-Star,Dynamic A*) 卡内及梅隆机器人中心的Stentz在1994和1995年两篇文章提出,主要用于机器人探路。是火星探测器采用的寻路算法。主要方法:1.先用Dijstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h。每个节点包含上一节点到目标点的最短路信息1(2),2(5),5(4),4(7)。则1到4的最短路为1-2-5-4。原OPEN和CLOSE中节点信息保存。2.机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijstra计算出的最短路信息从出发点向后追述即可,当在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中,方法如下: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值大小进行排序;}机器人利用第一步Dijstra计算出的最短路信息从a点到目标点的最短路经进行。D*算法在动态环境中寻路非常有效,向目标点移动中,只检查最短路径上下一节点或临近节点的变化情况,如机器人寻路等情况。对于距离远的最短路径上发生的变化,则感觉不太适用。

Ⅵ 什么是最短路径和最佳路径

最短路径就是两点间的直线,但是实际情况是两点间可能有很多的障碍物,或者最短路径上可能堵车,或者路况不好,在所有的路径中,肯定有一条最佳的路径。

Ⅶ "最短路径优先算法"的优缺点

这个算法一般出现在网络中,用于路由器的路由寻址,我也只了解这方面的优缺点。如果不对,LZ就别看了。所谓最短路径,实际上说的是跳数。比如从一条路走会经过三个路由器,而从另一条路走,会经过两个路由器,那么此算法会判断2跳比3跳要短,但具体每一跳会花多长时间,经过多长路程,它不会考虑的。所以不一定算法的最短路径就是真实的最短。因为很多因素算法没有考虑,比如通信质量,网线长度……C语言我只看过一个模拟现实的例子,大概是说公车走什么路线长度最短,那个算法考虑的是路线的长短,而不是跳数,优点当然就是路线的绝对最短,缺点就是没考虑到其他现实因素,比如是否堵车(相当于网络通信质量)之类。总之不管什么算法,考虑到的因素就是它的优点,反过来说,缺点往往就是算法忽略的因素。补充一下,如果说的不是算法本身的优劣,而是细节的实现方面,那就是从时间复杂度和空间复杂度两个方面去考虑了,希望对LZ有用。

Ⅷ 魔兽世界最快升级路线方法

首先佩服你的勇气 具体几级到几级忘了很久没练小号了 希望采纳1-15老老实实做任务升级。 15-70可以拍随机副本。前期升级速度很快,最好拍随机到40级(学大马),这时候你看野外做任务安全不安全,要是熟悉任务线而且练级安全的话还是做任务速度快,否则还是随机副本到70吧(67之后你就排指定副本,看哪个副本没去过就去哪个,因为副本里面有任务经验也不低,但是暴雪总是让你拍重复的副本,所以还是拍指定的好,这样所有的本打完基本上就70了)。70-80就去诺森德,从幽暗城或者奥格坐飞艇过去(LM的话就是暴风城和米奈希尔港),记得学完飞行再去,这个时候做任务就比随机副本快了,但是副本里面的任务经验高还有装备,所以要把没去过的副本拍个指定打一遍。80-85思路跟前面一样,只不过现在先去去海山或着瓦斯琪尔了,,因为现在是90满级了,没必要追求85的声望,你就看等级够了就换地图做任务,追求最高经验。85之后就可以去潘达利亚了,这个时候还是老老实实做任务升级吧,跟着任务线走,因为要开各种声望,任务是必须做的,辅助性的排下副本,可以拍DPS(dps拍的速度慢,好做任务)。 以上是自己练级的路线,下面说下有大号带的情况:1-10级新手村 10-20影牙 20-42 血色 42-57 斯坦索姆 57-62 地狱火城墙 62-66 奴隶围栏 66-68能源舰 69-80艾卓 之后还是老老实实任务和随即副本吧。 另:组队有经验加成,高等级会吸收低等级的经验,所以你可以组一些比小号等级低的经验宝宝。招募号最好,3倍经验。不过不推荐大号带小号,现在80以下升级的经验要求很低,而且开大号带的话相比从前砍掉了好多经验,还总是爆本。

Ⅸ 最短路径优先算法

从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等。

Ⅹ wow部落的详细升级路线

1、30级:奥特兰克山脉

痛苦药剂任务→赫尔库拉的复仇任务→杀霜喉雪回人任务→塔伦答米尔→落锤之战任务→阿拉希高地

2、34-35级:荆棘谷

藏宝海湾(接所有任务)→格罗姆高营地(接所有任务)→奈辛瓦里远征队营地→巨魔之敌任务→幽暗城(科纳塔一家任务)→落锤镇

3、35-37:阿拉希高地

激流堡符印任务→短兵相接任务→被困的公主任务→禁锢之石任务→迅猛龙的狡诈任务→邪恶的魔法任务→交完任务,飞塔伦米尔。

4、37-38:尘泥沼泽

塞拉摩间谍任务→黑色盾牌任务→黎明奔跑者任务→加尔和蜘蛛眼任务→伊格纳兹的逃亡任务→塞拉摩码头任务→交完任务,坐船去藏宝海湾。

5、38-40:荆棘谷

血帆海盗任务→吓唬病鬼任务→蓝色歌唱水晶任务→格罗姆高营地→莫克萨尔丁任务→马尔格的嘱托任务(需先完成兽人头颅任务)→回藏宝海湾交齐任务→回格罗姆高营地交齐任务


赞 (0)