数学建模08D题

更新时间:2023-12-17 15:21:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

NBA赛程的分析与评价

摘要

本文研究的是NBA赛程安排对球队的影响,通过对我们对NBA赛事的了解、分析,我们得出在一个赛季里影响球队发挥的因素有以下几点:

1) 每支球队的背靠背的次数; 2) 每支球队客场的比赛场次; 3) 每支球队与强队的比赛场次;

4) 每支球队每两场比赛的时间均衡度;

通过在EXCEL中利用VB编程,对各个球队进行1-30的编号,原来的比赛时间是日期格式,可通过VB编程转化为以自然数为顺序的时间表示,以利于后面的计算。通过层次分析法,对以上的六个因素进行赋值,把主观的因素进行量化处理,通过MATLAB编程,求出其可行性向量,并进行一致性检验和归一化处理,最后得出每个因素对整个比赛影响的权重。

在问题二中,根据问题一建立的模型分别求出30支球队的四项影响因素的统计结果,最后通过综合的计算,得出本赛程安排对活塞队最为有利,对国王队最为不利,对姚明加盟的火箭队处于基本不利。

在问题三中,通过分析得出每一支球队都要和其它的同部不同区的10支球队每总共比赛36场比赛,通过计算得出有6个队比赛4场比赛,有4个队比赛3场比赛。通过对三个赛区的比赛安排得出完全满足要求的安排方式即表5。

关键词: 背靠背 均衡度 NBA层次分析法 VB编程

EXCEL统计分析 数据量化

1

一 问题重述

NBA是全世界篮球迷们最钟爱的赛事之一,姚易加盟以后更是让中国球迷宠爱有加。NBA共有30支球队,西部联盟、东部联盟各15支,大致按照地理位置,西部分西南、西北和太平洋3个区,东部分东南、中部和大西洋3个区,每区5支球队。对于2008~2009新赛季,常规赛阶段从2008年10月29日(北京时间)直到2009年4月16日,在这5个多月中共有1230场赛事,每支球队要进行82场比赛,附件1是30支球队2008~2009赛季常规赛的赛程表,附件2是分部、分区和排名情况(排名是2007~2008赛季常规赛的结果),见http://sports.sina.com.cn/nba/ 。

对于NBA这样庞大的赛事,编制一个完整的、对各球队尽可能公平的赛程是一件非常复杂的事情,赛程的安排对球队实力的发挥和战绩有一定的影响,从报刊上经常看到球员、教练和媒体对赛程的抱怨或评论。这个题目主要是要求用数学建模方法对已有的赛程进行定量的分析与评价:

1)为了分析赛程对某一支球队的利弊,你认为有哪些要考虑的因素,根据这些因素将赛程转换为便于进行数学处理的数字格式,并给出评价赛程利弊的数量指标。

2)按照1)的结果计算、分析赛程对姚明加盟的火箭队的利弊,并找出赛程对30支球队最有利和最不利的球队。

3)分析赛程可以发现,每支球队与同区的每一球队赛4场(主客各2场),与不同部的每一球队赛2场(主客各1场),与同部不同区的每一球队有赛4场和赛3场(2主1客或2客1主)两种情况,每支球队的主客场数量相同且同部3个区的球队间保持均衡。试根据赛程找出与同部不同区球队比赛中,选取赛3场的球队的方法。这种方法如何实现,对该方法给予评价,也可以给出你认为合适的方法。

二 问题分析

问题一要分析赛程安排对球队的影响,这就需要找出影响球队的因素。根据实际比赛情况,可提出诸如背靠背次数(连续参赛次数)、连续客场比赛次数、连续与强队比赛场数。这些指标值越大,对该队就越不利。另外还可以考虑比赛时间安排的均衡度,若某队越不均衡,则对该队越不利。

若要提出这些指标,需要对数据进行预处理。原来的数据是word表格形式,可转化为Excel里,采用VBA编程进行统计分析。原来的比赛时间是日期格式,可转化为以自然数为顺序的时间表示。对30支球队,为处理方便,也编号为1,2,…,30。

对提取的指标,需要确定各指标的权重,可采用层次分析法等方法确定。完成问题一。

确定了权重后,可对赛程对每支球队的影响进行排名,实现赛程安排对姚明加盟的火箭队的影响进行评价,同时找到对30支球队最有利和最不利的球队。完成问题二。

