正在加载中...

展开本页目录
算法教程BWM-最佳-最坏法

BWM-最佳-最坏法

No.076 · 在线教程

BWM(Best-Worst Method,最佳-最坏法)是一种典型的主观赋权方法。其核心思想是:先从全部准则中识别出“最佳准则” B 与“最差准则” W,再分别构造“最佳相对其他准则”的偏好向量与“其他准则相对最差准则”的偏好向量,最后通过极小化最大偏差的线性规划模型求解权重。

BWM-最佳-最坏法

1. 方法概述

BWM(Best-Worst Method,最佳-最坏法)是一种典型的主观赋权方法。其核心思想是:先从全部准则中识别出“最佳准则” \(B\) 与“最差准则” \(W\),再分别构造“最佳相对其他准则”的偏好向量与“其他准则相对最差准则”的偏好向量,最后通过极小化最大偏差的线性规划模型求解权重。

就本项目的具体实现而言,BWM 模块并非只支持一种固定输入方式,而是包含两条共享同一求解核心的流程:

  • 正向流程:用户先上传准则清单,再手工指定最佳/最差准则,并录入两组 \(1\sim 9\) 标度偏好值;
  • 逆向流程:用户先上传准则清单,再导入专家评分表,程序先根据专家评分自动倒推 BWM 所需的偏好向量,随后仍调用同一线性规划核心求解权重。

设参与计算的准则集合为

$$ C=\{C_1,C_2,\ldots,C_n\} \tag{1} $$

设对应的权重向量为

$$ w=\big(w_1,w_2,\ldots,w_n\big)^\top, \quad w_j\ge 0, \quad \sum_{j=1}^{n}w_j=1 \tag{2} $$

式(2)中的 \(w_j\) 即项目最终输出的准则权重。

2. 输入结构与参数生成

2.1 准则文件结构

本项目的 BWM 模块首先要求用户上传“准则文件”。上传页 ui/upload_widget.py 当前支持两种输入格式:

  • 单列准则清单:文件仅有 1 列,每行对应一个准则名称;
  • 评价矩阵模板:文件列数不少于 2 列,默认第 1 列为对象名称,其余列名被解析为准则名称。

因此,程序实际参与计算的准则集合并不一定来自单独的“准则表”,也可以来自已有评价矩阵模板的列名。若解析得到的准则数量少于 2,或存在重复名称,程序会直接报错并终止。

在指标选择页中,用户可以从解析出的准则集合中筛选子集,并进一步指定最佳准则 \(B\) 与最差准则 \(W\)。于是,可将当前进入 BWM 计算的有效准则集记为

$$ \tilde{C}=\{C_1,C_2,\ldots,C_n\}, \quad B\in \tilde{C}, \quad W\in \tilde{C}, \quad B\neq W \tag{3} $$

下文中的所有偏好向量与权重求解,都以式(3)的有效准则集为基础。

2.2 正向流程下的偏好向量

在正向流程下,用户需要填写两组 BWM 偏好向量。第一组为“最佳相对其他准则”的偏好向量:

$$ a_{B\bullet}=\big(a_{B1},a_{B2},\ldots,a_{Bn}\big), \quad a_{BB}=1 \tag{4} $$

其中 \(a_{Bj}\) 表示最佳准则 \(B\) 相对于准则 \(C_j\) 的偏好强度。

第二组为“其他准则相对最差准则”的偏好向量:

$$ a_{\bullet W}=\big(a_{1W},a_{2W},\ldots,a_{nW}\big)^\top, \quad a_{WW}=1 \tag{5} $$

其中 \(a_{jW}\) 表示准则 \(C_j\) 相对于最差准则 \(W\) 的偏好强度。

当前实现要求两组偏好值均采用 \(1\sim 9\) 的整数标度,因此有

$$ 1\le a_{Bj}\le 9, \qquad 1\le a_{jW}\le 9, \qquad j=1,2,\ldots,n \tag{6} $$

项目在输入页中还额外加入了一个工程化同步约束:当用户修改“最佳准则相对最差准则”的值时,程序会自动把该值同步写入另一组向量中的对应位置。因此,程序内部始终强制

$$ a_{BW}^{(B\to O)}=a_{BW}^{(O\to W)}=a_{BW} \tag{7} $$

