计算机学生编程语言选择的层次分析模型
计算机编程语言选择的层次分析模型
作者:JeromeCen
一、 摘要 :
通过大量搜索实际数据建立层次结构模型,使用科学计算和一致性检验解决长期困扰国内入门程序员如何选择编程语言的问题。最终得 无论是从当前还是趋势应该选择 java 是较为科学而全面的选择, C/C++ 方向也是不错的考虑;当然本决策系统的组合一致性检验不是严格,反映出对主观因素的估计不是非常严格,当然不同的人会得出可能不一样的结果。 故本结果仅作为普通的计算机学生选择语言的参考,至于你的决策,自然会仁者见仁,智者见智。
二、关键词
编程语言 层次分析模型 matlab 现实意义
三、问题提出
因为信息技术在最近几十年得到了飞速的发展。从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种这样的语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能 在所有机器上通用。经过努力, 1954 年,第一个完全脱离机器硬件的高级语言 --FORTRAN 问世了, 40 多年来,共有几百种高级语言出现,有重要意义的有几十种,影响较大、使用较普遍的有 FORTRAN 、 ALGOL 、 COBOL 、 BASIC 、 LISP 、 SNOBOL 、 PL/1 、 Pascal 、 C 、 PROLOG 、 Ada 、 C++ 、 VC 、 VB 、 JAVA 等。我们最初学的是 C 语言 C++ 语言,后面学 JAVA 语言;数据库语言,多种基于 Web 的脚本语言;还要面临 C#,Python,XML,Object-C 等后起语言的冲击。
计算机语言的众多让很多学计算机的同学面临着如何选择一门主修语言的问题?毕竟社会是基于分工的,人的精力是有限的;如果我们只是每门语言都懂一些,最终将导致什么也不懂,故选择一门精通的语言是很有现实意义也很有必要的,本论题也是基于这样的假设。
但是如何选择呢?怎样才能用数据进行科学而全面的判断,以下提出对较复杂决策问题进行层次分析的数学模型问题:
1. 综合分析影响选择一门语言的因素并构造合理的层次模型?
2 .得到准确且大量的数据进行比较分析?
3. 得出科学而全面的选择方案?
四、问题分析
一、目标是选出一门适合一个入门者的语言,而影响的因素主要的有社会市场提供的语言应用岗位数量,平均年薪,兴趣爱好等。因素之间是相互独立且有可比性的;与上层具有层次决定关系。因为兴趣及自豪感,领域及前景是可以合并且对相对的因素的影响是很小的可以忽略;故可将其合并,方案层的 PHP 和 Python 都是较新兴且相对简单的语言具有相似性本分析中也将其合并,本方案中没有取 Delphi 是因为它采用的是 pascal 语法为一种结构化语言,已逐渐被淘汰,当然在工控领域还会较长期的存在,当然也没有考虑 Erlang 高性能计算语言,所以方案的设计是较为普遍的方案不可能面面俱到,但是已达到解决问题的目的。以下是选择入门语言的层次结构:
解决此问题可以使用层次分析法。层次分析通过相互比较,确定各准则对于目标的权重,以及个方案对于每个准则的权重,将这两方面的权重进行综合,最终通过组合权重计算确定个方案对目标的权重,即权重最大的作为合理的选择语言。但在运用层次分析法解决此问题的过程中。在计算各方案对每一准则的权重时:有M
个准则就会有M
个方案层数量阶矩阵。此处使用层次分析法的1-9
尺度度量法。通过matlab
软件计算各个n
阶矩阵的特征值进而用CI=n-y/n-1
结合随机数的CR
进行一致性检验即可。也可通过较为简单的w
向量和计算得矩阵的特征值和特征向量。进而确定权值最大的为适合广大学生特别是适合矩阵构造者的语言。
五、符号说明
i 、j: 表示行标为i ,列标为j 的准则或方案因素,从1 开始记号。
a ij : 表示每个i 行j 列准则间或方案间两两比较的权重。
k 表示***。
A 表示准则层对目标层的方阵。r 表示A 的最大特征值,w 表示A 的特征向量。
B1 B2 B3 B4 B5 B6 分别表示方案层对对应的六个准则层的方阵。 r i , w i 分别表示B1 到B6 的最大特征值和特征向量。
CI 为一致性指标,RI 为随机一致性指标,CR 为一致性比率。
六、模型假设
1. 选择一门特长语言是有必要的,且只有准则层内的元素起到决定性的作用,其它因素如男女等条件忽略。
2. 使用全面而科学理性的方式决定选择的对象,而合理的估计情感在其中的部分作用。
七、模型建立与求解
1. 较全面科学的数据来源:从网上可以得到很多数据,自己整理后得数据:
从上表 2002 到 2010 年的语言趋势可以粗略的估计市场上语言岗位的数量和语言的前景结合英才,智联招聘网上可以得到较为合理的语言在数理和前景中的两两 1-9 比重。
对于语言间平均年薪的两两比重依据:
关于领域问题(来自 ****2007 年):
关于准则层对目标层,难易程度和兴趣爱好问题则更多的是来自于对很多信息的阅读和自己学习过程的理解进而使用 1-9 度量法对其进行两两权值比较,这个具有相当的主观性,当然这样得出的结果将是更符合测试者的。最终导致普遍性不是非常高,但也是个人较为科学合理全面的决策结果。
2. 准则层对目标层的特征值和特征向量求解和一致性检验:
1 1/3 1/5 1/3 1/2 4
3 1 1/3 1/2 1 3
5 3 1 1 1/3 2
A= 3 2 1 1 1/2 6
2 2 1/3 1/2 1 5
1/4 1/3 1/2 1 /6 1/5 1
构造特征方程: rw =Aw (rE -A )w =0
用 matlab7.1 软件求解得最大特征根: r=6.2621
由 Saaty 一致性检验公式: CI=(r-n)/(n-1), 其中 n=6 CI=0.0524
CR=CI/RI=0.0422 (RI 在 n=6 时指标值为 1.24) 故满足一致性要求。
r 值对应的特征向量为:
w = ( -558/2639,-3883/10840,-603/1037,-691/1267,-842/2003,-395/3258 )而用 matlab 中的
norm 求范数得 1 ,故其结果是正确的。
归一化处理得 w = ( 0.0945,0.1600,0.2600,0.2437,0.1878,0.0542 ) .
3. 方案层对准则层的特征值和特征向量求解及一致性检验:
通过综合考虑以上数据用 1-9 度量法构造出四个语言方向对各个准则的正互反矩阵得:
1 2 4 5 1 3 5 7
2 1 3 5 1/3 1 3 4
B1= 1/4 1/4 1 3 B2= 1/5 1/3 1 3
1/5 1/5 1/3 1 1/7 1/4 1/3 1
1 1/3 2 6
3 1 2 3 1 1/3 2 2
B3= 1/2 1/2 1 2 B4= 3 1 2 3
1/6 1/3 1/2 1 1/2 1/2 1 2
1/2 1/3 1/2 1
1 3 5 7
1/3 1 2 3 1 2 3 6
B5= 1/5 1/2 1 2 B6= 1/2 1 3 5
1/7 1/3 1/2 1 1/3 1/3 1 4
1/6 1/4 1/4 1
构造出来的 6 个矩阵,用 matlab 求解分别为:
方案对准则一岗位数量的特征方程最大特征根为: r1=4.5690
CI=0.5690/3=0.1897 CR=CI/RI=0.2107>0.1 要对矩阵进行修正(提高全面科学性):
1 2 4 8
B1= 1/2 1 2 4
1/4 1/2 1 2 再计算最大特征根得: r1=4.0354
1/7 1/4 1/2 1
CI=0.0354/3=0.0118 CR=CI/RI=0.0131 符合 Saaty 允许的主观信度范围。
求解最大特征值对应的特征向量为:
W1= ( -1177/1357 , -631/1455 , -273/1259, -272/2423 )
列向量归一化处理得:
W1= ( 0.5321,0.2660,0.1330,0.0689 )
同理计算可得决策问题第三层的计算结果:
对 B3 进行修正:
1 1/2 2 1/3
B3= 2 1 3 1/2
1/2 1/3 1 1/4
3 2 4 1
表 1 :
k |
1 |
2 |
3 |
4 |
5 |
6 |
W k |
0.5321 0.2660 0.1330 0.0689 |
0.5683 0.2523 0.1203 0.0909 |
0.1601 0.2772 0.0954 0.4674 |
0.2404 0.4582 0.1851 0.1163 |
0.0587 0.2179 0.1228 0.0722 |
0.4629 0.3173 0.1584 0.0614 |
r k |
4.0354 |
4.1184 |
4.0310 |
4.1431 |
4.0192 |
4.1934 |
CI K |
0.0118 |
0.0395 |
0.0103 |
0.0477 |
0.0064 |
0.0645 |
CRk |
0.0131 |
0.0439 |
0.0114 |
0.053 |
0.0071 |
0.0716 |
从第三层对第一层的一致性检验得:
CI ﹙ 3 ﹚ =[CI 1 ﹙ 3 ﹚ ,…CI 6 ﹙ 3 ﹚ ]*W ﹙ 2 ﹚ =0.0264
RI ﹙ 3 ﹚ =[RI 1 ﹙ 3 ﹚ ,…CI 6 ﹙ 3 ﹚ ]*W ﹙ 2 ﹚ =0.294
CR ﹙ 3 ﹚ =CI ﹙ 3 ﹚ /RI ﹙ 3 ﹚ =0.0898
CR*= CR ﹙ 2 ﹚ +CR ﹙ 3 ﹚ =0.132 这个结果接近 0.1 ,对于要求不是很严格的一致性检验;此处也可通过检验。因为从新构造的确是太繁杂了。这里已经达到目的。故组合一致性检验通过,矩阵的构造是较为合理的。
进而求组合权向量得:
>> B=[0.5321 0.5683 0.1601 0.2404 0.0587 0.4629
0.2660 0.2523 0.2772 0.4582 0.2179 0.3173
0.1330 0.1203 0.0954 0.1851 0.1228 0.1584
0.0689 0.0909 0.4674 0.1163 0.0722 0.0614]
>> A=[0.0945
0.1600
0.2600
0.2437
0.1878
0.0542]
>> W=B*A
得: W ﹙ 3 ﹚ =(0.2775 0.3074 0.1334 0.1878) T. 无论是从当前还是趋势应该选择 java 是较为科学而全面的选择, C/C++ 方向也是不错的考虑;当然本决策系统的组合一致性检验不是严格,当然不同的人会得出可能不一样的结果。
八、模型评价
层次分析方法是一种将定量与定性结合,将人的主观判断用数量形式表示出来的方法,将因素按支配关系分成递阶层次结构,并通过因素的两两比较得出对目标方案选择的权值;通过量化分解,判断,综合,解决重大决策的全面而科学的方法。本模型是基于网络上较为大量的数据作为 1-9 Saaty 度量法依据,普遍性较强。但是准则层没有考虑男生,女生;学生职业规划方向的不同,工作区域等因素。方案层也有很多的语言没有考虑进去,像 Apple 的 object-c 等。因为兴趣和自豪感在其中的比重较难估计,故不同的学生可能会出现不同的结果。而且领域在不同的语言中选择的比重也是较难确定的,有很多是从事相关的领域即确定了选择的语言。故本结果仅作为普通的计算机学生选择语言的参考,自然会仁者见仁,智者见智。最后说一句没有什么难以抉择的,既然选择了就要风雨兼程呵。
九、参考文献
[1] 数学模型(第三版) 姜启源 谢金星 叶俊 编 高等教育出版社, 2006.12
[2] 线性代数 林桂莲 尹长明 刘德光 等编 中国人民大学出版社, 2008.1
[3] 计算机科学导论 赵致琢 著 科学出版社 , 2008.4
[4] http://community.****.net/ **** 社区统计数据
十、附录
部分矩阵特征值和特征向量的计算:
>> format rat
>> A=[1 1/3 1/5 1/3 1/2 4
3 1 1/3 1/2 1 3
5 3 1 1 1/3 2
3 2 1 1 1/2 6
2 2 1/3 1/2 1 5
1/4 1/3 1/2 1/6 1/5 1]
>> [V,D]=eig(A)
V =
Columns 1 through 3
-558/2639 645/2239 - 515/2841i 645/2239 + 515/2841i
-3883/10840 -325/1584 - 450/1489i -325/1584 + 450/1489i
-603/1037 -671/805 -671/805
-691/1267 230/4723 + 203/9465i 230/4723 - 203/9465i
-842/2003 -221/23804 - 394/4591i -221/23804 + 394/4591i
-395/3258 124/2551 + 336/1615i 124/2551 - 336/1615i
Columns 4 through 6
101/1177 365/2679 -427/4360
-1161/2419 56/10835 443/1389
371/1125 72/347 -683/2748
959/1954 -405/427 -156/289
1427/2271 -737/3929 659/903
-253/1895 134/2245 -343/6319
D =
Columns 1 through 3
2198/351 0 0
0 -163/1013 + 662/393i 0
0 0 -163/1013 - 662/393i
0 0 0
0 0 0
0 0 0
Columns 4 through 6
0 0 0
0 0 0
0 0 0
-1747/2325 0 0
0 213/3509 0
0 0 460/613
>> B1=[1 2 4 8
1/2 1 2 4
1/4 1/2 1 2
1/7 1/4 1/2 1
]
B1 =
1 2 4 8
1/2 1 2 4
1/4 1/2 1 2
1/7 1/4 1/2 1
>> [V,D]=eig(B1)
V =
-1177/1357 614/741 * *
-631/1455 307/741 -447/488 -266/1789
-273/1259 307/1482 -731/3369 1333/1483
-272/2423 -736/2341 1111/3292 -1137/2758
D =
456/113 0 0 0
0 -113/3192 0 0
0 0 * 0
0 0 0 *
>> B2=[1 3 5 7
1/3 1 3 4
1/5 1/3 1 3
1/7 1/4 1/3 1]
B2 =
1.0000 3.0000 5.0000 7.0000
0.3333 1.0000 3.0000 4.0000
0.2000 0.3333 1.0000 3.0000
0.1429 0.2500 0.3333 1.0000
>> [V,D]=eig(B2)
V =
-0.8935 -0.8686 -0.8686 0.8997
-0.3967 -0.0721 - 0.4210i -0.0721 + 0.4210i -0.4089
-0.1891 0.2278 - 0.0154i 0.2278 + 0.0154i 0.1379
-0.0929 -0.0069 + 0.1049i -0.0069 - 0.1049i -0.0654
D =
4.1184 0 0 0
0 -0.0064 + 0.6974i 0 0
0 0 -0.0064 - 0.6974i 0
0 0 0 -0.1057
>> B3=[ 1 1/2 2 1/3
2 1 3 1/2
1/2 1/3 1 1/4
3 2 4 1]
B3 =
1.0000 0.5000 2.0000 0.3333
2.0000 1.0000 3.0000 0.5000
0.5000 0.3333 1.0000 0.2500
3.0000 2.0000 4.0000 1.0000
>> [V,G]=eig(B3)
V =
-0.2787 -0.3592 -0.2498 + 0.0499i -0.2498 - 0.0499i
-0.4826 0.5934 -0.0004 + 0.4268i -0.0004 - 0.4268i
-0.1661 0.1535 -0.0252 - 0.1758i -0.0252 + 0.1758i
-0.8135 -0.7038 0.8493 0.8493
G =
4.0310 0 0 0
0 -0.0276 0 0
0 0 -0.0017 + 0.3533i 0
0 0 0 -0.0017 - 0.3533i
矩阵相乘的 C++ 语言测试代码:
#include<iostream>
using namespace std;
void main()
{
double a[6]={0.0945,0.1600,0.2600,0.2437,0.1878,0.0542};
double b[4][6]={{0.5321,0.5683,0.1601,0.2404,0.0587,0.4629},
{0.2660,0.2523,0.2772,0.4582,0.2179,0.3173},
{0.1330,0.1203,0.0954,0.1851,0.1228,0.1584},
{0.0689,0.0909,0.4674,0.1163,0.0722,0.0614}};
double c[4]={0,0,0,0};
for(int i=0;i<4;i++)
{ //c[i]=0;
for(int j=0;j<6;j++)
c[i]=c[i]+a[j]*b[i][j];
// cout<<"running?";
//sum[i]=c[i];
}
cout<<"the matrix is:"<<endl;
for(int k=0;k<4;k++)
cout<<c[i]<<" ";
cout<<endl;
int t1[3]={1,100,3};
int t2[2][3]={{1,2,4},
{2,32,5}};
int t3[2]={0,0};
for(int i1=0;i1<2;i1++)
for(int j1=0;j1<3;j1++)
t3[i1]=t3[i1]+t1[j1]*t2[i1][j1];
cout<<"test:"<<endl;
for(int j2=0;j2<2;j2++)
cout<<t3[j2]<<" :";
}