问题三中,每个队与同区4个队共比赛4?4?16场(与每队赛4场),与不同部的15个队共比赛15?2?30场(与每队赛2场),则与同部不同区的10个队要比赛82?16?30?36场。其中包括与某些队赛4场,与另外一些队赛3场。设与x个队赛4场,与y个队赛3场,则4x+3y=36,x+y=10 。解得x=6,y=4。即与6个队赛4场,与4个队赛3场,总共赛36 场。问题的关键是如何安排各队间赛3场(2主1客或2客1主)。要求各队主客场次数相等,都为6场(同部不同区的队之间)。

2

三 模型假设

1) 不考虑球队人员的变动及伤病因素,即各队实力保持不变

2) 用2007—2008赛季NBA常规赛各球队战况确定各球队实力具有有一定的准确性、可

行性

3) NBA赛程的制定不存在赛程制定者的主观因素,例如,对某个球队的喜好或偏见; 4) 我们认为07-08赛季排名前15支的球队为强队,排名靠后的15支球队为弱

队。对于强队或弱队的界定,我们只根据07-08赛季各球队的比赛成绩得到相对的界定,不夹杂外界的评论;

5) 影响比赛因素只考虑文中所列出的,对于地域因素以及气候、文化差异等实际因素

不予考虑

四 符号说明

x????????背靠背次数;i????????????表示球队(i?1?30); j????????????表示天数(j?1?170);1x???????????连续客场比赛次数;;x???????????连续与强队比赛的场数x???????????时间安排的均衡度;a?1表示第i支球队在第j天参加主场比A?????????表示30*170的矩阵;赛;a?0第i支球队在第j天不参加主场比赛;b?1表示第i支球队第j天参加客场比赛;B?????????表示30*170的矩阵;b?0表示第i支球队第j天不参加客场比赛;C?A?B????c?1表示第i支球队,第j天参加比赛;c?0表示第i支球队23430*170ijij30*170ijijij30*170ijijij第j天不参加比赛;D

30*170????????dij?1表示第i球队第j天与强队比赛;dij?0表示第i支球队第j天不与强队比赛;3

五 建模与求解

5.1.1确定主要影响因素:

在摘要中我们已经说明,在一个赛季里赛程对某一支球的的利弊,有如下四个主要因素: 1) 2) 3) 4)

每支球队的背靠背的次数; 每支球队客场的比赛场次; 每支球队与强队的比赛场次;

每支球队每两场比赛的时间均衡度;

5.1.2 球队实力的确定

根据各球队2007-2008的赛绩表中的胜率指标,对球队实力按从强到弱依次排列表1,为了使球队的强弱指标便于量化,将排列名次进行简化(前15只球队分为强队,后15个球队分为弱队),来做为连续同强队比赛的次数的衡量尺度。

表1 球队强弱排列表 名次 名次 球队 名次 名次 球队 1 9 魔术 16 24 雄鹿 2 活塞 10 小牛 17 76人 25 尼克斯 3 湖人 11 掘金 18 国王 26 快船 4 马刺 12 勇士 19 老鹰 27 灰熊 5 黄蜂 13 骑士 20 步行者 28 森林狼 6 火箭 14 奇才 21 蓝网 29 超音速 7 太阳 15 22 公牛 30 热火 23 山猫 开拓者 8 爵士 球队 凯尔特人 球队 猛龙 5.2 问题二 5.2.1分析:

为获取每个队的指标x1,设C矩阵中某行1的游程长度?2的游程有k个,各游程为

r1,r2,?,rk,则该队的指标x1??ri?k。这里1的游程指序列中连续出现的个数,如序

i?1k列1011100011110011中,1的游程长度?2的游程有3个,分别为3,4,2。则x1=6。 按照同样方法从B矩阵获取指标x2。从D矩阵获取指标x3。

指标x4从C矩阵中提取。设C中某行为1的序号间隔为T1,T2,?,Tm,则平均时间间

隔为T??Ti?1mim。其标准差定义为均衡度x4。则x4??(T?T)ii?1m2m?1。

5.2.2数据处理结果:

我们首先对附件2进行处理,根据2007~2008赛季常规赛的结果,利用胜率大小进

4

