MATLAB如何实现改进的DIJKSTRA算法?

cuifeitao 2010-03-01 03:05:31
急需DIJKSTRA算法源码和改进的DIJKSTRA算法源码,谢谢!
...全文
255 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzy18lzy 2010-03-01
  • 打赏
  • 举报
回复
主要有三个要点:

1.堆顶点册除后,堆要修改,把堆最后的节点放第一个节点,然后向下比较修改

list[1] = list[len]; //删除堆顶点
len--; //修改堆的下限

for(i=1;i<=len;i = j)//向下修改堆(修改了顶点)
{
j = i;
if(i*2<=len)
{
if(list[j].G>list[i*2].G) j = i*2;
}

if(i*2+1<=len)
{
if(list[j].G>list[i*2+1].G) j = i*2+1;
}
if(i==j) break;
else changlist(i,j);
}


2.扩展节点值修改后,堆要修改,这个直接向上比较修改

for(i=h;i>1;i=i/2)//修改堆中节点值
{
if(list[i].G<list[i/2].G) changlist(i,i/2);
else break;
}


3.堆中的节点与原矩阵座标的对应

index_list[list[a].index] = a;
index_list[list[b].index] = b;
lzy18lzy 2010-03-01
  • 打赏
  • 举报
回复
这是上边题通过的代码,以前写的,命名有点怪,呵呵,见谅


#include<math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 50

struct node{
int G;
int index;
}list[MAX*MAX+8],xchang;


char hash[256];
char flag[MAX*MAX+8];

int save[MAX+1][MAX+1];
int index_list[MAX*MAX+8];

int move[4][2] = {1,0,0,1,-1,0,0,-1};

void changlist(int a,int b)
{
xchang = list[a];
list[a] = list[b];
list[b] = xchang;
index_list[list[a].index] = a;
index_list[list[b].index] = b;
}


int DIJKSTRA(int x1,int y1,int x2,int y2,int R,int S)
{
int i,j,k,x,y,h;
int value,pos,from,to,len;
memset(flag,0,sizeof(char)*(R*S+8));


to = (x2-1)*S+y2;
from = (x1-1)*S+y1;
changlist(1,from);
list[1].G = 0;
len = R*S - 1;

while(list[1].index != to)
{
value = list[1].G;
pos = list[1].index;
flag[pos] = 1;
x = (pos-1)/S;
y = (pos-1)%S;

list[1] = list[len]; //删除堆顶点
len--; //修改堆的下限

for(i=1;i<=len;i = j)//向下修改堆(修改了顶点)
{
j = i;
if(i*2<=len)
{
if(list[j].G>list[i*2].G) j = i*2;
}

if(i*2+1<=len)
{
if(list[j].G>list[i*2+1].G) j = i*2+1;
}
if(i==j) break;
else changlist(i,j);
}

for(k=0;k<4;k++) //扩展下一层节点
{
if(x+move[k][0] >=0 && x+move[k][0] < R
&& y+move[k][1] >=0 && y+move[k][1] <S)
{
h = (x+move[k][0])*S+y+move[k][1] + 1;
if(flag[h] == 0)
{
h = index_list[h];
if(value + save[x+move[k][0]][y+move[k][1]] < list[h].G)
{
list[h].G = value + save[x+move[k][0]][y+move[k][1]];
for(i=h;i>1;i=i/2)//修改堆中节点值
{
if(list[i].G<list[i/2].G) changlist(i,i/2);
else break;
}
}
}
}
}
}
return list[1].G;
}

int main()
{
char t[2];
int i,j;
int m,r,s;
int x1,y1,x2,y2;
hash['G'] = 5; hash['M'] = 10; hash['S'] = 20;
while(scanf("%d",&m)!=EOF)
{
while(m--)
{
scanf("%d%d",&r,&s);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
scanf("%s",t);
save[i][j] = hash[t[0]];
}
}

for(i=1;i<=r*s;i++)
{
list[i].index = i;
list[i].G = 0x7fffffff;
index_list[list[i].index] = i;
}

printf("%d\n",DIJKSTRA(x1,y1,x2,y2,r,s));
}
}
return 0;
}

cuifeitao 2010-03-01
  • 打赏
  • 举报
回复
恩,谢谢楼上的,不过用MATLAB实现堆查找,来改进DIJKSTRA算法,我试验了很多次还是没法成功,希望能参考相关的源代码,谢谢!
lzy18lzy 2010-03-01
  • 打赏
  • 举报
回复
lzy18lzy 2010-03-01
  • 打赏
  • 举报
回复
DIJKSTRA算法的改进,常见的方法是建立堆查找,可以更快的找到下一个要取的最小值节点(堆顶点),

得到当前节点时候,扩展下一层节点时候,就修改移动堆中的值,这样每次只取堆的顶节点作为当前

节点,不断的扩展下去,到取到目的节点,就结束...

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