更具体地说,ui/methods_widget.py 会把 best_to_others[worst] 自动同步到 others_to_worst[best],而 core/calculator.py 在求解前也再次执行这一覆盖,以保证两组向量中的 \(a_{BW}\) 保持一致。

2.3 逆向流程下的参数倒推

逆向流程不是更换另一套 BWM 求解公式,而是先由专家评分表生成式(4)与式(5)中的偏好向量,然后再调用同一求解器。

设共有 \(K\) 位专家,专家评分表中第 \(k\) 位专家对第 \(j\) 个准则给出的评分记为 \(s_{kj}\),则原始评分矩阵可记为

$$ S=(s_{kj})_{K\times n} \tag{8} $$

若评分表中存在 专家权重权重weightWeight 列,则程序将其识别为专家权重;若不存在该列,或该列求和不大于 0,则自动退化为等权平均。记归一化后的专家权重为

$$ \rho_k\ge 0, \qquad \sum_{k=1}^{K}\rho_k=1 \tag{9} $$

于是程序首先计算各准则的加权平均评分:

$$ \bar{s}_j=\sum_{k=1}^{K}\rho_k s_{kj}, \qquad j=1,2,\ldots,n \tag{10} $$

然后按平均评分自动识别最佳准则与最差准则:

$$ B=\arg\max_{1\le j\le n}\bar{s}_j, \qquad W=\arg\min_{1\le j\le n}\bar{s}_j \tag{11} $$

在此基础上,逆向流程按照评分比值倒推 BWM 偏好值。程序当前实现为:先取比值,再截断到 \([1,9]\) 区间,最后四舍五入为整数。因此

$$ a_{Bj} = \operatorname{round} \left[ \operatorname{clip} \left( \frac{\bar{s}_B}{\max(\bar{s}_j,\varepsilon)}, 1,9 \right) \right] \tag{12} $$

$$ a_{jW} = \operatorname{round} \left[ \operatorname{clip} \left( \frac{\bar{s}_j}{\max(\bar{s}_W,\varepsilon)}, 1,9 \right) \right] \tag{13} $$

其中 \(\varepsilon\) 为极小正数,用于避免除零。由式(12)与式(13)生成的两组偏好向量,将被直接写回输入表格,再进入下一步的线性规划求解。

3. BWM 线性规划模型

3.1 极小化最大偏差模型

本项目的 core/calculator.py 采用 BWM 的经典极小化最大偏差模型。设 \(\xi\) 表示两组偏好约束中的最大绝对偏差,则目标函数为

$$ \min \ \xi \tag{14} $$

并满足“最佳相对其他准则”的一致性约束

$$ \left|w_B-a_{Bj}w_j\right|\le \xi, \qquad j=1,2,\ldots,n \tag{15} $$

以及“其他准则相对最差准则”的一致性约束

$$ \left|w_j-a_{jW}w_W\right|\le \xi, \qquad j=1,2,\ldots,n \tag{16} $$

同时要求权重满足归一化与非负性约束:

$$ \sum_{j=1}^{n}w_j=1, \qquad w_j\ge 0 \tag{17} $$

在程序实现中,还进一步对每个权重施加了上界 \(w_j\le 1\),并令 \(\xi\ge 0\)。因此求解器使用的边界条件可写为

$$ 0\le w_j\le 1, \qquad \xi\ge 0 \tag{18} $$

由于式(17)已要求 \(\sum_j w_j=1\),故式(18)中的 \(w_j\le 1\) 并不会改变理论解集,但有助于数值求解稳定。

3.2 绝对值约束的线性化

为便于调用 scipy.optimize.linprog,程序把式(15)与式(16)拆分为线性不等式。对任意准则 \(C_j\),式(15)被改写为

$$ w_B-a_{Bj}w_j-\xi\le 0, \qquad -w_B+a_{Bj}w_j-\xi\le 0 \tag{19} $$

式(16)被改写为

$$ w_j-a_{jW}w_W-\xi\le 0, \qquad -w_j+a_{jW}w_W-\xi\le 0 \tag{20} $$

于是,对 \(n\) 个准则而言,程序总共生成 \(4n\) 条线性不等式,再结合式(17)与式(18)交由 linprog(method="highs") 求解。

3.3 数值求解后的权重整理

求解器返回的最优解记为 \((w_1^\ast,\ldots,w_n^\ast,\xi^\ast)\)。项目代码在返回结果前,又执行了一次“裁剪到 \([0,1]\) 区间后重新归一化”的处理,即