行排名,结果见表1。可取前15名为强队。 表1 30支球队的排名结果 排名 队号 对名 1 22 凯尔特人 2 29 活塞 3 13 湖人 4 21 马刺 5 14 黄蜂 6 16 火箭 7 8 太阳 8 30 爵士 9 19 魔术 10 25 小牛 11 12 掘金 12 18 勇士 13 1 骑士 14 24 奇才 15 3 猛龙 16 5 开拓者 17 23 76人 18 9 国王 19 6 老鹰 20 10 步行者 21 4 网 22 20 公牛 23 15 山猫 24 2 雄鹿 25 17 尼克斯 26 27 快船 27 28 森林狼 28 11 灰熊 29 26 超音速 30 7 热火

胜率 0.805 0.72 0.695 0.683 0.683 0.671 0.671 0.659 0.634 0.622 0.61 0.585 0.549 0.524 0.5 0.5 0.488 0.463 0.451 0.439 0.415 0.402 0.39 0.317 0.28 0.28 0.268 0.268 0.244 0.183 通过VBA编制程序统计得到30支球队的4个指标值为:

表2 各队4个指标值结果 背靠背次连续客场参连续与强队队号 队名 数 赛次数 参赛次数 1 骑士 19 6 3 2 雄鹿 22 6 7 3 开拓者 16 8 4 4 网 22 6 4

5

均衡度 0.9513 0.9513 0.8396 0.9718

5 猛龙 6 老鹰 7 热火 8 太阳 9 国王 10 步行者 11 灰熊 12 掘金 13 湖人 14 黄蜂 15 山猫 16 火箭 17 尼克斯 18 勇士 19 魔术 20 公牛 21 马刺 22 凯尔特人 23 76人 24 奇才 25 小牛 26 超音速 27 快船 28 森林狼 29 活塞 30 爵士 17 22 19 19 22 21 22 21 19 19 21 20 18 15 16 22 18 17 21 18 16 18 21 22 16 21 5 6 7 11 11 5 6 6 10 9 6 9 6 10 7 5 7 6 5 6 5 8 11 8 5 7 2 5 3 5 8 4 5 4 7 7 3 5 4 7 4 7 2 6 5 4 3 6 9 4 4 5 0.9189 0.9718 0.8772 0.9324 1.058 0.8913 0.9458 1.022 0.9189 0.9324 0.8992 0.8913 0.8913 0.8182 0.8333 0.911 0.8913 0.9246 1.022 0.8913 0.8418 0.8482 0.9972 0.9458 0.8028 0.8852 由于各指标数值范围不一样,采用归一化处理。 设第i个队第j个指标为aij,则采用如下归一化方法:

aij?min{aij}bi?jmax{aij}?min{aij}jj

其中i?1,2,?,30。

通过该处理,每个指标值都化到[0,1]区间,便于统一处理。统一处理后指标值见表3。

为了对赛程安排对各队的公平程度进行评价,我们对四个指标通过层次分析法来确定权重。

通过资料的搜集、整理,我们对四个指标进行讨论之后,按照表3中所列的判断标准,进行两两比较得出权矩阵A

1)背靠背次数 2)连续客场次数 3连续与强队的比赛 场次 4)时间的均衡系数

6

A?

1 4 3 1/2 1/4 1 1/2 1/5 1/3 2 1 1/3 2 5 3 1

通过MATLAB的计算得出特征向量: u1 =

0.5361 0.1344 0.2337 0.8000 最大特征根:v1 =

4.0566

CR =0.0212<0.1

当 C.R.< 0.1 时,一般认为判断矩阵的一致性是可以接受的。否则应对判断矩阵作适当的修正。

对特征向量进行归一化处理得到各个指标的权重: 背靠背次数: 0.3146 连续客场次数: 0.0789 连续与强队的比赛场次: 0.1371 时间的均衡系数: 0.4694 表3 标度 1 3 4 5 6 7 8 9 含义 表示两个因素相比,具有同样重要性; 表示两个因素相比,一个因素比另一个因素稍微重要; 表示两个因素相比,一个因素比另一个因素介于稍微重要与明显重要之间; 表示两个因素相比,一个因素比另一个因素明显重要 表示两个因素相比,一个因素比另一个因素介于明显重要和强烈重要之间; 表示两个因素相比,一个因素比另一个因素强烈重要 表示两个因素相比,一个因素比另一个因素介于强烈重要和极端重要之间; 表示两个因素相比,一个因素比另一个因素极端重要 2 表示介于同样重要与稍微重要之间; 根据最后的综合结果进行排名。由于各指标越小对该队越有利,因此按赛程对各队有利程度进行排名,综合值越小对该队越有利。最后的排名结果见表4。

