正在加载中...

展开本页目录
算法教程WASPAS-综合加权法

WASPAS-综合加权法

No.100 · 在线教程

WASPAS(Weighted Aggregated Sum Product Assessment)是一类将加权和模型(WSM)与加权乘积模型(WPM)进行融合的多指标评价方法。就本项目 具体的算法3/多指标评价/WASPAS-综合加权法 的实际实现而言,当前有效核心位于 wa…

WASPAS-综合加权法

1. 方法概述

WASPAS(Weighted Aggregated Sum Product Assessment)是一类将加权和模型(WSM)与加权乘积模型(WPM)进行融合的多指标评价方法。就本项目 具体的算法3/多指标评价/WASPAS-综合加权法 的实际实现而言,当前有效核心位于 waspas_calculator.py,其主流程为:

  1. 读取方案列与指标列;
  2. 对适度指标进行目标接近度变换;
  3. 按指标类型执行 min-maxz-score + min-max 标准化;
  4. 通过熵权法或自定义权重生成权重向量;
  5. 计算 WSMWPM 与综合得分 Q
  6. Q 降序排序;
  7. 导出 Excel、图表和复现脚本。

设共有 \(m\) 个方案、\(n\) 个指标,原始决策矩阵记为

$$ X=(x_{ij})_{m\times n}, \quad i=1,2,\ldots,m, \quad j=1,2,\ldots,n \tag{1} $$

设最终权重向量为

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

项目最终结果表中的核心列为:

  • 方案
  • WSM
  • WPM
  • 综合得分Q
  • 排名

其中 综合得分Q 越大表示方案越优,排名=1 表示最优方案

1.1 符号说明

符号 含义
\(x_{ij}\) 第 \(i\) 个方案在第 \(j\) 个指标上的原始值
\(u_{ij}\) 预处理后的指标值
\(n_{ij}\) 标准化矩阵中的元素
\(w_j\) 第 \(j\) 个指标的权重
\(\mathrm{WSM}_i\) 第 \(i\) 个方案的加权和得分
\(\mathrm{WPM}_i\) 第 \(i\) 个方案的加权乘积得分
\(Q_i\) 第 \(i\) 个方案的综合得分
\(\lambda\) WSM 与 WPM 的融合系数
\(t_j\) 第 \(j\) 个适度指标的目标值

2. 输入结构与界面流程

2.1 输入数据要求

结合 upload_widget.pydata_validator.py,当前标准 UI 路径要求:

  • 第 1 列为方案名称列;
  • 第 2 列及以后为指标列;
  • 指标列必须全部可转为数值;
  • 指标列不允许空值;
  • 方案名称不允许重复;
  • 常数列不允许存在。

因此,进入核心类的数据结构可写为

$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$

其中 \(A_i\) 表示第 \(i\) 个方案名称。

需要说明两点工程实现细节:

  1. 上传校验器会在 UI 中阻断重复方案名与常数列;
  2. 核心 _prepare_matrix() 仍会对所选指标执行 to_numeric(..., errors="coerce") 并删除含缺失值的行。因此,如果研究者跳过 UI 直接调用核心类,数据过滤逻辑仍然会生效。

2.2 界面参数与代码变量对应

当前主界面 main_window.py 的标准流程为:

  1. 上传数据;
  2. 选择参与计算的指标;
  3. 设置指标类型与适度指标标准值;
  4. 选择标准化方式、权重方式及融合参数 \(\lambda\);
  5. 结果页自动执行整体 WASPAS 计算;
  6. 如用户确认,可继续计算部分指标的分层结果。

主要界面参数与数学含义如下。

UI 字段 代码字段 数学含义 当前实现说明
指标选择 selected_indicators 参与计算的指标集合 仅这些指标进入计算
指标类型 indicator_types 正向/负向/适度 决定式(4)至式(11)
适度标准值 standard_values / moderate_values 目标值 \(t_j\) UI 中适度标准值禁止为 0
标准化方法 normalization 标准化口径 仅支持 min-maxz-score
权重方法 weight_method 权重生成方式 仅支持 entropycustom
自定义权重 weights 预设权重 \(\alpha_j\) GUI 路径下由权重编辑页录入
融合参数 lambda_param \(\lambda\) 默认 \(0.5\),范围 \([0,1]\)

