BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #12108同步于 2016/6/11
Matlab机器人发帖

[问题]用MATLAB做Dijsktra最短路,结果为何莫名其妙?

avirl108
2016/6/11镜像同步0 回复
新手求轻喷。。 题目见图,将节点分别用数字标号。 代码如下: 新建一个空白脚本,添加函数代码,并保存在工作目录下,命名为函数名的m文件。即minroute.m。该文件的内容,只包含函数本身。如下: function [S,D]=minroute(i,m,W,opt) if nargin<4 opt=0; end dd=[];tt=[]; ss=[];ss(1,1)=i; V=1:m;V(i)=[]; dd=[0;i]; kk=2; [mdd,ndd]=size(dd); while ~isempty(V) [tmpd,j]=min(W(i,V)); tmpj=V(j ); 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 tmp=[tmpd,tmpj,j;tt]; [tmp3,tmp4]=min(tmp(:,1)); if tmp3==tmpd ss(1:2,kk)=[i;tmp(tmp4,2)]; else tmp5=find(ss(:,tmp4)~=0); tmp6=length(tmp5); if dd(2,tmp4)==ss(tmp6,tmp4) ss(1:tmp6+1,kk)=[ss(tmp5,tmp4);tmp(tmp4,2)]; else ss(1:3,kk)=[i;dd(2,tmp4);tmp(tmp4,2)]; end end dd=[dd,[tmp3;tmp(tmp4,2)]]; V(tmp(tmp4,3))=[]; [mdd,ndd]=size(dd); kk=kk+1; end if opt==1 [tmp,t]=sort(dd(2,:)); S=ss(:,t); D=dd(1,t); else S=ss; D=dd(1,:); end 2.在控制台(或者其他的m文件)调用该函数。 代码如下: w=inf*ones(11); w(1,[2,3,4])=[5,4,3]; w(2,[5,6])=[8,5]; w(3,6)=[4]; w(4,[5,6,7])=[9,4,9]; w(5,[8,9])=[4,2]; w(6,[9,10])=[2,1]; w(7,[9,10])=[2,8]; w(8,11)=[9]; w(9,11)=[2]; w(10,11)=[3]; [s1,d1]=minroute(1,11,w,1) 执行结果 s1 = 1 1 1 1 1 1 1 1 1 1 1 0 2 3 4 4 4 4 4 4 4 4 0 0 0 0 5 6 7 5 6 6 6 0 0 0 0 0 0 0 8 9 10 10 0 0 0 0 0 0 0 0 0 0 11 d1 = 0 5 4 3 12 7 12 16 9 8 11 >> 问题:我明明只是把点从1-11进行标号,结果d1里的0、12、16是咋回事? 应该是源代码不对?求大神解释,顺便修改、编译一下下,跪谢!!跪谢!![ema23][ema23][ema23]
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。