MATLAB的迪杰斯特拉算法求7个起始点到15个终点的最短路径!

作者&投稿:关劳 (若有异议请与网页底部的电邮联系)
如何用matlab实线Dijkstra算法从一点到其他各点的最短路径?~

可以用C语言编啊
下面就是C程序
#include"stdio.h"
#include "malloc.h"
#define maxium 32767
#define maxver 9
#define OK 1
struct Point
{
char vertex[3];
struct Link *work;
struct Point *next;
};
struct Link
{
char vertex[3];
int value;
struct Link *next;
};
struct Table
{
int cost;
int Known;
char vertex[3];
char path[3];
struct Table *next;
};
int Dijkstra(struct Point *,struct Table *);
int PrintTable(int,struct Table *);
int PrintPath(int,struct Table *,struct Table *);
struct Table * CreateTable(int,int);
struct Point * FindSmallest(struct Table *,struct Point *);/*Find the vertex which has the smallest value reside in the table*/
int main()
{
int i,j,num,temp,val;
char c;
struct Point *poinpre,*poinhead,*poin;
struct Link *linpre,*linhead,*lin;
struct Table *tabhead;
poinpre=poinhead=poin=(struct Point *)malloc(sizeof(struct Point));
poin->next=NULL;
poin->work=NULL;
restart:
printf("Notice:if you wanna to input a vertex,you must use the format of number!
");
printf("Please input the number of Points:
");
scanf("%d",&num);
if(num>maxver||num<1||num%1!=0)
{
printf("
Number of Points exception!");
goto restart;
}
for(i=0;i<=num;)
{
printf("Please input the Points next to point %d,end with 0:
",i+1);
poin=(struct Point *)malloc(sizeof(struct Point));
poinpre->next=poin;
poin->vertex[0]='v';
poin->vertex[1]='0'+i+1;
poin->vertex[2]='\0';
linpre=lin=poin->work;
linpre->next=NULL;
for(j=0;j ;){
printf("The number of the %d th vertex linked to vertex %d:",j+1,i+1);
scanf("%d",&temp);
if(temp==0)
{
lin->next=NULL;
break;
}
else
{
lin=(struct Link *)malloc(sizeof(struct Link));
linpre->next=lin;
lin->vertex[0]='v';
lin->vertex[1]='0'+temp;
lin->vertex[2]='\0';
printf("Please input the value betwixt %d th Point towards %d th Point:",i+1,temp);
scanf("%d",&val);
lin->value=val;
linpre=linpre->next;
lin->next=NULL;
}
}
poinpre=poinpre->next;
poin->next=NULL;
}
printf("Please enter the vertex where Dijkstra algorithm starts:
");
scanf("%d",&temp);
tabhead=CreateTable(temp,num);
Dijkstra(poinhead,tabhead);
PrintTable(temp,tabhead);
return OK;
}
struct Table * CreateTable(int vertex,int total)
{
struct Table *head,*pre,*p;
int i;
head=pre=p=(struct Table *)malloc(sizeof(struct Table));
p->next=NULL;
for(i=0;i ;){
p=(struct Table *)malloc(sizeof(struct Table));
pre->next=p;
if(i+1==vertex)
{
p->vertex[0]='v';
p->vertex[1]='0'+i+1;
p->vertex[2]='\0';
p->cost=0;
p->Known=0;
}
else
{
p->vertex[0]='v';
p->vertex[1]='0'+i+1;
p->vertex[2]='\0';
p->cost=maxium;
p->Known=0;
}
p->next=NULL;
pre=pre->next;
}
return head;
}
int Dijkstra(struct Point *p1,struct Table *p2) /* Core of the programm*/
{
int costs;
char temp;
struct Point *poinhead=p1,*now;
struct Link *linna;
struct Table *tabhead=p2,*searc,*result;
while(1)
{
now=FindSmallest(tabhead,poinhead);
if(now==NULL)
break;
result=p2;
result=result->next;
while(result!=NULL)
{
if(result->vertex[1]==now->vertex[1])
break;
else
result=result->next;
}
linna=now->work->next;
while(linna!=NULL) /* update all the vertexs linked to the signed vertex*/
{
temp=linna->vertex[1];
searc=tabhead->next;
while(searc!=NULL)
{
if(searc->vertex[1]==temp) /*find the vertex linked to the signed vertex in the table and update*/
{
if((result->cost+linna->value)cost)
{
searc->cost=result->cost+linna->value;/*set the new value*/
searc->path[0]='v';
searc->path[1]=now->vertex[1];
searc->path[2]='\0';
}
break;
}
else
searc=searc->next;
}
linna=linna->next;
}
}
return 1;
}
struct Point * FindSmallest(struct Table *head,struct Point *poinhead)
{
struct Point *result;
struct Table *temp;
int min=maxium,status=0;
head=head->next;
poinhead=poinhead->next;
while(head!=NULL)
{
if(!head->Known&&head->cost)
{
min=head->cost;
result=poinhead;
temp=head;
status=1;
}
head=head->next;
poinhead=poinhead->next;
}
if(status)
{
temp->Known=1;
return result;
}
else
return NULL;
}
int PrintTable(int start,struct Table *head)
{
struct Table *begin=head;
head=head->next;
while(head!=NULL)
{
if((head->vertex[1]-'0')!=start)
PrintPath(start,head,begin);
head=head->next;
}
return OK;
}
int PrintPath(int start,struct Table *head,struct Table *begin)
{
struct Table *temp=begin->next,*p,*t;
p=head;
t=begin;
if((p->vertex[1]-'0')!=start&&p!=NULL)
{
while(temp->vertex[1]!=p->path[1]&&temp!=NULL)
temp=temp->next;
PrintPath(start,temp,t);
printf("%s",p->vertex);
}
else
if(p!=NULL)
printf("
%s",p->vertex);
return OK;
}


具体证明请参考《算法导论》单源最短路那一章

你对图论的知识有了解吧~W是关联矩阵,s和t分别是起始点和终止节点的序号。返回的d为最短的加权路径长度,p为最优路径节点的序号向量。注意,这里W矩阵为0的点权值已经自动设为无穷大了。请参考《高等应用数学问题的 MATLAB一书》。我吧程序赋给你。
你做一个M函数用吧。
function [d,path]=dijkstra(W,s,t)
[n,m]=size(W);ix=(W==0);W(ix)=inf;
if n~=m,error('Square W required');end
visited(1:n)=0; dist(1:n)=inf;parent(1:n)=0;dist(s)=0;d=inf;
for i=1:(n-1),%求出每个节点与起始点的关系
ix=(visited==0);vec(1:n)=inf;vec(ix)=dist(ix);
[a,u]=min(vec);visited(u)=1;
for v=1:n,if (W(u,v)+dist(u)<dist(v)),
dist(v)=dist(u)+W(u,v);parent(v)=u;
end;end;end
if parent(t)~=0,path=t;d=dist(t);%回溯最短路径
while t~=s,p=parent(t);path=[p path];t=p;end;
end;
希望对你有用

你看看这个:
http://zhidao.baidu.com/question/177028260.html

分别执行7次dijkstra。


武进区15959463991: MATLAB的迪杰斯特拉算法求7个起始点到15个终点的最短路径! -
植乔双黄: 你对图论的知识有了解吧~W是关联矩阵,s和t分别是起始点和终止节点的序号.返回的d为最短的加权路径长度,p为最优路径节点的序号向量.注意,这里W矩阵为0的点权值已经自动设为无穷大了.请参考《高等应用数学问题的 MATLAB一书...

武进区15959463991: 迪杰斯特拉算法 matlab 哪个函数 -
植乔双黄: %单源点最短路径Dijkstra算法实现 function [d index1 index2] = Dijkf(a)% a 表示图的权值矩阵% d 表示所求最短路的权和% index1 表示标号顶点顺序% index2 表示标号顶点索引%参数初始化 M= max(max(a)); pb(1:length(a))= 0; % 标记向量,...

武进区15959463991: 怎样用matlab编程实现Dijkstra算法 -
植乔双黄: function [d,index1,index2]=Dijkf(a)%两点间最短距离的Dijkstra算法% a表示图的权值矩阵% d表示所求最短路的权和% index1 表示标号顶点的顺序% index2 表示标号顶点索引% 起始点为第一个点%参数初始化 M=max(max(a)); pb(1:length(a))=0; ...

武进区15959463991: 请教matlab Dijkstra算法问题!
植乔双黄: 你的问题还应该是ndd=1的地方,当ndd=1时 循环: for k=2:ndd [tmp1,jj]=min(dd(1,k)+W(dd(2,k),V)); tmp2=V(jj); tt(k-1,:)=[tmp1,tmp2,jj]; end 不运算,跳过.当ndd >=2开始运算. [tmp1,jj]=min(dd(1,k)+W(dd(2,k),V)); tmp1和jj分别为后面数组的最小值和最小值对应的位置; tmp2=V(jj); tmp2赋值为V中jj位置的值; tt(k-1,:)=[tmp1,tmp2,jj]; 将tmp1,tmp2,jj赋值给tt的k-1行

武进区15959463991: dijkstra算法是什么? -
植乔双黄: 迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题.算法构思很是巧妙(我这么认为),简直达到了“无心插柳柳成荫”的境界.算法本...

武进区15959463991: Dijkstra算法的主要步骤是什么?求大神解答~~~ -
植乔双黄: 分为两个集合 一个集合1中的点已经运算过,源点到该集合的点的距离是最短距离,其它是另外集合2 集合1初始为源点 从集合2中找出到集合1最近的点,更新集合2中点到集合1的距离 知道集合2为空

武进区15959463991: dijkstra算法是什么?迪杰斯特拉算法是什么? -
植乔双黄:[答案] 迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题.算法构思很是巧妙(我这么认为),简直达到了“无心插柳柳成荫”的境界.算法本身并不...

武进区15959463991: dijkstra算法求该源顶点到其它所有顶点的最短路径和最短路径长度,并输出.用无向网邻接表存储结构.C语言 -
植乔双黄: #include<stdio.h>#define N 100#define MaxDist 10000int mapdist[N][N];int mindist[N];void Dijkstra(int n,int c){ int i,tag[N],minc,t,j; for(i=1;i<=n;++i) { if(mapdist[c][i]>=0) mindist[i]=mapdist[c][i]; else mindist[i]=MaxDist; tag[i]=0; } for(j=1;j<=n;++j) { minc...

武进区15959463991: 迪杰斯特拉算法 -
植乔双黄: 按路径长度递增次序产生最短路径算法: 把V分成两组: (1)S:已求出最短路径的顶点的集合(2)V-S=T:尚未确定最短路径的顶点集合 将T中顶点按最短路径递增的次序加入到S中, 保证:(1)从源点V0到S中各顶点的最短路径长度都...

武进区15959463991: 用dijkstra算法计算源点到个结点的最短路径....谢谢亲爱的朋友~ 详细答案 -
植乔双黄: (这里描述的是从节点1开始到各点的dijkstra算法,其中Wa->b表示a->b的边的权值,d(i)即为最短路径值) 1. 置集合S={2,3,...n}, 数组d(1)=0, d(i)=W1->i(1,i之间存在边) or +无穷大(1.i之间不存在边) 2. 在S中,令d(j)=min{d(i),i属于S},令S=S-{j},若S为空集则算法结束,否则转3 3. 对全部i属于S,如果存在边j->i,那么置d(i)=min{d(i), d(j)+Wj->i},转2

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网