如果大家很熟悉层次分析里面的那些判断矩的话,应该很容易懂我以下的这个程序的了!! 老师给的那个程序一次只能算一个判断矩阵,这样的话,如果碰到底下有很多层的那种检验的时候你就要一个一个来,算出那个总的CR来了,这样真的是麻烦死了.这个程序为你解决了这个烦恼.你可以在这个程序里面输入这些矩阵的内容和信息,然后就可以得到各个小的CI值, 也可以得到总的CI值,从而算出总的CR值,最终为你判断做好了准备,其实也方便了你构造那些本命的判断矩阵了(有时候如果真的碰到CR>0.1)的话,如果用老师的那个程序的话,你可真的要气死了,用这个程序完全不会有这个顾虑了!!请看 贡献原码:
#include <iostream.h> void main() { int count; cout<<"请输入这层的总数:"; cin>>count; double *por; por=new double[count]; int c; cout<<"请输入他们各自的权重:"; for(c=0;c<count;c++) cin>>por[c]; int q; int *ncount; ncount=new int[count]; double *cicount; cicount=new double[count]; for(q=0;q<count;q++) {int n; int i,j; cout<<"请输入矩阵的阶数:"; cin>>n; double **martrix; double **copy; martrix=new double * [n]; copy=new double *[n]; for( i=0;i<n;i++) {martrix=new double[n]; copy=new double[n]; }
for(i=0;i<n;i++) for(j=0;j<n;j++) martrix[j]=0;
cout<<"请输入矩阵:"<<endl; for(i=0;i<n;i++) for(j=0;j<n;j++) { cin>>martrix[j]; copy[j]=martrix[j]; } double *m; m=new double [n]; for(i=0;i<n;i++) m=0; for(j=0;j<n;j++) {for(i=0;i<n;i++) m[j]+=martrix[j]; for(i=0;i<n;i++) copy[j]=martrix[j]/m[j]; } for(i=0;i<n;i++) m=0; for(i=0;i<n;i++) for(j=0;j<n;j++) m+=copy[j]; double total=0; for(i=0;i<n;i++) total+=m; for(i=0;i<n;i++) m/=total; double *ano; ano=new double[n]; int k; for(i=0;i<n;i++) ano=0; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) { if(k==j) { ano+=m[k]*martrix[j];break;}} double lamda=0; for(i=0;i<n;i++) for(j=0;j<n;j++) if(i==j) {lamda+=ano/(n*m[j]);break;} double ci; ci=(lamda-(double)n)/((double)n-1); cout<<"这就是传说中的λmax:"<<lamda<<endl; cout<<"这就是那个比较关键的CI:"<<ci<<endl; cout<<"这就是那个传说中的特征向量:"<<endl; for(i=0;i<n;i++) cout<<ano<<" "; cout<<endl; ncount[q]=n; cicount[q]=ci; cout<<endl; } int i,j; double CI=0; for(i=0;i<count;i++) for(j=0;j<count;j++) if(i==j) { CI+=cicount*por[j];break;} double ai[7]; ai[0]=0;ai[1]=0;ai[2]=0.58;ai[3]=0.89;ai[4]=1.12;ai[5]=1.24; ai[6]=1.32; double RI=0; double *ri; ri=new double[count]; for(i=0;i<count;i++) for(j=0;j<7;j++) if(ncount==(j+1)) {ri=ai[j];break;}
for(i=0;i<count;i++) for(j=0;j<count;j++) if(i==j) RI+=ri*por[j]; cout<<"最终的CR是:"; double CR; CR=CI/RI; cout<<CR<<endl;
}
可执行程序上传不了,气死我也!! 以下是我用一个例子实际运行的结果: 请输入这层的总数:5 请输入他们各自的权重:0.18 0.18 0.16 0.18 0.16 请输入矩阵的阶数:7 请输入矩阵: 1 1 1 1 1 4 3 1 1 1 1 1 4 4 1 1 1 1 1 3 4 1 1 1 1 1 4 4 1 1 1 1 1 4 4 0.25 0.25 0.3333 0.25 0.25 1 1 0.3333 0.25 0.25 0.25 0.25 1 1 这就是传说中的λmax:7.01692 这就是那个比较关键的CI:0.0028207 这就是那个传说中的特征向量: 1.24005 1.28806 1.24005 1.28806 1.28806 0.336736 0.336736
请输入矩阵的阶数:3 请输入矩阵: 1 1 0.5 1 1 1 2 1 1 这就是传说中的λmax:3.05366 这就是那个比较关键的CI:0.026828 这就是那个传说中的特征向量: 0.794444 1 1.26111
请输入矩阵的阶数:5 请输入矩阵: 1 1 2 3 2 1 1 2 3 2 0.5 0.5 1 1 1 0.3333 0.3333 1 1 0.5 0.5 0.5 1 2 1 这就是传说中的λmax:5.03944 这就是那个比较关键的CI:0.00986095 这就是那个传说中的特征向量: 1.50659 1.50659 0.701317 0.522066 0.80527
请输入矩阵的阶数:5 请输入矩阵: 1 1 1 2 2 1 1 1 2 2 1 1 1 2 2 0.5 0.5 0.5 1 2 0.5 0.5 0.5 0.5 1 这就是传说中的λmax:5.05898 这就是那个比较关键的CI:0.0147447 这就是那个传说中的特征向量: 1.25667 1.25667 1.25667 0.738889 0.555278
请输入矩阵的阶数:3 请输入矩阵: 1 2 1 0.5 1 1 1 1 1 这就是传说中的λmax:3.05366 这就是那个比较关键的CI:0.026828 这就是那个传说中的特征向量: 1.26111 0.794444 1
最终的CR是:0.0169949
在这里,我们只用看这个CR就可以了,它明显是<0.1的, 所以,一致性检验通过.
YEAH. 
|