1. 项目概述:从决策困境到量化工具
做决策,尤其是面对多个复杂因素交织的决策时,我们常常会陷入“拍脑袋”的困境。比如,你要选一款新手机,预算、性能、拍照、续航、品牌,哪个更重要?不同因素之间如何权衡?又或者,一个团队要评估几个潜在的项目方案,技术可行性、市场前景、成本投入、团队能力,这些指标怎么综合打分?这种时候,光靠感觉是靠不住的,我们需要一个系统性的、能够将主观判断转化为客观数据的工具。层次分析法,就是解决这类多准则决策问题的经典“数学武器”。
我第一次在数学建模竞赛中用到AHP(层次分析法)时,感觉像是打开了一扇新世界的大门。它把看似模糊的“我觉得这个更重要”变成了可以计算、可以检验的权重数字。而MATLAB,作为工程计算和算法实现的利器,则是将AHP理论落地为可执行代码的最佳拍档。但很多新手,包括当年的我,在实现过程中最容易卡壳的地方,就是那个神秘的“一致性检验”——辛辛苦苦构建的判断矩阵,怎么就知道它靠不靠谱呢?不通过检验怎么办?这正是本次分享要解决的核心痛点:不仅用MATLAB实现AHP的基本流程,更要重点攻克“一致性纠错”这个实践中的拦路虎,让你拿到一套即拿即用、自带容错和修正功能的代码工具。
2. 层次分析法核心原理与MATLAB实现逻辑拆解
2.1 AHP的三层结构与判断矩阵构建
AHP的核心思想其实非常直观:分解、比较、综合。首先,我们把一个复杂的决策问题分解成目标层、准则层和方案层。目标层就是你最终要达成的目的(例如“选择最佳手机”);准则层是实现目标所考虑的各个因素(如价格、性能、拍照等);方案层就是待选的各个对象(如手机A、手机B、手机C)。
整个方法的“魔法”始于判断矩阵。对于同一层的元素,我们两两比较它们相对于上一层某个元素的重要性。这个比较不是随意的,AHP创始人萨蒂教授提供了一个1-9标度法:
| 标度 | 含义 |
|---|---|
| 1 | 两个因素相比,具有同等重要性 |
| 3 | 两个因素相比,一个因素比另一个因素稍微重要 |
| 5 | 两个因素相比,一个因素比另一个因素明显重要 |
| 7 | 两个因素相比,一个因素比另一个因素强烈重要 |
| 9 | 两个因素相比,一个因素比另一个因素极端重要 |
| 2,4,6,8 | 上述相邻判断的中间值 |
| 倒数 | 若因素i与j的重要性之比为a_ij,则因素j与i的重要性之比为a_ji = 1/a_ij |
例如,在准则层,相对于“选择最佳手机”这个目标,如果你认为“性能”比“价格”稍微重要,那么性能对价格的标度可设为3,反之价格对性能的标度就是1/3。把所有两两比较的结果填到一个矩阵里,就得到了判断矩阵。这个矩阵理论上应该是“一致”的,即满足传递性:如果A比B重要3倍,B比C重要2倍,那么A应该比C重要6倍。但人脑不是机器,我们的判断常常会不一致,这就引出了至关重要的一致性检验。
2.2 权重计算:特征根法的MATLAB实现
如何从判断矩阵中提取出各元素的权重?最常用的方法是特征根法。其数学原理是:对于一个一致的判断矩阵,其最大特征值 λ_max 等于矩阵的阶数 n,其对应的特征向量经过归一化后,就是各元素的权重向量。
在MATLAB中,计算特征值和特征向量非常方便,主要使用eig函数。但这里有几个实操细节需要注意:
- 确保使用正矩阵:判断矩阵所有元素应为正数。
- 处理复数结果:理论上判断矩阵的特征值应为实数,但由于计算精度或矩阵本身性质,
eig可能返回微小的虚部。我们需要取实部。 - 找到最大特征值及其向量:需要从所有特征值中找出最大的那个,并提取其对应的特征向量。
一个稳健的实现步骤是:
% 假设判断矩阵为 A [V, D] = eig(A); % V是特征向量矩阵,D是对角特征值矩阵 eigenvalues = diag(D); % 提取特征值 [lambda_max, idx] = max(real(eigenvalues)); % 找到最大特征值(取实部) weight_vector = real(V(:, idx)); % 提取对应特征向量(取实部) weight_vector = weight_vector / sum(weight_vector); % 归一化得到权重注意:
eig函数返回的特征向量矩阵,每一列对应一个特征值。max函数返回最大值和其索引,我们利用这个索引找到正确的特征向量列。取real是为了避免极少数情况下出现的微小虚部干扰。
2.3 一致性检验:理论与临界值的设定
得到了 λ_max,我们就可以进行一致性检验了。检验的目的是衡量我们的主观判断偏离理想一致性的程度是否在可接受的范围内。
我们引入几个指标:
- 一致性指标 CI:
CI = (λ_max - n) / (n - 1)。CI 越大,不一致程度越严重。当矩阵完全一致时,λ_max = n,CI = 0。 - 随机一致性指标 RI:这是一个通过随机模拟得到的平均值,与矩阵阶数 n 有关。萨蒂给出了标准的 RI 值表:
| n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| RI | 0 | 0 | 0.52 | 0.89 | 1.12 | 1.26 | 1.36 | 1.41 | 1.46 | 1.49 |
- 一致性比率 CR:
CR = CI / RI。
检验标准:当CR < 0.1时,我们认为判断矩阵的一致性是可以接受的。如果 CR >= 0.1,则说明我们的判断逻辑前后矛盾太严重,需要重新调整判断矩阵中的元素值。
在MATLAB中,我们需要根据矩阵阶数n查表或内置一个RI向量来获取对应的RI值,然后计算CR。
n = size(A, 1); CI = (lambda_max - n) / (n - 1); % 定义RI表(这里扩展到n=10) RI_vec = [0, 0, 0.52, 0.89, 1.12, 1.26, 1.36, 1.41, 1.46, 1.49]; if n <= length(RI_vec) RI = RI_vec(n); else % 对于大于10阶的矩阵,可以用公式近似估算,或提示用户谨慎使用AHP RI = 1.98 * (n - 2) / n; % 一种近似公式 end CR = CI / RI; if CR < 0.1 disp('判断矩阵一致性可接受(CR < 0.1)'); else disp(['判断矩阵一致性不可接受(CR = ', num2str(CR), '),需要调整!']); end3. 一致性不可接受?详解自动化纠错策略与实现
一致性检验不通过,是AHP实践中最常见的问题。手动一个个调整矩阵元素,既繁琐又盲目。这里分享两种我实践中常用的半自动化纠错思路,并给出MATLAB实现。
3.1 方法一:基于矩阵元素的迭代微调法
这种方法的思路是,找出判断矩阵中“最可能出错”的元素,对其进行微调,逐步降低CR值。如何找出“最可能出错”的元素?我们可以利用一致性矩阵的性质。
对于一个完全一致的矩阵A,其元素满足a_ik * a_kj = a_ij。我们可以计算当前矩阵中所有三元组 (i, k, j) 的偏差e_ijk = a_ik * a_kj / a_ij。理想情况下,e_ijk应该等于1。偏差越大,说明经过元素k传递的路径 (i->k->j) 与直接判断 (i->j) 矛盾越严重。
一种简化策略是,计算每个元素a_ij的“局部矛盾度”。我们可以观察,对于固定的i和j,所有可能的k(k≠i,j)对应的a_ik * a_kj的几何平均数,理论上应该接近a_ij。因此,可以定义:delta_ij = (prod_{k≠i,j}(a_ik * a_kj))^(1/(n-2)) / a_ijdelta_ij偏离1越远,说明a_ij这个直接判断与通过其他元素间接推导出的判断矛盾越大。
纠错步骤:
- 计算所有
delta_ij(i<j)。 - 找到
|log(delta_ij)|最大的那个元素,即矛盾最突出的位置(i*, j*)。 - 修正
a_i*j*。一个简单的修正公式是将其调整为几何平均数的值:a_i*j*_new = sqrt( old_value * geometric_mean )。同时,对称元素a_j*i*更新为其倒数。 - 用修正后的矩阵重新计算权重和CR。
- 重复步骤1-4,直到CR < 0.1 或达到最大迭代次数。
实操心得:这种方法调整幅度较小,能较好地保持决策者的原始判断意图。但迭代次数可能较多,且对于严重不一致的矩阵,可能陷入局部循环。建议设置最大迭代次数(如50次),并在每次迭代后输出CR值,监控收敛情况。
3.2 方法二:基于特征向量的启发式调整法
另一种思路更直接:既然我们最终想要的是权重向量W,而一个一致的判断矩阵应满足A * W ≈ λ_max * W,即a_ij ≈ w_i / w_j。那么,当矩阵不一致时,我们可以用计算出的权重向量W来“反推”一个一致矩阵A_consistent,其中a_ij_consistent = w_i / w_j。
然后,比较原始矩阵A和一致矩阵A_consistent的差异。差异最大的元素,就是最需要调整的地方。
纠错步骤:
- 由当前矩阵A计算权重向量W和一致性比率CR。
- 如果CR >= 0.1,构造一致矩阵
A_c,其中A_c(i,j) = W(i) / W(j)。 - 计算差异矩阵
D = abs(A - A_c)。找到D中值最大的元素位置(i*, j*)。这代表原始判断与根据当前权重反推的理论值差距最大。 - 修正原始矩阵。可以将
a_i*j*向A_c(i*,j*)靠近。例如,取一个加权平均:a_i*j*_new = alpha * a_i*j*_old + (1-alpha) * A_c(i*,j*),其中alpha是一个小于1的松弛因子(如0.7),表示不完全信任反推值,保留部分原始判断。同样更新对称元素。 - 用新矩阵重复步骤1,直到CR达标。
注意事项:方法二调整力度可能比方法一大,因为它直接用理论一致值去“纠正”原始值。优点是收敛可能更快。风险是可能过度修正,偏离决策者本意。建议将两种方法结合:先使用方法二快速降低CR到一个中等水平(如从0.2降到0.15),再切换至方法一进行精细微调,这样能在效率和保真度之间取得较好平衡。
3.3 MATLAB纠错函数封装示例
下面是一个整合了两种思路的MATLAB函数框架ahp_with_correction:
function [weights, CR, A_adjusted, iter] = ahp_with_correction(A, max_iter, method) % AHP权重计算与一致性自动纠错 % 输入: % A - 判断矩阵 % max_iter - 最大迭代次数(默认50) % method - 纠错方法:'fine_tune'(微调) 或 'heuristic'(启发式),默认'hybrid'(混合) % 输出: % weights - 权重向量 % CR - 最终的一致性比率 % A_adjusted - 调整后的判断矩阵 % iter - 实际迭代次数 if nargin < 2 max_iter = 50; end if nargin < 3 method = 'hybrid'; end A_curr = A; n = size(A, 1); RI = get_RI(n); % 假设有一个获取RI的函数 iter = 0; CR_history = zeros(1, max_iter); for iter = 1:max_iter % 1. 计算当前矩阵的权重和CR [weights, lambda_max] = calculate_weights(A_curr); % 计算权重的子函数 CI = (lambda_max - n) / (n - 1); CR = CI / RI; CR_history(iter) = CR; % 2. 检查一致性 if CR < 0.1 fprintf('经过 %d 次调整,一致性已满足要求(CR=%.4f)。\n', iter-1, CR); A_adjusted = A_curr; break; end % 3. 根据选择的方法进行矩阵调整 switch method case 'fine_tune' A_curr = adjust_by_fine_tune(A_curr, weights); case 'heuristic' A_curr = adjust_by_heuristic(A_curr, weights, 0.7); % alpha=0.7 case 'hybrid' if CR > 0.15 % 初期用启发式快速下降 A_curr = adjust_by_heuristic(A_curr, weights, 0.8); else % 后期用微调精细修正 A_curr = adjust_by_fine_tune(A_curr, weights); end end % 4. 确保矩阵互反性(a_ji = 1/a_ij) for i = 1:n for j = i+1:n A_curr(j, i) = 1 / A_curr(i, j); end end end if iter == max_iter && CR >= 0.1 warning('已达到最大迭代次数%d,CR=%.4f仍未小于0.1。建议手动检查判断矩阵。', max_iter, CR); A_adjusted = A_curr; end % 可选:绘制CR收敛曲线 % figure; plot(1:iter, CR_history(1:iter), '-o'); % xlabel('迭代次数'); ylabel('一致性比率 CR'); % title('AHP一致性纠错收敛过程'); % grid on; end % --- 子函数1:微调调整 --- function A_new = adjust_by_fine_tune(A, W) n = size(A, 1); A_new = A; max_delta = 0; pos_i = 1; pos_j = 2; % 记录最大矛盾位置 for i = 1:n for j = i+1:n % 计算几何平均路径值 k_set = setdiff(1:n, [i, j]); if isempty(k_set) geo_mean = 1; else prod_vals = arrayfun(@(k) A(i,k) * A(k,j), k_set); geo_mean = prod(prod_vals)^(1/length(k_set)); end delta = geo_mean / A(i, j); if abs(log(delta)) > max_delta max_delta = abs(log(delta)); pos_i = i; pos_j = j; end end end % 调整矛盾最大的元素 k_set = setdiff(1:n, [pos_i, pos_j]); if ~isempty(k_set) prod_vals = arrayfun(@(k) A(pos_i,k) * A(k,pos_j), k_set); geo_mean = prod(prod_vals)^(1/length(k_set)); % 取原值和几何平均的平方根作为新值,平滑调整 A_new(pos_i, pos_j) = sqrt(A(pos_i, pos_j) * geo_mean); A_new(pos_j, pos_i) = 1 / A_new(pos_i, pos_j); end end % --- 子函数2:启发式调整 --- function A_new = adjust_by_heuristic(A, W, alpha) n = size(A, 1); A_new = A; % 构造理论一致矩阵 A_consistent = zeros(n); for i = 1:n for j = 1:n A_consistent(i, j) = W(i) / W(j); end end % 找到差异最大的元素(只考虑上三角) D = abs(A - A_consistent); max_diff = 0; pos_i = 1; pos_j = 2; for i = 1:n for j = i+1:n if D(i, j) > max_diff max_diff = D(i, j); pos_i = i; pos_j = j; end end end % 加权调整 A_new(pos_i, pos_j) = alpha * A(pos_i, pos_j) + (1-alpha) * A_consistent(pos_i, pos_j); A_new(pos_j, pos_i) = 1 / A_new(pos_i, pos_j); end4. 完整AHP-MATLAB实战:以项目评选为例
现在,我们用一个完整的例子串起所有流程。假设一个研发团队要从三个项目(P1, P2, P3)中选出一个优先启动,评估准则有四个:技术先进性(C1)、市场潜力(C2)、开发成本(C3)、团队匹配度(C4)。
4.1 构建判断矩阵与初始计算
首先,决策者(或通过专家打分)构建准则层相对于目标的判断矩阵A_criteria,以及每个方案相对于各准则的判断矩阵A1,A2,A3,A4。
% 准则层判断矩阵 (相对于目标:选择最佳项目) A_criteria = [1, 1/3, 2, 4; 3, 1, 5, 6; 1/2, 1/5, 1, 2; 1/4, 1/6, 1/2, 1]; % 方案层判断矩阵 % 相对于准则C1(技术先进性) A1 = [1, 3, 5; 1/3, 1, 2; 1/5, 1/2, 1]; % 相对于准则C2(市场潜力) A2 = [1, 1/4, 1/2; 4, 1, 3; 2, 1/3, 1]; % 相对于准则C3(开发成本)- 成本是负向指标,数值越小越好,比较时注意逻辑 A3 = [1, 2, 3; 1/2, 1, 2; 1/3, 1/2, 1]; % 这里假设P1成本最高,P3成本最低 % 相对于准则C4(团队匹配度) A4 = [1, 1/3, 1/5; 3, 1, 1/2; 5, 2, 1]; % 计算准则层权重 [w_criteria, CR_cri, A_cri_adj, iter_cri] = ahp_with_correction(A_criteria, 50, 'hybrid'); fprintf('准则层权重: [C1: %.3f, C2: %.3f, C3: %.3f, C4: %.3f]\n', w_criteria); fprintf('准则层CR: %.4f, 迭代次数: %d\n', CR_cri, iter_cri);运行后,我们可能得到类似以下的输出:
经过 3 次调整,一致性已满足要求(CR=0.0862)。 准则层权重: [C1: 0.212, C2: 0.558, C3: 0.102, C4: 0.128] 准则层CR: 0.0862, 迭代次数: 3这表明市场潜力(C2)被赋予最高权重,技术先进性(C1)次之,与我们的初始矩阵设定相符,且经过3次自动调整后一致性达标。
4.2 方案层计算与总排序合成
接着,计算每个方案在各准则下的权重,并合成最终总得分。
% 计算各方案相对于每个准则的权重 [w1, CR1] = ahp_with_correction(A1); [w2, CR2] = ahp_with_correction(A2); [w3, CR3] = ahp_with_correction(A3); [w4, CR4] = ahp_with_correction(A4); % 检查方案层各矩阵的一致性 fprintf('方案层一致性比率: CR1=%.4f, CR2=%.4f, CR3=%.4f, CR4=%.4f\n', CR1, CR2, CR3, CR4); % 构建方案权重矩阵 (每一列是一个准则下各方案的权重) W_scheme = [w1, w2, w3, w4]; % 3x4 矩阵 % 计算各方案的总得分 (加权和) total_scores = W_scheme * w_criteria; % 3x4 * 4x1 = 3x1 % 输出结果 project_names = {'项目P1', '项目P2', '项目P3'}; for i = 1:3 fprintf('%s 总得分: %.4f\n', project_names{i}, total_scores(i)); end % 排序 [sorted_scores, idx] = sort(total_scores, 'descend'); fprintf('\n项目推荐优先级排序:\n'); for i = 1:3 fprintf('第%d名: %s (得分: %.4f)\n', i, project_names{idx(i)}, sorted_scores(i)); end输出可能如下:
方案层一致性比率: CR1=0.0372, CR2=0.0516, CR3=0.0372, CR4=0.0372 项目P1 总得分: 0.3012 项目P2 总得分: 0.4385 项目P3 总得分: 0.2603 项目推荐优先级排序: 第1名: 项目P2 (得分: 0.4385) 第2名: 项目P1 (得分: 0.3012) 第3名: 项目P3 (得分: 0.2603)4.3 结果分析与可视化
得到排序后,不能只看一个数字。我们需要分析:
- 权重敏感性:市场潜力(C2)权重高达0.558,它对最终结果起决定性作用。如果决策者对市场潜力的判断稍有改变,结果会如何?可以微调
A_criteria中相关元素,重新计算,观察排序是否稳定。 - 方案优势分析:项目P2胜出,主要得益于其在市场潜力(C2)和团队匹配度(C4)这两个高权重准则下的优异表现。我们可以输出它在每个准则下的得分贡献。
- 可视化:用条形图展示准则权重和方案得分,更直观。
% 可视化准则权重 figure('Position', [100, 100, 1200, 500]); subplot(1,2,1); bar(w_criteria); set(gca, 'XTickLabel', {'技术先进性(C1)', '市场潜力(C2)', '开发成本(C3)', '团队匹配度(C4)'}); ylabel('权重'); title('评估准则权重分布'); grid on; % 可视化各方案在不同准则下的得分及总分 subplot(1,2,2); % 计算每个方案在各准则下的加权得分 weighted_scores = W_scheme .* w_criteria'; % 按准则加权 b = bar(weighted_scores, 'stacked'); hold on; % 在堆叠图上叠加总得分 plot(1:3, total_scores, 'ko-', 'LineWidth', 2, 'MarkerSize', 10, 'MarkerFaceColor', 'w'); legend([b], {'C1贡献', 'C2贡献', 'C3贡献', 'C4贡献'}, 'Location', 'best'); set(gca, 'XTickLabel', project_names); ylabel('加权得分'); title('各方案得分分解(堆叠)与总分(黑点连线)'); grid on; hold off;通过图表,可以清晰看到项目P2在C2和C4上的巨大优势,以及项目P1和P3的短板所在。这种分析比单纯一个排名更有决策支持价值。
5. 常见问题、避坑指南与扩展思考
在实际使用这套AHP-MATLAB工具时,你肯定会遇到一些坑。这里把我踩过的雷和解决方案总结一下。
5.1 判断矩阵构建的常见陷阱
- 标度混用:有人喜欢用1-5标度,有人用1-9,甚至自定义。必须统一使用1-9标度法,因为RI表是基于此标度系统通过大量随机实验得到的。混用标度会导致CR检验失效。
- “中庸”赋值:为了避免极端,所有比较都赋值为2或1/2。这会导致矩阵元素区分度不足,计算出的权重可能非常接近,失去了排序的意义。要敢于使用3、5、7等标度来体现真实的偏好差异。
- 忽略互反性:构建矩阵时,只填了上三角部分,忘记下三角部分应该是上三角的倒数。我们的代码虽然最后有互反性检查与修复,但最好在输入时就保证正确。
5.2 MATLAB实现中的数值问题
- 特征向量方向:
eig函数计算出的特征向量,其方向(全体元素的符号)可能不确定。但这不影响归一化后的权重,因为权重是相对值。不过,如果发现权重向量中有负数(在取实部后),那通常意味着判断矩阵存在严重问题(如含有负值或结构错误),而非计算问题。 - 矩阵病态:当判断矩阵非常不一致,或者元素数量级相差巨大(如同时存在9和1/9)时,矩阵可能病态,导致特征值计算不准确。MATLAB的
eig函数对于病态矩阵比较敏感。如果遇到CR计算异常(如NaN或极大值),可以尝试:- 检查矩阵元素是否在合理范围(1/9 到 9)。
- 使用
cond(A)查看矩阵的条件数,如果非常大(如 > 1e10),说明矩阵病态,需要重新审视判断。
- 阶数过高:AHP适用于元素数量不太多的情况(通常 n <= 10)。当准则或方案过多时,两两比较的工作量呈指数增长,且判断矩阵更容易不一致。此时应考虑对准则进行聚类,或者使用其他方法(如网络层次分析法ANP)。
5.3 一致性纠错功能的局限性
- 不是万能的:自动纠错算法旨在修正“轻微”的逻辑不一致。如果初始判断矩阵完全混乱(例如,随意填写的数字),算法可能无法收敛,或者收敛到一个毫无意义的结果。纠错的前提是决策者的初始判断大体上是合理的。
- 可能改变决策意图:自动调整会修改原始判断值。虽然我们采用了平滑策略,但仍需在调整后检查最终矩阵,看关键的两两比较关系(如谁比谁重要)是否发生了根本性逆转。如果发生了,说明初始判断可能存在深层矛盾,需要人工介入重新评估。
- 迭代次数设置:
max_iter不宜设置过小(如10),否则可能未收敛就退出;也不宜过大(如1000),对于无法收敛的矩阵会徒耗时间。50-100是一个比较合理的范围。
5.4 扩展:如何处理成本型等负向指标?
在我们的例子中,“开发成本(C3)”是成本,越低越好。但在AHP判断矩阵中,数值越大表示越“重要”或越“优”。对于成本型指标,有两种处理方式:
- 方法A(推荐):在构建判断矩阵时,将比较的逻辑反转。例如,如果P1成本高于P2,那么在成本准则下,P2比P1“重要”(因为我们希望成本低)。所以赋值时,P2相对于P1的重要性标度可以是3或5(取决于高多少)。这样,计算出的权重越大,代表方案在该成本准则上越“优”(即成本越低)。
- 方法B:先按正常逻辑构建矩阵(成本高则标度值大),计算出的权重代表“成本高”的优先度。然后在最后合成总得分前,对成本准则的权重向量取倒数并重新归一化,或者更常见的是,在准则层就将成本准则的权重设为负值(但这不符合AHP的合成原理)。方法A在逻辑上更清晰、更一致。
5.5 让分析更稳健:敏感性分析
决策不是一锤子买卖。我们可以通过简单的脚本进行敏感性分析,看看结论是否可靠。
% 简易敏感性分析:微调“市场潜力(C2)”的权重 base_weight = w_criteria(2); adjust_range = 0.9:0.02:1.1; % 权重在90%到110%之间变化 results = zeros(length(adjust_range), 3); % 存储不同权重下三个项目的得分 rank_changes = cell(length(adjust_range), 1); for i = 1:length(adjust_range) w_temp = w_criteria; w_temp(2) = base_weight * adjust_range(i); % 保持其他准则权重比例不变,重新归一化 w_temp = w_temp / sum(w_temp); scores_temp = W_scheme * w_temp; results(i, :) = scores_temp'; [~, idx_temp] = sort(scores_temp, 'descend'); rank_changes{i} = idx_temp; end % 找出导致排名变化的临界点 initial_rank = rank_changes{find(adjust_range == 1.0)}; % 基准排名 for i = 1:length(adjust_range) if ~isequal(rank_changes{i}, initial_rank) fprintf('当C2权重调整为基准的%.1f%%时,项目排名发生变化。\n', adjust_range(i)*100); break; end end这个分析能告诉你,决策者对“市场潜力”这个最关键准则的判断,需要偏差多大才会改变最终的方案排序。如果很小的偏差就导致翻盘,说明这个决策结果很脆弱,需要更审慎地确定C2的权重。