C++实现 层次分析法(AHP)

  

        层次分析法(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 << " ";
}

 

 

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
AHP层次分析法(Analytic Hierarchy Process)是一种用于解决多准则决策问题的定量分析方法,它通过将问题分解成层次结构,利用专家判断和数学计算确定不同因素的权重,最后得出最优方案。 AHP层次分析法的基本步骤包括:构建层次结构、建立判断矩阵、计算权重、一致性检验和结果分析。 首先,我们需要构建问题的层次结构,将问题划分为若干层次,从总目标到具体因素的层次结构。例如,在选择一个适合的旅游目的地的问题中,总目标可以是“选择一个适合的旅游目的地”,下一层次可以是“交通便利性”、“景点丰富性”、“风景独特性”等因素。 然后,我们需要建立判断矩阵,专家根据这些因素之间的重要性,进行两两比较,使用1-9的尺度进行评分。评分标准如下:1表示两者同等重要,3表示前者稍微重要于后者,5表示前者明显重要于后者,7表示前者非常重要于后者,9表示前者绝对重要于后者。同时,对于一对因素的重要性,可与其他一对因素进行比较,以此构建下一层次的判断矩阵。 接下来,我们计算判断矩阵的权重。利用数学计算方法,将判断矩阵的特征向量、最大特征值和随机一致性指标进行计算,得出每个因素的权重。 在计算权重后,我们进行一致性检验,通过比较判断矩阵的一致性指标与随机一致性指标的差距,判断判断矩阵是否具备一致性。如果一致性指标过大,则需要对判断矩阵进行修正,以获得更准确的结果。 最后,我们对计算得出的结果进行分析,得出最优方案。根据不同因素的权重,可以得出最优方案所包含的各个因素的重要性,从而为决策提供科学依据。 综上所述,AHP层次分析法能够通过建立层次结构、建立判断矩阵、计算权重、一致性检验和结果分析,解决多准则决策问题,帮助决策者做出科学、准确的决策。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南无故人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值