$$ \tilde{w}_j= \frac{\operatorname{clip}(w_j^\ast,0,1)} {\sum_{k=1}^{n}\operatorname{clip}(w_k^\ast,0,1)} \tag{21} $$

式(21)反映了 np.clip 与再归一化的实际实现逻辑。最终结果页与导出 Excel 中展示的权重,即为 \(\tilde{w}_j\)。

4. 一致性检验与约束偏差明细

4.1 单项约束偏差

在获得最终权重后,程序会逐个准则计算两类绝对偏差:

$$ e_j^{(1)}=\left|w_B-a_{Bj}w_j\right|, \qquad e_j^{(2)}=\left|w_j-a_{jW}w_W\right| \tag{22} $$

并进一步记录

$$ e_j=\max\big(e_j^{(1)},e_j^{(2)}\big) \tag{23} $$

程序导出的 一致性明细 工作表正是按式(22)与式(23)生成的,其中还会增加逻辑列 是否满足(max_abs<=xi),用以检查每个准则是否满足

$$ e_j\le \xi^\ast \tag{24} $$

4.2 一致性指标与一致性比率

本项目采用的 BWM 一致性指标 \(CI\) 不是通过一般函数公式在线计算,而是直接依据 \(a_{BW}\) 查表。当前 core/calculator.py 内置的查表口径如下。

表 1 本项目采用的 BWM 一致性指标表

\(a_{BW}\) 1 2 3 4 5 6 7 8 9
\(CI\) 0.00 0.44 1.00 1.63 2.30 3.00 3.73 4.47 5.23

记最优目标值为 \(\xi^\ast\),则程序的一致性比率定义为

$$ CR=\frac{\xi^\ast}{CI(a_{BW})} \tag{25} $$

其中 \(a_{BW}\) 来自 best_to_others[worst]。若查表得到 \(CI(a_{BW})=0\),则项目直接令

$$ CR=0 \tag{26} $$

这对应代码中的 if not ci: cr = 0.0 逻辑。

需要说明的是,当前结果页会直接展示 最优一致性 ξ*CICR 三个值,但代码中并未额外设置类似 “\(CR\le 0.1\) 自动判定通过/不通过” 的硬阈值标签。因此,在论文写作时,研究者通常需要自行补充对 \(CR\) 大小的解释。

5. 输出结构与结果解释

5.1 结果目录与命名方式

程序在每次计算时都会自动创建结果目录。当前实现的默认命名格式为

  • results/<算法名>-<时间戳>-正向
  • results/<算法名>-<时间戳>-逆向

其中“正向/逆向”来自 source_mode 参数,仅用于标识参数来源路径,不会改变核心 BWM 求解公式。

5.2 Excel 导出结构

当前实现会导出一个 .xlsx 文件,至少包含以下工作表:

  • 参数:记录模型名称、源文件路径、准则列表、最佳准则、最差准则、\(a_{BW}\)、\(\xi^\ast\)、\(CI\)、\(CR\) 与输出路径;
  • 偏好向量:记录每个准则对应的 \(a_{Bj}\) 与 \(a_{jW}\);
  • 权重:记录按权重降序排列后的准则及其权重;
  • 一致性明细:记录每个准则的两类约束偏差与是否满足 \(e_j\le \xi^\ast\);
  • 图表清单:记录输出图表文件的路径。

从论文复现的角度看,偏好向量一致性明细 两个工作表尤其重要:前者给出 BWM 的直接输入,后者给出式(22)—式(24)的逐项检验结果。

5.3 图表与复现脚本

除 Excel 外,程序还会额外输出:

  • weights_bar.png:权重水平条形图;
  • repro_bwm_<时间戳>.py:自动生成的复现实验脚本。

该复现脚本会把当前分析使用的准则列表、最佳/最差准则、两组偏好向量和一致性指标表直接写入 Python 文件,并重新调用 scipy.optimize.linprog(highs) 完成一次独立复算。因此,在论文附录或方法复现中,可直接将此脚本作为项目实现口径的旁证。

6. 实现说明与注意事项

6.1 最佳准则与最差准则必须属于已选准则

无论正向还是逆向流程,程序都要求最佳准则与最差准则必须来自当前已选准则集合,且二者不能相同。若不满足这一条件,程序会在界面层或求解层直接报错。

6.2 偏好向量必须完整覆盖全部准则

