层次分析法,即Analytic Hierarchy Process(AHP) ,是美国运筹学家 Saaty 于20世纪 70 年代初期提出的一种主观赋值评价方法。层次分析法将与决策有关的元素分解成目标、准则、方案等多个层次,并在此基础上进行定性和定量分析,是一种系统、简便、灵活有效的决策方法。
javascript代码实现
function ahp(matrix) {
const size = matrix.length
if (!matrix.every(row => row.length === size)) {
throw new Error('输入矩阵不是方阵!');
}
// 矩阵列求和
const colSum = matrix.reduce((prev, cur) => prev.map((val, i) => cur[i] + val))
// 矩阵权重
const weights = matrix.map(row => {
// 归一化矩阵行
const normalized = row.map((val, i) => val / colSum[i])
// 矩阵行平均数
return normalized.reduce((acc, val) => acc + val) / size
})
// 特征向量
const eigs = matrix.map(item => weights.map((weight, i) => weight * item[i]).reduce((a, b) => a + b))
// 最大特征根
const lambdaMax = eigs.map((eig, i) => eig / weights[i]).reduce((a, b) => a + b) / size
// 一致性指标
const CI = (lambdaMax - size) / (size - 1)
// 初始化RI值,用于一致性检验
const RIs = [0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]
// 一致性RI值
const RI = RIs[size - 1]
// 一致性比例
const CR = CI / RI
// 一致性判断
const consistency = CR < 0.1
return { size, weights, eigs, lambdaMax, CI, RI, CR, consistency }
}
使用方法
// 输入矩阵
const matrix = [
[ 1, 5, 3 ],
[ 1/5, 1, 1/2 ],
[ 1/3, 2, 1 ]
];
const weights = ahp(matrix);
console.log(weights);
// 输出 [0.485, 0.323, 0.192]