最优路径
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于Dijkstra算法的基础是平面网络拓扑模型,因此当计算网络的节点数目较大时,计算的时间将急剧膨胀。为了快速地搜索到最优路径,基于分层网络拓扑结构(HiTopo),提出了双向分层搜索最优路径算法(BHW A);该算法对现有分层路径算法进行了以下两点改进(1)将分级网络的局部连通性作为划分子图的指标;(2)在路径计算过程中,使用弧段作为搜索目标,并采取了双向搜索策略。通过北京道路数据的实验表明该算法在保持分层路径算法高效性的基础上,还提高了路径搜索结果的准确性;通过进一步研究表明,如果使用启发式搜索来对算法进行优化,则可以使算法的速度有更大的提升。
1、把原来用于存放已处理节点的堆栈改为(store_queue)队列,这样在从
sort_queue队列出列时可直接放入store_queue中。
2、解除了地图大小的限制(如果有64K内存限制时,地图大小只能是180x180)
3、删除了原程序中的一些冗余,见程序中的注释。
4、程序继续使用dis_map数组保存各点历史历史最佳距离,也包含了某点是否已经
经过的信息,虽然这样做可能会比使用链表多用一些内存,但是在搜索时可以
节省不时间。
5、程序更具有实用性,可直接或修改后运用于你的程序中,但请你使用该代码后
应该返回一些信息给我,如算法的改进或使用于什么程序等。
本程序可以用Borland C++或DJGPP编译,并附带有一个数据文件map.dat,
保存有地图的数据,(注:该地图文件格式与风云的原代码的地图格式不一样)
算法描述:
findpath()
{
把S点加入树根(各点所在的树的高度表示从S点到该点所走过的步数);
把S点加入排序队列(按该点到E点的距离排序+走过的步数从小到大排序);
1、排序队列sort_queue中距离最小的第一个点出列,并保存入store_queue中
2、从出列的点出发,分别向4个(或8个)方向中的一个各走出一步
3、并估算第2步所走到位置到目标点的距离,并把该位置加入树,
最后把该点按距离从小到大排序后并放入队列中。(由trytile函数实现)。
4、如果该点从四个方向上都不能移动,则把该点从store_queue中删除
5、回到第一点,直到找到E点则结束
从目标点回溯树,直到树根则可以找到最佳路径,并保存在path[]中
}
-------------------------------------------------------------------------*/
//#define NDEBUG
#include
#include
#include
#include
#include
#define tile_num(x,y) ((y)*map_w+(x)) //将x,y 坐标转换为地图上块的编号
#define tile_x(n) ((n)%map_w) //由块编号得出x,y 坐标
#define tile_y(n) ((n)/map_w)
#define MAPMAXSIZE 180 //地图面积最大为180x180,如果没有64K内存限制可以更大
#define MAXINT 32767
//树结构, 比较特殊, 是从叶节点向根节点反向链接,方便从叶节点找到根节点typedef struct tree_node *TREE;
struct tree_node {
int h; //节点所在的高度,表示从起始点到该节点所有的步数
int tile; //该节点的位置
TREE father; //该节点的上一步
};
//链接结构,用于保存处理过的和没有处理过的结点
typedef struct link_node *LINK;
struct link_node {
TREE node;
int f;
LINK next;
};
LINK sort_queue; // 保存没有处理的行走方法的节点
LINK store_queue; // 保存已经处理过的节点(搜索完后释放)
unsigned char * map; //地图数据
unsigned int * dis_map; //保存搜索路径时,中间目标地最优解
int map_w,map_h; //地图宽和高
int start_x,start_y,end_x,end_y; //地点,终点坐标
// 初始化队列
void init_queue(void)
{
sort_queue=(LINK)malloc(sizeof(*sort_queue));
sort_queue->node=NULL;
sort_queue->f=-1;
sort_queue->next=(LINK)malloc(sizeof(*sort_queue));
sort_queue->next->node=NULL;
sort_queue->next->f=MAXINT;
sort_queue->next->next=NULL;
store_queue=(LINK)malloc(sizeof(*store_queue));
store_queue->node=NULL;
store_queue->f=-1;
store_queue->next=NULL;
}
// 待处理节点入队列, 依靠对目的地估价距离插入排序
void enter_queue(TREE node,int f)
{
LINK p=sort_queue,father,q;
while(f>p->f) {
father=p;
p=p->next;
assert(p);
}
q=(LINK)malloc(sizeof(*q));
assert(sort_queue);
q->f=f,q->node=node,q->next=p;
father->next=q;
}
// 将离目的地估计最近的方案出队列
TREE get_from_queue(void)
{
LINK bestchoice=sort_queue->next;
LINK next=sort_queue->next->next;
sort_queue->next=next;
bestchoice->next=store_queue->next;
Top
3 楼keikei007(keikei)回复于2004-06-21 19:16:02 得分0 store_queue->next=bestchoice;
return bestchoice->node;
}
// 释放栈顶节点
void pop_stack(void)
{
LINK s=store_queue->next;
assert(s);
store_queue->next=store_queue->next->next;
free(s->node);