core/calculator.py 在求解前会检查两组偏好向量是否对所有准则都提供了数值。若存在缺失项、非数值项,或超出 \(1\sim 9\) 范围,程序会直接返回错误信息,而不会自动插值或补全。

6.3 逆向流程中的“专家评分”只是参数生成器

这一点在论文写作中容易被忽略。当前项目的逆向流程并不是“直接对专家评分做某种综合赋权”,而是按式(10)—式(13)先把评分表转换为 BWM 所需的离散偏好向量,再使用式(14)—式(26)完成标准 BWM 求解。因此,在论文中若使用逆向流程,应明确区分“评分聚合”与“BWM 求权”两个步骤。

7. 论文写作模板

若本文采用本项目中的 BWM 模块进行指标赋权,可按如下方式概述方法过程:

首先根据研究指标体系确定候选准则集合,并由决策者识别最佳准则与最差准则;随后构造最佳准则相对其他准则的偏好向量和其他准则相对最差准则的偏好向量,偏好强度采用 1 至 9 标度表示。进一步建立以最小化最大绝对偏差为目标的线性规划模型,求解得到各准则权重及最优一致性偏差 \(\xi^\ast\)。最后结合 \(a_{BW}\) 对应的一致性指标 \(CI\) 计算一致性比率 \(CR\),并据此评价专家判断的一致性水平。

若使用的是本项目的逆向流程,还可补充说明:

对于难以直接填写 BWM 偏好向量的情形,本文先基于专家评分表计算各指标的加权平均得分,再按照平均得分识别最佳准则与最差准则,并通过相对评分比值倒推 BWM 偏好向量,最终仍采用标准 BWM 线性规划模型求解权重。

8. 公式与代码对应关系

表 2 BWM 关键公式与项目实现对应关系

内容 数学表达 项目实现
准则集合与权重向量 式(1)—式(3) utils/data_validator.pyui/indicators_widget.py
正向偏好向量录入 式(4)—式(7) ui/methods_widget.py
逆向评分聚合与参数倒推 式(8)—式(13) ui/methods_widget.py::_reverse_import_scores
BWM 极小化最大偏差模型 式(14)—式(20) core/calculator.py::_solve_bwm
权重裁剪与归一化 式(21) core/calculator.py::_solve_bwm
单项偏差与一致性明细 式(22)—式(24) core/calculator.py::_solve_bwm
\(CI\) 查表与 \(CR\) 计算 式(25)—式(26) core/calculator.py
Excel、图表与复现脚本导出 第 5 节 core/calculator.py::_write_excel_plot_weights_write_repro_script

总体而言,本项目中的 BWM 实现属于“输入层支持正向/逆向两种参数来源,但求解层统一采用标准线性规划 BWM”的工程化版本。对于论文写作,建议优先把式(14)—式(26)作为方法主体,再根据实际使用情况补充说明式(10)—式(13)所代表的逆向参数生成过程。

9. 论文模板补充

9.1 方法描述模板

“本文采用 BWM 方法进行指标主观赋权。首先识别最佳准则与最差准则,并构造最佳准则相对其他准则的偏好向量以及其他准则相对最差准则的偏好向量;随后建立最小化最大绝对偏差的线性规划模型,求解得到各准则权重及最优一致性偏差,并进一步计算一致性比率以检验专家判断的可靠性。”

9.2 结果解释模板

结果部分可写为:结果表明,权重越大表示对应准则在最佳-最坏比较框架下越重要;最优一致性偏差 \(\xi^\ast\) 越小、一致性比率越低,说明专家偏好越稳定。若采用逆向流程,还应说明权重来源仍是标准 BWM 模型,而专家评分表仅用于倒推偏好参数。

9.3 表格标题模板

  1. 表 1 BWM 最佳准则、最差准则与偏好向量设置表
  2. 表 2 BWM 权重求解结果表
  3. 表 3 BWM 一致性偏差与一致性比率结果表
  4. 表 4 逆向评分生成参数结果表

9.4 图表题注模板

  1. 图 1 BWM 指标权重分布图。
  2. 图 2 BWM 一致性检验结果示意图。
  3. 图 3 逆向评分与倒推偏好参数对比图。

9.5 表格示例

表 1 BWM 权重与一致性结果表示例

指标 权重 最大偏差 \(\xi^\ast\) 一致性比率 \(CR\)
\(C_1\)
\(C_2\)

