经济信息学里面的(社会调查)层次分析法的计算
2003-12-19 23:20
281 查看
如果大家很熟悉层次分析里面的那些判断矩的话,应该很容易懂我以下的这个程序的了!!
老师给的那个程序一次只能算一个判断矩阵,这样的话,如果碰到底下有很多层的那种检验的时候你就要一个一个来,算出那个总的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 *
;
copy=new double *
;
for( i=0;i<n;i++)
{martrix=new double
;
copy[i]=new double
;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
martrix[i][j]=0;[/i][/i]
cout<<"请输入矩阵:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ cin>>martrix[j];
copy[i][j]=martrix[i][j];
}
double *m;
m=new double
;
for(i=0;i<n;i++)
m[i]=0;
for(j=0;j<n;j++)
{for(i=0;i<n;i++)
m[j]+=martrix[i][j];
for(i=0;i<n;i++)
copy[i][j]=martrix[i][j]/m[j];
}
for(i=0;i<n;i++)
m[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
m[i]+=copy[i][j];
double total=0;
for(i=0;i<n;i++)
total+=m[i];
for(i=0;i<n;i++)
m[i]/=total;
double *ano;
ano=new double
;
int k;
for(i=0;i<n;i++)
ano[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
{ if(k==j) { ano[i]+=m[k]*martrix[i][j];break;}}
double lamda=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j) {lamda+=ano[i]/(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[i]<<" ";
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[i]*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[i]==(j+1)) {ri[i]=ai[j];break;}[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
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.
老师给的那个程序一次只能算一个判断矩阵,这样的话,如果碰到底下有很多层的那种检验的时候你就要一个一个来,算出那个总的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 *
;
copy=new double *
;
for( i=0;i<n;i++)
{martrix=new double
;
copy[i]=new double
;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
martrix[i][j]=0;[/i][/i]
cout<<"请输入矩阵:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ cin>>martrix[j];
copy[i][j]=martrix[i][j];
}
double *m;
m=new double
;
for(i=0;i<n;i++)
m[i]=0;
for(j=0;j<n;j++)
{for(i=0;i<n;i++)
m[j]+=martrix[i][j];
for(i=0;i<n;i++)
copy[i][j]=martrix[i][j]/m[j];
}
for(i=0;i<n;i++)
m[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
m[i]+=copy[i][j];
double total=0;
for(i=0;i<n;i++)
total+=m[i];
for(i=0;i<n;i++)
m[i]/=total;
double *ano;
ano=new double
;
int k;
for(i=0;i<n;i++)
ano[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
{ if(k==j) { ano[i]+=m[k]*martrix[i][j];break;}}
double lamda=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j) {lamda+=ano[i]/(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[i]<<" ";
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[i]*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[i]==(j+1)) {ri[i]=ai[j];break;}[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
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.
相关文章推荐
- 经济信息学里面的(社会调查)层次分析法的计算
- 用MATLAB进行层次分析法时计算权向量的代码。
- MATLAB实现层次分析法计算权重的代码函数实现
- 层次分析法计算小软件
- arcengine point层和polygon 相交计算每个面里面的点个数 使用了面查询功能
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解
- 计算机学习层次划分第三阶段技能:面向市场:成本质量效率:产品属性【经济属性】
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解
- 一个字符串有两个A,计算里面的字符个数,并打印出来
- PHP 怎么计算二维数组里面某个值有几个重复了,是那几个,重复了几次
- dxgi里面的相对层次关系
- java里面一些时间的计算
- 如何在C#里面象js一样可以直接计算字符串的值
- plc里面的常用符号,流程,pid计算基本都搞清楚了。
- 层次分析法
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解
- 层次分析法(详解)
- 【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究
- 投入产出与投入占用产出技术在经济分析中的应用(指标计算和投入产出分析)
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解