如果大家很熟悉层次分析里面的那些判断矩的话,应该很容易懂我以下的这个程序的了!!
老师给的那个程序一次只能算一个判断矩阵,这样的话,如果碰到底下有很多层的那种检验的时候你就要一个一个来,算出那个总的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.