3. 指标处理与标准化

3.1 预处理矩阵

WASPAS 当前实现中,并不是先把所有指标都镜像成正向指标,再统一计算;其更准确的流程是:

  • 正向指标保留原值;
  • 负向指标暂不在 _prepare_matrix() 中改写,而是在标准化阶段按负向公式处理;
  • 适度指标先转为接近度,再作为正向指标进入标准化。

设预处理矩阵记为

$$ U=(u_{ij})_{m\times n} \tag{4} $$

3.2 正向指标

若第 \(j\) 个指标为正向指标,则

$$ u_{ij}=x_{ij} \tag{5} $$

3.3 适度指标

若第 \(j\) 个指标为适度指标,项目先计算其与目标值的接近度:

$$ u_{ij}=1-\frac{|x_{ij}-t_j|}{\max_{1\le i\le m}|x_{ij}-t_j|} \tag{6} $$

若式(6)分母不大于 0,则代码直接令

$$ u_{ij}=1 \tag{7} $$

适度指标目标值 \(t_j\) 的来源为

$$ t_j= \begin{cases} \text{UI 提供的标准值}, & \text{常规界面路径}\\ \operatorname{median}(x_{1j},x_{2j},\ldots,x_{mj}), & \text{核心直调且未提供时} \end{cases} \tag{8} $$

也就是说:

  • 在 GUI 路径中,适度指标目标值由研究者填写;
  • 在核心类中,若未提供,代码回退到该列样本中位数。

3.4 Min-Max 标准化

若选择 normalization="min-max",则对正向指标与负向指标分别采用不同公式:

正向指标:

$$ n_{ij}=\frac{u_{ij}-u_j^{\min}}{u_j^{\max}-u_j^{\min}} \tag{9} $$

负向指标:

$$ n_{ij}=\frac{u_j^{\max}-u_{ij}}{u_j^{\max}-u_j^{\min}} \tag{10} $$

这里对负向指标的处理并不通过前置镜像公式完成,而是直接体现在标准化公式中。

3.5 Z-score 标准化

若选择 normalization="z-score",项目先对每列执行标准分数变换:

$$ z_{ij}=\frac{u_{ij}-\mu_j}{\sigma_j} \tag{11} $$

其中

$$ \mu_j=\frac{1}{m}\sum_{i=1}^{m}u_{ij} \tag{12} $$

$$ \sigma_j=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(u_{ij}-\mu_j)^2} \tag{13} $$

这里使用的是 np.nanstd(col),即 ddof=0 口径。若 \(\sigma_j\le 10^{-12}\),代码会把分母替换为 1,从而使该列后续标准化结果退化为 0。

对负向指标,代码不是在原始值层面做镜像,而是在 Z-score 之后直接取反:

$$ z_{ij}^{(-)}=-z_{ij} \tag{14} $$

随后再统一映射到 \([0,1]\):

$$ n_{ij}=\frac{z_{ij}-z_j^{\min}}{z_j^{\max}-z_j^{\min}} \tag{15} $$

3.6 最终标准化矩阵

无论使用哪一种标准化方式,代码最终都会执行:

  • naninf 替换为 0;
  • 把结果裁剪到 \([0,1]\) 区间。

因此,最终进入权重、WSM 与 WPM 计算的标准化矩阵为

$$ N=(n_{ij})_{m\times n}, \quad 0\le n_{ij}\le 1 \tag{16} $$

4. 权重确定

4.1 熵权法

weight_method="entropy" 时,项目在标准化矩阵 \(N\) 上计算客观权重。先定义比重:

$$ p_{ij}=\frac{n_{ij}}{\sum_{i=1}^{m}n_{ij}} \tag{17} $$

若某列满足 \(\sum_{i=1}^{m}n_{ij}=0\),代码将该列平均分配为

$$ p_{ij}=\frac{1}{m} \tag{18} $$

熵值为