7

队号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

表4 归一化各指标及综合排名

背靠背 连续客场参 连续与强队 排名

队名 次数 赛次数 参赛次数 均衡度 合成结果 结果 骑士 0.5714 0.1667 0.1429 0.5818 0.4842 15 雄鹿 1 0.1667 0.7143 0.5818 0.6916 25 开拓者 0.1429 0.5 0.2857 0.1443 0.1884 5 网 1 0.1667 0.2857 0.6623 0.6749 24 猛龙 0.2857 . . 0.4551 0.3035 6 老鹰 1 0.1667 0.4286 0.6623 0.6931 26 热火 0.5714 0.3333 0.1429 0.2915 0.3611 11 太阳 0.5714 1 0.4286 0.508 0.5516 19 国王 1 1 0.8571 1 0.9718 30 步行者 0.8571 . 0.2857 0.3469 0.4688 13 灰熊 1 0.1667 0.4286 0.5601 0.6451 22 掘金 0.8571 0.1667 0.2857 0.8587 0.7222 27 湖人 0.5714 0.8333 0.7143 0.4551 0.5499 18 黄蜂 0.5714 0.6667 0.7143 0.508 0.5616 20 山猫 0.8571 0.1667 0.1429 0.3779 0.4784 14 火箭 0.7143 0.6667 0.4286 0.3469 0.4946 16 尼克斯 0.4286 0.1667 0.2857 0.3469 0.3471 10 勇士 . 0.8333 0.7143 0.0604 0.1849 4 魔术 0.1429 0.3333 0.2857 0.1197 0.1638 3 公牛 1 . 0.7143 0.424 0.6044 21 马刺 0.4286 0.3333 . 0.3469 0.3239 7 凯尔特人 0.2857 0.1667 0.5714 0.4774 0.3997 12 76人 0.8571 . 0.4286 0.8587 0.7272 28 奇才 0.4286 0.1667 0.2857 0.3469 0.3471 9 小牛 0.1429 . 0.1429 0.1529 0.1349 2 超音速 0.4286 0.5 0.5714 0.178 0.3304 8 快船 0.8571 1 1 0.7617 0.8332 29 森林狼 1 0.5 0.2857 0.5601 0.6533 23 活塞 0.1429 . 0.2857 . 0.0813 1 爵士 0.8571 0.3333 0.4286 0.323 0.5021 17

22 23 24 25 26 27 28 29 30

从该表来看,最有利的队是活塞队,最不利的队是国王队。姚明加盟的火箭队排名16。即其赛程对其有利程度居于30名中的第16位,因此赛程安排对火箭队趋于不利。 5.3 问题三 5.3.1分析:

每个区有5个队,每个队与其余4个队每队赛4场,其中2主2客,总共比赛4?4?16场。

8

每队与不同部的15个队的每队赛2场,总共比赛15?2?30场。

由于一个赛季比赛82场,则与同部不同区10个队共比赛82?16?30?36场。 设与x个队赛4场,与y个队赛3场,则4x+3y=36,x+y=10 。 解得x=6,y=4。

即与同部不同区的10个队中,要与6个队赛4场,总共24场,其中主场12场客场12场;与4个队赛3场,总共赛12 场,其中主场6场,客场6场。

这里重点是如何选取与两个区10个队中哪4个队赛3场(其余6个队赛4场),以及这3场比赛中哪些是2主1客,哪些是不是1主2客。而且需要尽量保证与每个区赛2场,其中一场2主1客,另一场1主2客。 5.3.2数据处理:

该问题等价于如下问题:设A1,A2,A3,A4,A5代表同部某区5个队,B1,B2,B3,B4,B5代表同部另一区5个队。用1表示1主2客类型,2表示2主1客类型。问题需要在下面表中每行填入1个1,1个2;每列填入1个1,1个2。这样的排法有许多种,如表4.1,4.2,4.3,4.4都满足。其中表4.2是表4.1的对偶形式(1与2互换)。

