AHP层次分析法权重计算

利用特征向量法求解判断矩阵的权重向量。

初始化判断矩阵(正互反矩阵)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 假设判断矩阵为四维矩阵
int nrV = 4;
// 平均随机性一次性指标RI
double RI[] = {0.0, 0.0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49};

double[][] matrix = new double[nrV][];
for (int i = 0; i < nrV; i++) {
matrix[i] = new double[nrV];
}

// 初始化判断矩阵
// 主对角线元素为1
for (int i = 0; i < nrV; i++) {
matrix[i][i] = 1.0;
}
// 行与列的比值代表重要程度
matrix[0][1] = 4;
matrix[0][2] = 3;
matrix[0][3] = 7;
matrix[1][2] = 1.0 / 3.0;
matrix[1][3] = 3.0;
matrix[2][3] = 5.0;

// (i,k) is 1/(k,i)
for (int k = 0; k < nrV; k++) {
for (int i = 0; i < nrV; i++) {
matrix[i][k] = 1.0 / matrix[k][i];
}
}
// 显示判断矩阵
System.out.println("判断矩阵:");
for (int k = 0; k < nrV; k++) {
for (int i = 0; i < nrV; i++) {
System.out.print(String.format("%.3f", matrix[k][i]) + "\t");
}
System.out.println();
}

计算判断矩阵最大的特征值所对应的特征向量并归一化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 特征分解
System.out.println("\n最大特征值的特征向量归一化(权重向量):");
EigenDecomposition evd = new EigenDecomposition(new Array2DRowRealMatrix(matrix), 0);

double sum = 0;
for (int i = 0; i < 1; i++) {
RealVector v = evd.getEigenvector(i);
for (double d : v.toArray()) {
sum += d;
}
//System.out.println(sum);
for (double xx : v.toArray()) {
System.out.println(xx / sum + "; ");
}
System.out.println();
//System.out.println(v);
}

计算判断矩阵唯一的最大特征值evIdx

1
2
3
4
5
6
7
8
9
int evIdx = 0;
System.out.println("特征值:");
for (int i = 0; i < evd.getRealEigenvalues().length; i++) {
System.out.println(evd.getRealEigenvalues()[i]);
evIdx = (evd.getRealEigenvalue(i) > evd.getRealEigenvalue(evIdx)) ? i : evIdx;
}

// 得到最大的特征值
System.out.println("\n最大的特征值:" + evd.getRealEigenvalue(evIdx));

随机一致性比率CR=CI/RI

随机一致性比率CR<0.10时,满足一致性要求。

1
2
3
4
5
6
double ci = (evd.getRealEigenvalue(evIdx) - (double) nrV) / (double) (nrV - 1);
// Consistency Index
System.out.println("\n一致性指标: " + ci);

// Consistency Ratio
System.out.println("\n一致性比例: " + ci / RI[nrV] * 100 + "%");