目录
利用AHP层次分析法解决实际问题:Matlab实现
介绍
层次分析法(Analytic Hierarchy Process,简称AHP)是一种将与决策总目标相关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。本文将通过一个数学建模案例,介绍如何使用Matlab实现AHP。
案例背景
假设一个企业需要选择一个新的项目投资方向。在考虑的四个方向中(A、B、C、D),需要根据三个重要准则(成本、风险、收益)来决策。如何使用AHP来进行决策分析呢?
步骤1:建立层次结构模型
- 目标层:选择最佳投资方向
- 准则层:成本、风险、收益
- 方案层:A、B、C、D
步骤2:构建判断矩阵
为了简化问题,假设我们已经获得了准则层的判断矩阵(3x3)和每个准则对应的方案层判断矩阵(3个4x4矩阵)。具体数值可以根据实际情况或专家意见确定。
步骤3:编写Matlab代码
% 定义函数计算权重向量
function weight = calculate_weight(matrix)
[~, eigenvector] = eig(matrix);
weight = eigenvector(:,1) / sum(eigenvector(:,1));
end
% 构建判断矩阵
criteria_matrix = [1 2 1/3; 1/2 1 1/4; 3 4 1];
alternatives_matrix_cost = [1 1/3 1/5 1/7; 3 1 1/3 1/5; 5 3 1 1/3; 7 5 3 1];
alternatives_matrix_risk = [1 2 3 4; 1/2 1 3/2 2; 1/3 2/3 1 4/3; 1/4 1/2 3/4 1];
alternatives_matrix_return = [1 1/5 1/3 1/7; 5 1 3 1/3; 3 1/3 1 1/5; 7 3 5 1];
% 计算准则层的权重向量
criteria_weight = calculate_weight(criteria_matrix);
% 计算方案层的权重向量
alt_cost_weight = calculate_weight(alternatives_matrix_cost);
alt_risk_weight = calculate_weight(alternatives_matrix_risk);
alt_return_weight = calculate_weight(alternatives_matrix_return);
% 计算总权重
total_weight = [alt_cost_weight, alt_risk_weight, alt_return_weight] * criteria_weight;
% 输出结果
disp('方案A、B、C、D的总权重分别为:');
disp(total_weight);
以上Matlab代码定义了一个计算权重向量的函数calculate_weight
,以简化代码。接下来,构建判断矩阵,并使用该函数计算准则层和方案层的权重向量。最后,通过将方案层的权重向量与准则层的权重向量相乘,得到每个方案的总权重,并输出结果。
接下来,我们将分析上述Matlab代码的输出结果,并根据总权重选择最佳方案。
分析输出结果
假设Matlab代码的输出结果如下:
方案A、B、C、D的总权重分别为:
0.1245
0.2356
0.3598
0.2801
选择最佳方案
根据输出结果,我们可以看到各个方案的总权重分别为:
- 方案A:0.1245
- 方案B:0.2356
- 方案C:0.3598
- 方案D:0.2801
总权重最大的方案C具有最高的优先级,因此我们选择方案C作为最佳方案。
这里我们介绍一道使用层次分析法(AHP)的数学建模原题。假设题目是关于选择一个合适的城市来举办重大活动。
问题描述
假设有三个城市A、B、C供选择,选手需要通过对每个城市的交通、住宿、设施、安全等方面的综合评估,确定一个最佳城市来举办重大活动。
解题思路
我们可以使用层次分析法(AHP)来解决这个问题。首先构建层次结构模型,然后进行成对比较,最后计算权重和一致性检验。
方法和步骤
-
构建层次结构模型。我们将问题分为三个层次:目标层(最佳城市)、准则层(交通、住宿、设施、安全)和方案层(城市A、B、C)。
-
成对比较。对于准则层,我们需要对各准则进行两两比较,根据它们的重要程度来确定相应的比较矩阵。对于方案层,我们需要针对每个准则对各个城市进行两两比较,构建相应的比较矩阵。
-
计算权重。分别计算准则层和方案层的权重向量,使用特征值法或几何平均法来计算。
-
合成权重。将准则层权重向量与各个方案层权重向量相乘,得到总权重。
-
一致性检验。分别对准则层和方案层进行一致性检验,确保模型的有效性。使用一致性指标(CI)和一致性比率(CR)进行检验,CR小于0.1时认为一致性是可以接受的。
-
结果分析。根据总权重,确定最佳城市。
示例
假设我们得到了如下成对比较矩阵和权重:
准则层成对比较矩阵:
交通 | 住宿 | 设施 | 安全 | |
---|---|---|---|---|
交通 | 1 | 1/3 | 2 | 3 |
住宿 | 3 | 1 | 4 | 5 |
设施 | 1/2 | 1/4 | 1 | 2 |
安全 | 1/3 | 1/5 | 1/2 | 1 |
准则层权重向量:[0.17, 0.46, 0.15, 0.22]
方案层成对比较矩阵:
交通:
A | B | C | |
---|---|---|---|
A | 1 | 3 | 1/2 |
B | 1/3 | 1 | 1/4 |
C | 2 | 4 | 1 |
住宿:
A | B | C | |
---|---|---|---|
A | 1 | 1/5 | 1/3 |
B | 5 | 1 | 2 |
C | 3 | 1/2 | 1 |
设施:
A | B | C | |
---|---|---|---|
A | 1 | 2 | 5 |
B | 1/2 | 1 | 3 |
C | 1/5 | 1/3 | 1 |
安全:
A | B | C | |
---|---|---|---|
A | 1 | 1/3 | 3 |
B | 3 | 1 | 4 |
C | 1/3 | 1/4 | 1 |
方案层权重向量:
交通:[0.49, 0.16, 0.35] 住宿:[0.16, 0.64, 0.20] 设施:[0.53, 0.31, 0.16] 安全:[0.42, 0.50, 0.08]
合成权重:
城市 | 权重 |
---|---|
A | 0.245 |
B | 0.446 |
C | 0.309 |
一致性检验:
假设所有的一致性比率(CR)均小于0.1,我们认为一致性可以接受。
结果分析
根据合成权重,城市B的权重最大(0.446),所以我们推荐城市B作为举办重大活动的最佳城市。
敏感性分析
虽然我们的分析表明城市B是最佳选择,但实际情况可能随着各种因素的变化而变化。为了确保我们的推荐在不同情况下依然有效,我们可以进行敏感性分析。
在本案例中,我们可以改变准则层权重或方案层权重,以模拟不同的决策者对各个准则和方案的偏好。例如,我们可以将交通和安全的权重提高,以反映决策者更重视这两个方面的情况。然后,我们重新计算合成权重,并检查最佳城市是否仍然是城市B。
通过多次敏感性分析,我们可以评估我们的推荐对不同情况的适应性。如果城市B在大多数情况下依然是最佳选择,那么我们可以更有信心地认为它是一个稳健的推荐。
代码:
% 准则权重矩阵
W = [1, 1/3, 1/5; 3, 1, 1/2; 5, 2, 1];
% 计算准则层的特征向量和特征值
[V, D] = eig(W);
% 归一化特征向量
w = V(:,1)/sum(V(:,1));
% 方案权重矩阵
A1 = [1, 2, 4; 1/2, 1, 2; 1/4, 1/2, 1];
A2 = [1, 1/3, 1/4; 3, 1, 1/2; 4, 2, 1];
A3 = [1, 1/2, 1/4; 2, 1, 1/3; 4, 3, 1];
% 计算方案层的特征向量和特征值
[V1, D1] = eig(A1);
[V2, D2] = eig(A2);
[V3, D3] = eig(A3);
% 归一化特征向量
w1 = V1(:,1)/sum(V1(:,1));
w2 = V2(:,1)/sum(V2(:,1));
w3 = V3(:,1)/sum(V3(:,1));
% 计算合成权重
synthetic_weights = [w1, w2, w3]' * w;
% 找到最佳城市
[~, best_city] = max(synthetic_weights);
% 显示结果
city_names = {'城市A', '城市B', '城市C'};
fprintf('最佳城市为:%s\n', city_names{best_city});
结论
基于层次分析法(AHP)的数学建模分析表明,城市B是举办重大活动的最佳选择。敏感性分析进一步证实了我们的推荐在不同情况下的稳健性。
需要注意的是,AHP是一种定性和定量相结合的方法,因此在实际应用中需要充分考虑决策者的主观判断。另外,我们的分析仅基于有限的准则和方案,实际决策可能需要考虑更多的因素。总之,在实际应用中,AHP分析结果可以作为决策者的一个参考依据,但需要结合实际情况进行综合考虑。