$$ e_j=-\frac{1}{\ln m}\sum_{i=1}^{m}p_{ij}\ln p_{ij} \tag{19} $$

差异系数与最终权重分别为

$$ d_j=1-e_j \tag{20} $$

$$ w_j=\frac{d_j}{\sum_{j=1}^{n}d_j} \tag{21} $$

若全部 \(d_j\le 0\),代码会退化为等权重分配。

4.2 自定义权重

weight_method="custom" 时,核心从用户提供的预设权重 \(\alpha_j\) 构造

$$ w_j=\frac{\alpha_j}{\sum_{k=1}^{n}\alpha_k} \tag{22} $$

但这里有一个与部分算法模块不同的实现事实:若 \(\sum_{k=1}^{n}\alpha_k\le 0\),当前核心并不会报错,而是退化为等权重。这是 waspas_calculator.py 的真实行为。

对标准 GUI 使用者而言,这个边界情况通常不会出现,因为权重编辑页使用非负校验,并在保存前对总和进行校正。

5. WASPAS 主模型

5.1 加权和模型

项目中的加权和部分写为

$$ \mathrm{WSM}_i=\sum_{j=1}^{n}w_j n_{ij} \tag{23} $$

5.2 加权乘积模型

项目中的加权乘积部分写为

$$ \mathrm{WPM}_i=\prod_{j=1}^{n}n_{ij}^{\,w_j} \tag{24} $$

这里代码先对 \(n_{ij}\) 再次执行 clip(0,1),再进行幂乘运算。

5.3 综合得分

WASPAS 的综合得分为

$$ Q_i=\lambda \mathrm{WSM}_i+(1-\lambda)\mathrm{WPM}_i, \quad 0\le \lambda \le 1 \tag{25} $$

代码会把 \(\lambda\) 截断到 \([0,1]\) 区间。当前默认值为

$$ \lambda=0.5 \tag{26} $$

因此:

  • \(\lambda=1\) 时,模型退化为纯 WSM;
  • \(\lambda=0\) 时,模型退化为纯 WPM;
  • \(\lambda=0.5\) 时,表示对两者等权融合。

5.4 排序规则

项目按 \(Q_i\) 降序排序,并用 rank(ascending=False, method="min") 生成名次,即

$$ \text{Rank}_i=\operatorname{rank}_{\downarrow}(Q_i) \tag{27} $$

因此,\(Q_i\) 越大表示方案越优

6. 输出结果与论文应用

6.1 Excel 工作表与文件结构

当前 save_results() 导出的 Excel 工作簿包含以下工作表:

Sheet 名称 主要内容 论文中的建议用途
Parameters 算法名称、标准化方法、权重方法、\(\lambda\)、指标列表等 参数表或附录参数清单
原始数据 原始输入数据 数据附录
Normalized 标准化矩阵 \(N\) 附录计算明细
Weights 指标权重 权重结果表
Scores alternative,wsm,wpm,score,rank 计算结果详表
Ranking alternative,rank 排名总表
图表清单 图表名、用途、路径 图表索引

需要特别指出:WASPAS 模块当前导出的主要 sheet 名是英文,而不是中文。 论文若直接引用附录表名,建议保持与软件导出一致。

6.2 图表输出

项目默认输出 3 张图:

  1. weights.png:指标权重条形图;
  2. scores.png:WASPAS 综合得分 \(Q\) 条形图;
  3. wsm_wpm.png:WSM 与 WPM 对比图。

6.3 复现脚本

WASPAS 模块当前存在两类复现脚本:

  1. 核心 save_results() 自动生成:
    • repro_waspas.py
    • repro_inputs/input_snapshot.csv
  2. 结果页 results_widget.py 的“导出复现代码”按钮可额外生成:
    • repro_waspas_<时间戳>.py

其中前者更偏“结果目录内自包含复现”,后者更偏“基于原始文件路径的再次调用脚本”。

6.4 分层计算

结果页支持 calculate_partial_topsis() 路径,用于对选中指标子集重新计算 WASPAS。但当前实现与 VIKOR 不同:

  • VIKOR 会把子集结果追加到原结果文件中;
  • WASPAS 会新生成一个独立文件 WASPAS分层结果_<时间戳>.xlsx