如在表4.1中,(A1,B1)=1表示A1与B1进行1主2客比赛;(A1,B2)=2表示A1与B1进行2主1客比赛。这样排布的结果,保证了每个区的每个队与其余两个区的每个区5个队进行一场2主1客比赛和一场1主2客比赛,从而满足要求。

表4.1 安排方式1 B1 B2 B3 B5 B5 A1 1 2 A2 1 2 A3 1 2 A4 1 2 A5 2 1 表4.2的对偶形式(1,2互换) B1 B2 B3 B5 B5 A1 2 1 A2 2 1 A3 2 1 A4 2 1 A5 1 2

表4.3 安排方式2 B1 B2 B3 B5 B5

9

A1 A2 A3 A4 A5 A1 A2 A3 A4 A5

1 2 1 2 1 2 2 1 2 1 表4.4 安排方式3 B1 B2 B3 1 1 2 2 1 2 B5 1 2 B5 2 1 设3个区的队分别用A,B,C表示。任何两个区的比赛若按照表4.1方式进行,则总的安排结果见表5。注意若(A1,B1)=1,则(B1,A1)=2;若(A1,B2)=2,则(B2,A1)=1。

从表5来看,可以看出每行满足有2个1,2个2。每列也满足有2个1,2个2。即每个队与不同区10个队中的4个队进行赛3场的比赛。其中与每个区一个队进行2主1客比赛,另一个队进行1主2客比赛。完全满足要求。

表5 同部不同区按表4.1的安排结果

A1 A2 A3 A4 A5 B1 B2 2 1 2 1 2 1 2 1 2 1 1 2 1 2 2 1 2 1 2 10

B3 2 1 1 B4 B5 2 1 2 1 C1 1 2 1 2 C2 2 1 2 1 C3 2 1 2 1 C4 2 1 2 1 C5 2 1 2 1 A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2

2 1

C3 C4 C5 1 2 1 2 1 2 1 2 1 2 1 2 附录:

MATLAB程序:

A=[1,4,3,1/2;1/4,1,1/2,1/5;1/3,2,1,1/3;2,5,3,1]; [u,v]=eig(A);

u1=-u(:,1)/norm(u(:,1)) v1=v(1)

