循环比赛的名次——双向连通竞赛图(4顶点)的名次排序

4 个顶点的竞赛图如下:

4 个队得分(获胜场数)为(2,2,1,1)由得分排名为{(1,2),(3,4)},该竞赛 图是双向连通图,可通过以下方法给出名次排序。

该图的邻接矩阵为:

得分向量为

s=A*ones

记 s (1)=s

s (k)=A*s(k-1)=Ak*ones, k=1, 2, …(s (k)称为 k 级得分向量)

对于 n≥4 个顶点的双向连通竞赛图,其邻接矩阵 A 为素阵(存在正整数 r,使 A r>0), 且有

其中, L 为全 1 列向量,λ为最大实特征根且为正,s 为其特征列向量。

1.求元素互不相等的得分向量法

程序如下:

%文件名:fscore1.m

clear;clc;format compact;format short g;

A=[0 1 1 0;0 0 1 1;0 0 0 1;1 0 0 0];%邻接矩阵

s=A*ones(size(A,2),1);k=1;

n=length(s);

while 1

i=1;

while i<=n-1 & all(s(i+1:n)-s(i)~=0)

i=i+1;

end

if i==n

break;

end

s=A*s; k=k+1;

end

k % k级得分向量

s %元素不等的得分列向量

[ss,kk]=sort(s,'descend'); %降序

kk %排名

结果:

2. 特征根法

%文件名:fscore2.m

clear;clc;format compact;format short g;

A=[0 1 1 0;0 0 1 1;0 0 0 1;1 0 0 0];%邻接矩阵

[V,D]=eig(A); %返回 A 的特征值和特征向量。

%其中 D 为 A 的特征值构成的对角阵,每个特征值

%对应的 V 的列为属于该特征值的一个特征向量。

DD=diag(D); %返回矩阵 D 的对角线元素构成列向量。

for i=1:length(DD) %复数特征值用 0 代替

if ~isreal(DD(i))

DD(i)=0;

end

end

[lamda,I]=max(DD);

lamda

s=V(:,I)/sum(V(:,I)) %最大特征根对应的特征列向量(归一化)

[ss,kk]=sort(s,'descend'); %降序

kk

结果:

3.编写一个程序,求出 1~8 级得分向量,并依据 8 级得分向量给出排名

%文件名:fscore3.m

clear;clc;format compact;format short g;

A=[0 1 1 0;0 0 1 1;0 0 0 1;1 0 0 0];%邻接矩阵

s=A*ones(size(A,2),1);k=1;

n=length(s);

while 1

i=1;

while i<=n-1 & all(s(i+1:n)-s(i)~=0)

i=i+1;

end

if k==8

break;

end

fprintf('==============================\n');

fprintf('%d级得分向量:\n',k);

disp(s);

s=A*s; k=k+1;

end

fprintf('==============================\n');

fprintf('%d级得分向量:\n',k);

disp(s);

[ss,kk]=sort(s,'descend'); %降序

fprintf('排名:\n',k);

disp(kk);

结果:

==============================

1级得分向量:

2

2

1

1

==============================

2级得分向量:

3

2

1

2

==============================

3级得分向量:

3

3

2

3

==============================

4级得分向量:

5

5

3

3

==============================

5级得分向量:

8

6

3

5

==============================

6级得分向量:

9

8

5

8

==============================

7级得分向量:

13

13

8

9

==============================

8级得分向量:

21

17

9

13

排名:

1

2

4

3