论文中若要展示分层结果,应注意这部分输出是独立工作簿,而不是原结果文件的新 sheet。

7. 基线回归样例

项目基线测试 test_waspas_baseline.py 使用了如下设定:

  • 指标集合:效益1成本1效益2适度1
  • 指标类型:正向、负向、正向、适度
  • 适度标准值:适度1 = 55.0
  • 自定义权重:\((0.4, 0.3, 0.2, 0.1)\)
  • 标准化方式:min-max
  • 融合参数:\(\lambda=0.5\)

在该基线下,最终排序为

$$ A \succ C \succ B \succ D \tag{28} $$

对应综合得分为

$$ Q=(0.9635,\ 0.7969,\ 0.3620,\ 0.0000) \tag{29} $$

这说明在当前实现版本中,方案 \(A\) 同时在 WSM 与 WPM 维度上都保持较强优势,而方案 \(D\) 在融合得分上最低。

8. 论文写作模板

8.1 方法描述模板

“本文采用 WASPAS 方法对备选方案进行多指标综合评价。首先对原始指标进行方向统一与标准化处理,其中适度指标按式(6)映射为目标接近度,正向与负向指标分别按式(9)–式(15)进行标准化,得到标准化矩阵 \(N\)(式(16))。随后依据熵权法/自定义权重确定指标权重(式(17)–式(22)),并分别计算各方案的加权和得分 \(\mathrm{WSM}_i\) 与加权乘积得分 \(\mathrm{WPM}_i\)(式(23)–式(24))。最终采用融合参数 \(\lambda\) 将两者组合为综合得分 \(Q_i\)(式(25)),并按 \(Q_i\) 降序进行排序(式(27))。”

8.2 结果解释模板

结果部分可写为:WASPAS 结果表表明,方案的综合得分 \(Q_i\) 越大,其综合表现越优。与单纯加权和方法不同,WASPAS 同时保留了加权和模型与加权乘积模型的信息:\(\mathrm{WSM}_i\) 更强调线性补偿效应,而 \(\mathrm{WPM}_i\) 更容易对短板指标施加惩罚。若某方案在 \(\mathrm{WSM}_i\) 较高但 \(\mathrm{WPM}_i\) 明显偏低,说明其存在“部分指标优势较强但短板明显”的结构;若两者均较高,则说明该方案整体稳健性更强。

8.3 表格标题模板

  1. 表 1 指标类型、标准化方式与融合参数设置表
  2. 表 2 WASPAS 指标权重结果表
  3. 表 3 各方案的 WSM、WPM、综合得分 \(Q\) 与排名结果表
  4. 表 4 不同 \(\lambda\) 取值下的 WASPAS 排名对比表
  5. 表 5 指标子集分层计算结果表

8.4 图表题注模板

  1. 图 1 WASPAS 指标权重条形图。
  2. 图 2 各方案综合得分 \(Q\) 对比图。
  3. 图 3 各方案 WSM 与 WPM 对比图。

8.5 表格示例

表 1 各方案的 WSM、WPM、综合得分 \(Q\) 与排名

方案 WSM WPM \(Q\) 排名
A
B

表注:\(Q\) 为按式(25)计算的综合得分,取值越大表示方案越优。

9. 实现说明与注意事项

  1. 当前有效核心文件是 waspas_calculator.py,而不是通用名 calculator.py
  2. 当前核心对外的主要计算接口名仍然叫 calculate_topsis()calculate_partial_topsis(),这是兼容旧 UI 命名遗留,并不表示该模块实际运行的是 TOPSIS。
  3. core/init.py 当前基本为空,因此在外部调用时应直接从 core.waspas_calculator 导入。
  4. GUI 路径下,适度指标标准值不能为 0;但核心在缺失时会回退到中位数,这两种口径在论文中需要分开描述。
  5. 若研究关注参数敏感性,建议重点分析 \(\lambda\) 变化对排序结果的影响,因为该参数直接控制 WSM 的补偿性与 WPM 的惩罚性之间的权衡。
  6. Scores 工作表保留了 wsmwpmscore 三列,比仅使用 Ranking 更适合放入论文正文;NormalizedWeights 更适合放在附录。