CI=(v1-4)/(4-1); RI=0.89; CR=CI/RI VB程序一(: '转换数据

Private Sub CommandButton1_Click()

total = Sheets(\比赛安排\Cells(1, 8) = \第k天\Cells(1, 9) = \客队号\Cells(1, 10) = \主队号\'第一段程序

'该段程序从周几计算出第几天 For i = 2 To total '将星期转化为数字

If InStr(Cells(i, 1), \周一\ k = 1

ElseIf InStr(Cells(i, 1), \周二\ k = 2

ElseIf InStr(Cells(i, 1), \周三\ k = 3

11

ElseIf InStr(Cells(i, 1), \周四\ k = 4

ElseIf InStr(Cells(i, 1), \周五\ k = 5

ElseIf InStr(Cells(i, 1), \周六\ k = 6

ElseIf InStr(Cells(i, 1), \周日\ k = 7 End If

If i = 2 Then '第一天 k0 = k '存储初始天的星期号 Tdate = 1

Cells(i, 8) = Tdate Else '其余天

L = k - k0 '当天比赛日与前次比赛日间隔天数 If L < 0 Then

L = L + 7 '为负的加7 End If

Tdate = Tdate + L '计算当前天的序号 Cells(i, 8) = Tdate k0 = k '存储当前天的星期号 End If Next i '第二段程序

'统计队数并进行编码 Dim Info(100) As String pos = 5

Cells(pos, 6) = \队号\ Cells(pos, 7) = \名称\Info(1) = Cells(2, 2) '第一个队

12

ALL = 1 '总共队数 '计算总共队数 For i = 3 To total

flag = 0 '初始假定该队没有统计 For k = 1 To ALL

If Cells(i, 2) = Info(k) Then flag = 1 '该队已有 GoTo cont End If Next k

cont: If flag = 0 Then ALL = ALL + 1 '队数增加1

Info(ALL) = Cells(i, 2) '存储该新队名称 End If Next i

For i = 1 To ALL Cells(pos + i, 6) = i Cells(pos + i, 7) = Info(i) Next i '第三段程序

'将各队采用编码表示 '(2,9),(4,10)对应 For i = 2 To total For k = 1 To ALL

If Cells(i, 2) = Info(k) Then code1 = k GoTo out1 End If Next k

out1: Cells(i, 9) = code1 '输出客队号

13

For k = 1 To ALL

If Cells(i, 4) = Info(k) Then code2 = k GoTo out2 End If Next k

out2: Cells(i, 10) = code2 '输出主队号 Next i End Sub '提取指标

'1:背靠背次数,2:连续客场数 3:连续与强队比赛次数 Private Sub CommandButton2_Click()

Dim A(30, 200) As Integer 'a(i,j)=1表示第i支球队第j天主场参赛 Dim B(30, 200) As Integer 'b(i,j)=1表示第i支球队第j天客场参赛

Dim C(30, 200) As Integer 'c(i,j)=1表示第i支球队第jc(i,j)=a(i,j)+b(i,j)

Dim D(30, 200) As Integer 'd(i,j)=1表示第i支球队第j天与强队比赛 Dim temp(200), g(200) As Integer Dim Q(15) As Integer '强队号 Dim Info(30) As String '队号

'DATA 22, 29, 13, 21, 14, 16, 8, 30, 19, 25, 12, 18, 1, 24, 3 Dim x(30, 4) As Double '存储30支球队的4个指标值 提取A和B矩阵

total = Sheets(\比赛安排\For k = 2 To total

i = Cells(k, 10) '主场参赛队号 j = Cells(k, 8) '第j天 A(i, j) = 1

i = Cells(k, 9) '客场参赛队号 B(i, j) = 1

14

天参赛 Next k '计算C矩阵 For i = 1 To 30 For j = 1 To 200

C(i, j) = A(i, j) + B(i, j) '获得各队连续参赛信息 Next j Next i

For k = 1 To 15

Q(k) = Sheets(\排名\获得强队号 Next k

For k = 1 To 30

Info(k) = Cells(5 + k, 7) '获得30个队的队名 Next k '提取D矩阵

For k = 2 To total i1 = Cells(k, 9) '客队号 i2 = Cells(k, 10) '主队号 t = Cells(k, 8) '第t天 For P = 1 To 15 If Q(P) = i2 Then

D(i1, t) = 1 'i1队在第t天客场遇强队 GoTo next1 End If Next P

next1: For P = 1 To 15 If Q(P) = i1 Then

D(i2, t) = 1 'i2队在第t天主场遇强队 GoTo finish End If Next P

15

finish: Next k ALL = 170 '总共天数 For i = 1 To 30 For j = 1 To ALL - 1

If C(i, j) = 1 And C(i, j + 1) = 1 Then x(i, 1) = x(i, 1) + 1 '统计背靠背次数 End I

If B(i, j) = 1 And B(i, j + 1) = 1 Then x(i, 2) = x(i, 2) + 1 '统计连续客场参赛次数 End If

If D(i, j) = 1 And D(i, j + 1) = 1 Then x(i, 3) = x(i, 3) + 1 '统计连续与强队参赛次数 End If Next j Next i

'根据C矩阵求均衡度 For i = 1 To 30 s = 0

For j = 1 To ALL If C(i, j) = 1 Then

s = s + 1 '统计总共比赛天数 temp(s) = j '统计哪些天有比赛 End If Next j

For k = 1 To s - 1

g(k) = temp(k + 1) - temp(k) '统计相邻两场比赛的间隔 Next k

s = s - 1 '区间数 aver = 0 For k = 1 To s

16

aver = aver + g(k) Next k

aver = aver / s '平均间隔天数 s1 = 0

For k = 1 To s

s1 = s1 + (g(k) - aver) ^ 2 Next k

Var = s1 / (s - 1) '方差

x(i, 4) = Var ^ 0.5 '标准差作为均衡度 Next i

Cells(1234, 1) = s + 1 Line = 1240 '显示行数 Cells(Line, 1) = \队号\ Cells(Line, 2) = \队名\ Cells(Line, 3) = \背靠背次数\ Cells(Line, 4) = \连续客场参赛次数\ Cells(Line, 5) = \连续与强队参赛次数\ Cells(Line, 6) = \均衡度\ For k = 1 To 30 Cells(Line + k, 1) = k Cells(Line + k, 2) = Info(k) For j = 1 To 3

Cells(Line + k, 2 + j) = x(k, j) Next j

Cells(Line + k, 2 + 4) = Format(x(k, 4), \ Next k '将指标归一化

Dim Max(4), Min(4) As Double Dim x1(30, 4) As Double Dim Re(30) As Double

17

Dim w(4) As Double '权重 w(1) = 0.3146 w(2) = 0.0789 w(3) = 0.1271 w(4) = 0.4694

For j = 1 To 4 '求各列指标的最大与最小值 Max(j) = x(1, j) Min(j) = x(1, j) For i = 1 To 30

If x(i, j) > Max(j) Then Max(j) = x(i, j) End If

If x(i, j) < Min(j) Then Min(j) = x(i, j) End If Next i Next j

For j = 1 To 4

For i = 1 To 30 '归一化指标

x1(i, j) = (x(i, j) - Min(j)) / (Max(j) - Min(j)) Next i Next j

For i = 1 To 30 s2 = 0

For j = 1 To 4

s2 = s2 + w(j) * x1(i, j) Next j

Re(i) = s2 '合成结果

18

Next i

'根据Re(30)进行排名 Dim Tr(30) As Double

Dim Xu(30), Ou(30) As Integer For i = 1 To 30 Xu(i) = i '队序号 Tr(i) = Re(i) '存储原来值 Next i

'对结果从小到大排序 For i = 1 To 29 For j = i + 1 To 30 If Tr(j) < Tr(i) Then tt = Tr(i)

Tr(i) = Tr(j) '成绩交换按从小到大排序 Tr(j) = tt t1 = Xu(i)

Xu(i) = Xu(j) '队序号交换 Xu(j) = t1 End If Next j Next i

For i = 1 To 30 Ou(i) = i '排名序号 Next i

'获得各队排名的序号,存于Ou(30)中 For i = 1 To 29 For j = i + 1 To 30 If Xu(j) < Xu(i) Then t1 = Xu(i)

Xu(i) = Xu(j) '对各对序号排序

19

Xu(j) = t1 t1 = Ou(i)

Ou(i) = Ou(j) '对排名序号交换 Ou(j) = t1 End If Next j Next i

'显示归一化后指标 Line = 1274

Cells(Line, 1) = \队号\ Cells(Line, 2) = \队名\ Cells(Line, 3) = \背靠背次数\ Cells(Line, 4) = \连续客场参赛次数\ Cells(Line, 5) = \连续与强队参赛次数\ Cells(Line, 6) = \均衡度\ Cells(Line, 7) = \合成结果\ Cells(Line, 8) = \排名结果\ For k = 1 To 30 Cells(Line + k, 1) = k Cells(Line + k, 2) = Info(k) For j = 1 To 4

Cells(Line + k, 2 + j) = Format(x1(k, j), \ Next j

Cells(Line + k, 2 + 5) = Format(Re(k), \ Cells(Line + k, 2 + 6) = Ou(k) Next k End Sub 程序二: '进行排名

Private Sub CommandButton1_Click()

20

total = Sheets(\排名\Dim Info(30) As String '队名 Dim result(30) As Double '队胜率 Dim Code(30) As Integer '队号 For i = 2 To total '获取信息 Code(i - 1) = Cells(i, 1) '队号 Info(i - 1) = Cells(i, 2) '对名 result(i - 1) = Cells(i, 5) '胜率成绩 Next i

total = total - 1 '从前往后排名

For i = 1 To total - 1 For j = i + 1 To total If result(j) > result(i) Then temp1 = result(i) result(i) = result(j) result(j) = temp1 '成绩交换 temp2 = Code(i) Code(i) = Code(j)

Code(j) = temp2 '队号交换 temp3 = Info(i) Info(i) = Info(j)

Info(j) = temp3 '交换队名称 End If Next j Next i '输出排名

Cells(1, 7) = \排名\ Cells(1, 8) = \队号\ Cells(i, 9) = \队名\

21

Cells(i, 10) = \胜率\ For i = 1 To total Cells(i + 1, 7) = i Cells(i + 1, 8) = Code(i) Cells(i + 1, 9) = Info(i) Cells(i + 1, 10) = result(i) Next i End Sub

22

本文来源:https://www.bwwdw.com/article/e125.html

Top