评价——层次分析

1、作用

层次分析法是一种解决多目标的复杂问题的定性与定量相结合的决策分析方法。该方法将定量分析与定性分析结合起来,用决策者的经验判断各衡量目标之间能否实现的标准之间的相对重要程度,例如通过构建评价指标(景色、费用,居住,饮食、旅途)对候选旅游地(桂林、黄山,北戴河)量化评价,进行选择。

2、输入输出描述

输入:根据提示进行指标或者方案两两对比。
输出:各方案的量化得分或者同一级的指标权重。

3、案例示例

案例:通过构建评价指标(景色、费用,居住,饮食、旅途)对候选旅游地(桂林、黄山,北戴河)量化评价,进行选择。

4、建模步骤

1 建立多级递阶的结构模型
按支配关系自上而下分三层建立评价指标体系:
(1)最高层:也称目的层或目标层,是系统想要达到的目标或结果,是系统评价的首要准则。
(2)准则层:是为实现目标层所设立的准则,个数为m。
(3)最底层:也称方案层。是为实现目标所采取的各种方案、措施等,个数为n。

2 构造两两比较判断矩阵

对准则层和方案层构造比较矩阵。
对同一级的要素,以上一级的每个要素为比较目标进行逐对比较,建立判断矩阵。
采用两两成对比较,用 aij 表示要素 Bi 与要素 Bj 对目标 A 的影响程度之比:


称矩阵 A=(aij)为要素判断矩阵。判断矩阵 A 中的 i 元素与 j 元素相对重要度之比用 aij 表示,且有下述关系:


比值越大,则 i 的重要度就越高。
为了使判断定量化,根据 1-9 标度确定每个要素的相对重要度。

3 权重计算
(1)求出矩阵A的最大特征值和以及其对应的特征向量。
(2)对求出的特征向量进行归一化即可得到所求的权重。

4 一致性检验
为保证求得的权重的正确性及合理性,还需要进行一致性检验,一致性检验是判断主观上的逻辑赋权是否超出合理范围。
计算一致性指标 C.I.


其中,


显然,n越大,C.I.的误差越大。因此,在检验时引入随机性一致性比值C.R.

其中R.I.是随机一致性指标,由下表可查

在这里插入图片描述

当随机一致性比率C.R.< 0.1时认为计算所得的层次排序权重是正确的、合理的,否则,需要重新调整判断矩阵,直到一致性检验合格为止。

5、计算方案层权重

第i个方案权重:a_{j}为第j个准则的权重,b_{ij}为第i个方案在第j个准则的得分,其中\sum_{i=1}^{n}b_{ij}=1

w_{i}=\sum_{j=1}^{m}a_{j}b_{ij}

最后将各个方案进行排序。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用层次分析法进行综合评价的C++代码: ``` #include <iostream> #include <vector> #include <cmath> using namespace std; // 定义矩阵类型 typedef vector<vector<double>> Matrix; // 计算矩阵行向量的和 double sumRow(Matrix mat, int row) { double sum = 0.0; for (int j = 0; j < mat[row].size(); j++) { sum += mat[row][j]; } return sum; } // 计算矩阵列向量的和 double sumCol(Matrix mat, int col) { double sum = 0.0; for (int i = 0; i < mat.size(); i++) { sum += mat[i][col]; } return sum; } // 计算矩阵的特征向量 vector<double> calcEigenVector(Matrix mat) { int n = mat.size(); // 矩阵大小 double lambda; // 特征值 double eps = 1e-10; // 精度 double err; // 误差 vector<double> eigenVec(n, 1.0); // 初始特征向量 vector<double> tmpVec(n); // 存储中间计算结果 // 迭代计算特征向量 do { // 计算中间结果 for (int i = 0; i < n; i++) { double sum = 0.0; for (int j = 0; j < n; j++) { sum += mat[i][j] * eigenVec[j]; } tmpVec[i] = sum; } // 计算特征值 lambda = 0.0; for (int i = 0; i < n; i++) { lambda += eigenVec[i] * tmpVec[i]; } // 归一化特征向量 double norm = 0.0; for (int i = 0; i < n; i++) { eigenVec[i] = tmpVec[i] / lambda; norm += eigenVec[i] * eigenVec[i]; } norm = sqrt(norm); for (int i = 0; i < n; i++) { eigenVec[i] /= norm; } // 计算误差 err = 0.0; for (int i = 0; i < n; i++) { err += abs(tmpVec[i] - lambda * eigenVec[i]); } } while (err > eps); return eigenVec; } // 计算权重矩阵 Matrix calcWeightMatrix(vector<vector<double>> data) { int n = data.size(); // 数据个数 Matrix weightMat(n, vector<double>(n)); // 权重矩阵 // 计算总和向量 vector<double> sumVec(n); for (int i = 0; i < n; i++) { sumVec[i] = sumRow(data, i); } // 计算权重矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { weightMat[i][j] = data[i][j] / (sumVec[j] + 1e-10); } } return weightMat; } // 计算一维向量的加权和 double calcWeightedSum(vector<double> vec, vector<double> weightVec) { double sum = 0.0; for (int i = 0; i < vec.size(); i++) { sum += vec[i] * weightVec[i]; } return sum; } // 计算综合评价得分 double calcScore(vector<vector<double>> data, vector<double> weightVec) { int n = data.size(); // 数据个数 double score = 0.0; // 计算权重矩阵 Matrix weightMat = calcWeightMatrix(data); // 计算特征向量 vector<double> eigenVec = calcEigenVector(weightMat); // 计算综合评价得分 for (int i = 0; i < n; i++) { score += calcWeightedSum(data[i], eigenVec) * weightVec[i]; } return score; } int main() { // 数据和权重 vector<vector<double>> data = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; vector<double> weightVec = {0.2, 0.3, 0.5}; // 计算综合评价得分 double score = calcScore(data, weightVec); // 输出结果 cout << "The comprehensive evaluation score is " << score << endl; return 0; } ``` 以上代码使用层次分析法计算综合评价得分。其中,`calcEigenVector`函数用于计算矩阵的特征向量,`calcWeightMatrix`函数用于计算权重矩阵,`calcWeightedSum`函数用于计算一维向量的加权和,`calcScore`函数用于计算综合评价得分。在`main`函数中,我们定义了数据和权重,然后调用`calcScore`函数计算综合评价得分,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值