10. 单篇终审补充

10.1 图题与表题对齐建议

  • Parameters 表可写为:表X WASPAS 参数设置表。
  • 原始数据 表可写为:表X WASPAS 原始数据表。
  • Normalized 表可写为:表X WASPAS 标准化矩阵表。
  • Weights 表可写为:表X WASPAS 指标权重表。
  • Scores 表可写为:表X WASPAS WSM、WPM 与综合得分表。
  • Ranking 表可写为:表X WASPAS 排名结果表。
  • 图表清单 表可写为:表X WASPAS 图表索引与路径表。
  • weights.png 建议写为:图X WASPAS 指标权重图。
  • scores.png 建议写为:图X WASPAS 综合得分图。
  • wsm_wpm.png 建议写为:图X WASPAS WSM 与 WPM 对比图。

10.2 终审说明

  • 当前代表性结果目录可采用 results/manual_check_20260321_01/WASPAS结果_20260321_052108。其中主工作簿为 WASPAS结果_20260321_052108.xlsx
  • 当前真实工作表为 Parameters/原始数据/Normalized/Weights/Scores/Ranking/图表清单。论文表题应按这套中英混合 sheet 名准确落地。
  • 当前稳定实体图文件为 charts/weights.pngcharts/scores.pngcharts/wsm_wpm.png。若正文讨论 \(\lambda\) 融合效果,应优先引用 Scores 工作表和 wsm_wpm.png
  • 真实 repro 脚本为 repro_waspas.py。当前脚本中 SRC_FILE = "",真正可移植输入是 REPRO_INPUT = "repro_inputs/input_snapshot.csv";复现输出进入 repro_outputs/results_时间戳/
  • 当前结果目录存在多层复现输出。论文正文若只陈述主实验,应固定引用首层 WASPAS结果_20260321_052108 目录,避免把后续复现层文件混入主文。

10.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/多指标评价/WASPAS-综合加权法,代表性结果目录为 具体的算法3/多指标评价/WASPAS-综合加权法/results/manual_check_20260321_01/WASPAS结果_20260321_052108
  • 该目录主工作簿为 WASPAS结果_20260321_052108.xlsx,真实工作表为 Parameters原始数据NormalizedWeightsScoresRanking图表清单
  • 当前主图目录为 charts/,实体图为 weights.pngscores.pngwsm_wpm.png。其中 wsm_wpm.png 是当前目录最能体现 WASPAS 融合特性的图区别证据。
  • 当前 repro 脚本为 repro_waspas.py。脚本里虽然 SRC_FILE = "",但真正可移植输入已由 REPRO_INPUT = "repro_inputs/input_snapshot.csv" 固化;该输入副本在目录中实际存在于 repro_inputs/input_snapshot.csv
  • 复现输出并不是直接写回当前目录,而是进入 repro_outputs/results_20260321_052109/WASPAS结果_20260321_052109/,后续还继续递归生成更深层 repro_outputs/results_20260329_133021/...。因此这篇必须明确写成“主目录 + 嵌套多层 repro_outputs”的结构。
  • 当前 manual_check_20260321_01 本身只是外层聚合目录,可直接引用的单次结果目录是其下的 WASPAS结果_20260321_052108。论文和交付清单不应把聚合层误写成一次运行目录。

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

  • 当前主结果目录应写作 具体的算法3/多指标评价/WASPAS-综合加权法/results/manual_check_20260321_01/WASPAS结果_20260321_052108
  • 正文应围绕 Parameters原始数据NormalizedWeightsScoresRanking图表清单 来写。
  • 图证应对应 weights.pngscores.pngwsm_wpm.png,并把 WSM、WPM 和综合得分的关系写清。
  • 复现脚本应按 repro_waspas.py + repro_inputs/input_snapshot.csv 的口径说明;repro_outputs/ 里的多层结果只作为递归复现证据。