表注:权重由标准 BWM 线性规划模型求解得到;一致性比率用于衡量专家偏好判断的可靠性。

10. 单篇终审补充

10.1 图题与表题对齐建议

  • 参数 表可写为:表X BWM 参数设置表。
  • 偏好向量 表可写为:表X BWM 最佳-其他与其他-最差偏好向量表。
  • 权重 表可写为:表X BWM 权重结果表。
  • 一致性明细 表可写为:表X BWM 一致性偏差明细表。
  • 图表清单 表可写为:表X BWM 图表索引与路径表。
  • weights_bar.png 建议写为:图X BWM 权重分布图。

10.2 终审说明

  • 当前代表性结果目录可采用 results/__codex_bwm_direct_run_20260329,其中 forward/bwm_forward_output.xlsx 对应正向流程,reverse/bwm_reverse_output.xlsx 对应逆向流程。正文若比较两种参数来源,必须分开引用这两个结果文件。
  • 当前较完整目录中的真实工作表为 参数/偏好向量/权重/一致性明细/图表清单。早期目录里只保留了 参数/权重/一致性指标,论文终稿应优先使用较新目录,因为它保留了偏好向量和图表索引。
  • 当前稳定实体图文件为 forward/weights_bar.pngreverse/weights_bar.png。如果正文需要做正逆向对照,应明确这是两张不同流程的权重图,而不是同一次运行的两种展示形式。
  • 当前真实 repro 脚本分别为 forward/repro_bwm_20260329_131704.pyreverse/repro_bwm_20260329_131705.py。这两个脚本都不是通过 repro_inputs/... 读取外部输入文件,而是把 CRITERIA/BEST/WORST/BEST_TO_OTHERS/OTHERS_TO_WORST 直接固化在脚本内部后重新求解;FILE_PATH 在脚本中为空字符串。附录中的复现实验说明应把这一“自包含参数复现”机制写清。
  • 由于复现脚本走的是参数快照而非外部文件回读,论文若想强调“原始专家打分表可追溯”,应额外引用结果包中的 参数偏好向量 工作表,而不是只写一个空的 FILE_PATH 字段。

10.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/多指标评价/BWM-最佳-最坏法,本次采用的代表性结果目录为 具体的算法3/多指标评价/BWM-最佳-最坏法/results/__codex_bwm_direct_run_20260329

该目录不是单一工作簿结构,而是明确拆成:

  • forward/
  • reverse/

其中正向目录的主结果为:

  • forward/bwm_forward_output.xlsx

逆向目录的主结果为:

  • reverse/bwm_reverse_output.xlsx

这两类结果应在论文中分别引用,不能混成同一次输出的两个 sheet。

当前目录中的真实图文件也分正逆向两套:

  • forward/weights_bar.png
  • reverse/weights_bar.png

因此这一轮真实图证据只有权重分布柱状图,且正向与逆向各自一张。

复现实物方面,该目录实际包含:

  • 具体的算法3/多指标评价/BWM-最佳-最坏法/results/__codex_bwm_direct_run_20260329/forward/repro_bwm_20260329_131704.py
  • 具体的算法3/多指标评价/BWM-最佳-最坏法/results/__codex_bwm_direct_run_20260329/reverse/repro_bwm_20260329_131705.py

脚本中明确写成:

  • FILE_PATH = ''
  • CRITERIA = [...]
  • BEST_TO_OTHERS = {...}
  • OUTPUT_XLSX_NAME = 'bwm_forward_output.xlsx' 或逆向对应输出名

因此这篇当前的真实复现口径不是 repro_inputs/... 或外部文件回读,而是“脚本内固化参数快照后重新求解”。论文若强调复现,应写明其为参数自包含复现。

11. 软件实现核查补充(2026-07)

  • 当前实现的主结果目录应写作 具体的算法3/多指标评价/BWM-最佳-最坏法/results/__codex_bwm_direct_run_20260329,正向和逆向主结果分别位于 forward/reverse/
  • 正文应围绕 best/othersweights_bar.png判断一致性权重向量一致性检验 等实际导出内容来写,不要把它写成多指标综合评价法的通用模板。
  • 图证应对应正向与逆向目录中的 weights_bar.png,并明确两条方向分别对应不同输入快照。
  • 该算法当前复现口径是脚本内固化参数快照,repro_bwm_20260329_131704.py / repro_bwm_20260329_131705.py 不依赖外部 repro_inputs