各位老铁们,大家好,今天由我来为大家分享最优路线,以及最优路线规划算法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
本文目录
求最优路径的算法
以下是C写的广度优先的最短路径穷举法,希望对你有所帮助.
#include
#include
#include
#include
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
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
while(itor!=results.end())//寻找最小值
{
// cout<<"distanct="< 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" < cin>>choice; switch(choice) { case 1: cout< < break; case 2: cout< < break; case 3: cout< < break; case 4: cout< < break; case 5: flag1: cout<<"请输入路径的起点"< cin>>source; cout<<"请输入路径的终点"< cin>>termination; if((t1=Sight_Names.find(source,t1))==string::npos||(t2=Sight_Names.find(termination,t2))==string::npos) {//检查输入的数据是否含有非法字符 cerr<<"输入的路径结点不存在,请重新输入:"< goto flag1; } Find_Ways(source, termination, 0,"",0);//寻找所有可能解 Find_Best_Way();//在所有可能解中找到最优解 cout<<"最佳路径是:"<< Best_Path< <<"最小路程为(米):"<< MinDistanct< t1= 0;//恢复字符串下标,以支持下次查询 t2= 0; break; case 6: break; default: cerr<<"您的选择超出了范围,请重新输入:"< break; } }while(choice!=6); system("pause"); return 0; } 这里应该说的好几个路线怎么进行最优规划吧,现在主流地图导航只能一个地址一个地址的进行导航,如果碰到多个地址的话必须先要一个一个搜索出来在导航,根本不是大家想要的那种,这里给大家说一个路线规划的软件 优亮誉路达路线规划导航 大家可以通过某信的小程序进行搜索,他都可以一次性导入或者手动选取100个地址,然后进行一键规划,系统就会自动将所有的地址按照最佳顺序进行排列,非常的简单好用。 优路达路线规划 优路达路线规划 2.高德地图枣陪 高德地图也可以进行多点导航,但是没有办法智能排序 3.腾讯地图敬岩段 腾讯地图同高德地图,缺少智能排序的方法 运输管理系统(TMS),从名字可以看出来主要是管理整个供应链的运输任务的系统,包括了配送单据管理部分和配送部分,其中配送部分包含了车辆管理、运费态弯管理、排班、配送线路管理等等。这里只介绍最优配送线路的问题。 每个司机从库存仓库出发,需要配送多个配送点的货物,这些配送点都是随机给出,配送点个数也是随机的,可以说没有规律。所以需要通过算法快速的规划处司机本次配送任务的最优路线。 这么多算法如何去选择呢?结合现实场景,需要考虑下边几点因素: 考虑了一下用比较简单的分支限界法来做测试,发现效果不错,做了压测(模拟20多个节点计算能够很快出结果,耗时秒级别),满足要求,那么就上线运行,效果很不错,但是遇到一个问题,平时的运输任务都是少于8个节点,上周日遇到一个16个节点的运输任务,出不来结果了,比较了一下孙判差异,然后就开始排查。 做了一些测试,利用random的模拟数据能够很快速的出结果,但是用实际的作业任务确实出不来,基本上就是进入了死循环模式了。那就只能仔细查看算法了,发现分支限界法对于对称型TSP问题解决很容易,但是对于这种运输任务的TSP问题,几乎退化成了全排列遍历的方式,运算任务巨大,根本出不来结果。 找到问题就解决问题吧,然后选了另外一个相对简单的蚁群算法,在做则闭改相应的测试,秒出结果。为了保证结果准确,做了大量对比,由于这个是最优路线(理论上等价于最短路线),做了平滑上线的处理。 最短路线的问题其实在各个地方都能用到,比如快递配送的最短路线(更多的是快递员通过自己的经验,当然也可以根据算法来)、外卖送餐员的送餐路线(场景更复杂,需要考虑到饭店的饭菜准备时间等等);供应链也是一个很好的应用场景,很多的供应链公司或者如电商都有自己的配送线路优化,不过这些需要考虑很多的复杂因素。 本公司供应链配送管理随着规模增大,也需要考虑这些类似的问题,需要提供更优的算法来实现 PS:数学是基础 装个地图的APP在手机上就可以了,输入起点和终点,会自动推荐线路给你,还可以导航。 驾车路线:全程约圆陪1027.0公里 起点:遂川县 1.遂川县内驾车方案 1)从起点向正南方向出发,沿泉中路行驶140米,左转进入工农兵大道 2)沿工农兵蚂腔森大道行驶210米,右转进入川江北路 3)沿川江北路行驶170米,稍向右转进入川江南路 4)沿川江南路行驶1.3公里,左前方转弯进入井冈山大道 5)沿井冈山大道行驶2.4公里,直行进入井冈山大道 6)沿井冈山大道行驶210米,在第2个出口,朝规划路方向,左前方转弯进入茶圣大道 7)沿茶圣大道行驶540米,直行进入井冈山大道 8)沿井冈山大道行驶14.1公里,稍向右转上匝道 2.沿匝道行驶1.1公里,过遂川互通约570米后,直行进入大广高速公路 3.沿大广高速公路行驶86.1公里,朝吉安/南昌方向,稍向右转进入樟吉高速公路 4.沿樟吉高速公路行驶750米,直行进入樟吉高速公路 5.沿樟吉高速公路行驶105.4公里,朝南昌/上海/G60东方闷亩向,稍向左转进入沪昆高速公路 6.沿沪昆高速公路行驶1.5公里,过樟树枢纽,直行进入沪昆高速公路 7.沿沪昆高速公路行驶73.2公里,朝福州/鹰潭/上海/G60方向,稍向右转进入沪昆高速公路 8.沿沪昆高速公路行驶650米,过厚田枢纽约450米后,直行进入南昌绕城高速公路 9.沿南昌绕城高速公路行驶38.9公里,过昌东南枢纽,朝鹰潭/上海方向,稍向右转进入沪昆高速公路 10.沿沪昆高速公路行驶,过昌东南枢纽,直行进入沪昆高速公路 11.沿沪昆高速公路行驶512.2公里,朝嘉兴/G2501东段方向,稍向左转进入杭州绕城高速公路 12.沿杭州绕城高速公路行驶430米,过张家畈枢纽,直行进入杭州绕城高速公路 13.沿杭州绕城高速公路行驶36.3公里,过绕城东枢纽约1.4公里后,直行进入沪昆高速公路 14.沿沪昆高速公路行驶690米,直行进入杭州绕城高速公路 15.沿杭州绕城高速公路行驶2.6公里,直行进入沪昆高速公路 16.沿沪昆高速公路行驶420米,过沈士枢纽约160米后,直行进入沪昆高速公路 17.沿沪昆高速公路行驶43.6公里,过2号枢纽,朝上海方向,稍向右转进入杭州湾环线高速公路 18.沿杭州湾环线高速公路行驶1.1公里,过嘉兴枢纽,直行进入杭州湾环线高速公路 19.沿杭州湾环线高速公路行驶52.7公里,过松江科技园区七号河桥,稍向右转进入沪昆高速公路 20.沿沪昆高速公路行驶870米,过三号河桥,直行进入沪昆高速公路 21.沿沪昆高速公路行驶24.0公里,过南辅道桥约1.4公里后,直行进入沪闵高架路 22.沿沪闵高架路行驶1.2公里,过莘庄立交桥,直行进入沪闵高架路 23.上海市内驾车方案 1)沿沪闵高架路行驶6.8公里,过沪闵路一号桥,朝内环高架路/延安西路立交/南浦大桥方向,稍向右转上匝道 2)沿匝道行驶820米,过内环漕溪北路立交桥约210米后,直行进入内环高架路 3)沿内环高架路行驶2.7公里,过左侧的中粮大厦约1.3公里后,朝南北高架路/卢浦大桥/浦东机场方向,稍向右转进入内环鲁班路立交桥 4)沿内环鲁班路立交桥行驶730米,过内环鲁班路立交桥,右前方转弯进入南北高架路 5)沿南北高架路行驶540米,过右侧的兴城商务楼约2.0公里后,朝延安高架路/虹桥枢纽/外滩方向,稍向右转进入延安东路立交桥 6)沿延安东路立交桥行驶770米,过延安东路立交桥,朝西藏南路/人民路隧道方向,稍向右转上匝道 7)沿匝道行驶290米,直行进入延安东路 8)沿延安东路行驶240米,左转进入西藏中路 9)沿西藏中路行驶380米,左转进入人民大道 10)沿人民大道行驶180米,右转 11)行驶40米,到达终点 终点:上海市 好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!手机地图多点导航如何设置最优路线
运输管理系统司机最优配送线路问题
想从一个地方到另一个地方,怎么找最优路线比如遂川到上海
还没有评论,来说两句吧...