function std=cwstd(vector) %标准化矩阵 cwsum=sum(vector,1); [a,b]=size(vector); for i=1:a for j=1:b
std(i,j)=vector(i,j)/cwsum(j); end end
%cwfac.m 函数 计算特征根,按贡献率选择主要成分 function result=cwfac(vector); fprintf('相关系数矩阵:\\n')
std=CORRCOEF(vector); %计算相关系数矩阵 disp(std)
[vec,val]=eig(std) ; %求特征值(val)及特征向量(vec) fprintf('特征向量:\\n') disp(vec)
fprintf('特征值:\\n') disp(val)
newval=diag(val) ; %选取主对角线即构成特征向量序列
[y,i]=sort(newval); %对特征根进行排序,y为升序排序结果,i为原序号 fprintf('特征根排序:\\n') for z=1:length(y)
newy(z)=y(length(y)+1-z); %进行降序排列 end
fprintf('%g\\n',newy)
rate=y/sum(y); %计算贡献率(升序) fprintf('\\n贡献率:\\n')
newrate=newy/sum(newy) ;%计算新贡献率(降序) disp(newrate)
34
sumrate=0;newi=[]; for k=length(y):-1:1
sumrate=sumrate+rate(k); %计算累计贡献率 newi(length(y)+1-k)=i(k) ; if sumrate>0.85 break; end
end %记下累积贡献率达到85%的特征值的序号,放入newi
fprintf('主成分数:%g\\n',length(newi)); %序号数表示主成分数 for p=1:length(newi) newm(p)=newrate(p);
end %选取主成分的贡献率 fprintf('获得对应主成分序号及其权重值:\\n') disp(newi) %对应序号 result=newm/sum(newm); %得出权重 disp(result)
(2)用主层次分析所得权重求拥堵指数程序 %funydzs.m 拥堵指数求解程序 %直接运行
function ydzs=funydzs(zcf) %输入主成分数据 zcf=[ 390 420
0.406593407 0.581508876
7 4
4810 3931
5 4 4 4 4 4
3370 3671 4825 2546 879 654
35
-2.857142857 0.398816568 38.26086957 43.72093023 7.384615385 11.50413223 31.83673469
0.543047337 0.713757396 0.376627219 0.130029586 0.096745562
17.92207792 240
0.064497041
7
4 436
0.489433643 5790
3 4
1134 4104
413.6842105 13.46938776
0.223668639 0.607100592
4034
15 0.47739645 5 26.66666667 25.45454545 18.66666667 16.28571429 26.53846154 31.60305344
0.605621302 0.589792899 0.201923077 0.306952663 0.094674556 0.078846154
4 4 4 4 4 4
4094 3987 1365 2075 640 533 ]
[a,b]=size(zcf);
fprintf('主成分数据(已按权重高低左右排列):\\n') disp(zcf)
for j=1:b %求隶属度(纵向) for i=1:a o=1:a; lie=zcf(o,j); if j==3
lsd(i,j)=(zcf(i,j)-min(lie))/(max(lie)-min(lie)); %越大越优隶属度 else
lsd(i,j)=(max(lie)-zcf(i,j))/(max(lie)-min(lie));%越小越优隶属度 end end end
fprintf('隶属度矩阵:\\n')
lsd'; %隶属度矩阵应进行转置 disp(lsd')
fprintf('拥堵指数(权重向量×隶属度矩阵):\\n') W=[0.27 0.26 0.24 0.23];
36
ydzs=W*lsd' ; end
(3)迪杰斯特拉最短路算法程序 function [S,D]=minRoute(i,m,W)
%图与网络论中求最短路径的Dijkstra算法 M-函数 %格式 [S,D]=minroute(i,n,W)
% i为最短路径的起始点,m为图顶点数,W为图的带权邻接矩阵, % 不构成边的两顶点之间的权用inf表示。显示结果为:S的每 % 一列从上到下记录了从始点到终点的最短路径所经顶点的序号; % D是一行向量,记录了S中所示路径的大小; dd=[];tt=[];ss=[];ss(1,1)=i;V=1:m;V(i)=[];dd=[0;i];
% dd的第二行是每次求出的最短路径的终点,第一行是最短路径的值 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; S=ss; D=dd(1,:);
37