层次分析法(Analytic Hierarchy Process,AHP)这是一种定性和定量相结合的、系统的、层次化的分析方法。这种方法的特点就是在对复杂决策问题的本质、影响因素及其内在关系等进行深入研究的基础上,利用较少的定量信息使决策的思维过程数学化,从而为多目标、多准则或无结构特性的复杂决策问题提供简便的决策方法。是对难以完全定量的复杂系统做出决策的模型和方法。
层次分析法主要分为四个步骤:
1. 建立层次结构模型;
2. 构造判断(成对比较)矩阵;
3. 层次单排序及其一致性检验;
4. 层次总排序及其一致性检验;
(以上图文参自《信息安全管理与风险评估》毕方明)
C++实现:
输入
第一行输入第二层中元素的个数n
接下来输入n行数据,表示第二层的n行n列判断矩阵
之后一行输入第三层(方案层)的元素个数m
接下来输入n组数据
每组数据都是m行m列的判断矩阵
输出
输出一行,表示第三层层次总排序的权重。
样例输入
3
1 1/3 1/3
3 1 1
3 1 1
2
1 1/4
4 1
1 1/3
3 1
1 7
1/7 1
样例输出
0.5107 0.4893
#include<iostream>
#include<vector>
#include <iomanip>
#include<string>
#include<algorithm>
using namespace std;
vector<float> fuction1(vector<vector<float>> v1)
{
vector<float> sum;
float sum1 = 0;
//列向量归一化
for (int i = 0; i < v1[0].size(); i++)
{
sum1 = 0;
for (int j = 0; j < v1.size(); j++)
{
sum1+= v1[j][i];
}
sum.push_back(sum1);
}
for (int i = 0; i < v1[0].size(); i++)
for (int j = 0; j < v1.size(); j++)
v1[i][j] /= sum[j];
//求行和并归一化
vector<float> sum2;
float sum3 = 0;
for (int i = 0; i < v1[0].size(); i++)
{
sum3 = 0;
for (int j = 0; j < v1.size(); j++)
{
sum3 += v1[i][j];
}
sum2.push_back(sum3);
}
float sum4 = 0;
for (int i = 0; i < sum2.size(); i++)
sum4 += sum2[i];
for (int i = 0; i < sum2.size(); i++)
sum2[i] /= sum4;
return sum2;
}
int main()
{
int n,m;
cin >> n;
string haha;
vector<vector<float>> a(n, vector<float>(n)); //判断矩阵
for (int i = 0; i < n;i++)
for (int j = 0; j < n; j++)
{
cin >> haha;
auto x = find(haha.begin(), haha.end(), '/');
if (x== haha.end())
a[i][j] = stof(haha);
else
{
string left(haha.begin(), x);
string right(x + 1, haha.end());
a[i][j] = stof(left) / stof(right);
}
}
vector<float> b(fuction1(a));//特征向量
cin >> m;
vector<vector<float>> t(m, vector<float>(n));
for (int k = 0; k < n; k++)
{
vector<vector<float>> r(m, vector<float>(m));
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
{
cin >> haha;
auto x = find(haha.begin(), haha.end(), '/');
if (x == haha.end())
r[i][j] = stof(haha);
else
{
string left(haha.begin(), x);
string right(x + 1, haha.end());
r[i][j] = stof(left) / stof(right);
}
}
vector<float> b1(fuction1(r));
for (int p = 0; p < m; p++)
{
t[p][k] = b1[p];
}
}
//相乘 t 和 b
vector<float> end;
float tsum = 0;
for (int i = 0; i < t.size(); i++)
{
tsum = 0;
for (int j = 0; j < t[0].size(); j++)
{
tsum += t[i][j] * b[j];
}
end.push_back(tsum);
}
for (auto e : end)
cout << fixed << showpoint << setprecision(4) << e << " ";
}