WASPAS-综合加权法
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,其主流程为:
- 读取方案列与指标列;
- 对适度指标进行目标接近度变换;
- 按指标类型执行
min-max或z-score + min-max标准化; - 通过熵权法或自定义权重生成权重向量;
- 计算
WSM、WPM与综合得分Q; - 按
Q降序排序; - 导出 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} $$
项目最终结果表中的核心列为:
方案WSMWPM综合得分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.py 与 data_validator.py,当前标准 UI 路径要求:
- 第 1 列为方案名称列;
- 第 2 列及以后为指标列;
- 指标列必须全部可转为数值;
- 指标列不允许空值;
- 方案名称不允许重复;
- 常数列不允许存在。
因此,进入核心类的数据结构可写为
$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$
其中 \(A_i\) 表示第 \(i\) 个方案名称。
需要说明两点工程实现细节:
- 上传校验器会在 UI 中阻断重复方案名与常数列;
- 核心
_prepare_matrix()仍会对所选指标执行to_numeric(..., errors="coerce")并删除含缺失值的行。因此,如果研究者跳过 UI 直接调用核心类,数据过滤逻辑仍然会生效。
2.2 界面参数与代码变量对应
当前主界面 main_window.py 的标准流程为:
- 上传数据;
- 选择参与计算的指标;
- 设置指标类型与适度指标标准值;
- 选择标准化方式、权重方式及融合参数 \(\lambda\);
- 结果页自动执行整体 WASPAS 计算;
- 如用户确认,可继续计算部分指标的分层结果。
主要界面参数与数学含义如下。
| UI 字段 | 代码字段 | 数学含义 | 当前实现说明 |
|---|---|---|---|
| 指标选择 | selected_indicators |
参与计算的指标集合 | 仅这些指标进入计算 |
| 指标类型 | indicator_types |
正向/负向/适度 | 决定式(4)至式(11) |
| 适度标准值 | standard_values / moderate_values |
目标值 \(t_j\) | UI 中适度标准值禁止为 0 |
| 标准化方法 | normalization |
标准化口径 | 仅支持 min-max 与 z-score |
| 权重方法 | weight_method |
权重生成方式 | 仅支持 entropy 与 custom |
| 自定义权重 | 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 最终标准化矩阵
无论使用哪一种标准化方式,代码最终都会执行:
nan、inf替换为 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 张图:
weights.png:指标权重条形图;scores.png:WASPAS 综合得分 \(Q\) 条形图;wsm_wpm.png:WSM 与 WPM 对比图。
6.3 复现脚本
WASPAS 模块当前存在两类复现脚本:
- 核心
save_results()自动生成:repro_waspas.pyrepro_inputs/input_snapshot.csv
- 结果页 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 指标类型、标准化方式与融合参数设置表
- 表 2 WASPAS 指标权重结果表
- 表 3 各方案的 WSM、WPM、综合得分 \(Q\) 与排名结果表
- 表 4 不同 \(\lambda\) 取值下的 WASPAS 排名对比表
- 表 5 指标子集分层计算结果表
8.4 图表题注模板
- 图 1 WASPAS 指标权重条形图。
- 图 2 各方案综合得分 \(Q\) 对比图。
- 图 3 各方案 WSM 与 WPM 对比图。
8.5 表格示例
表 1 各方案的 WSM、WPM、综合得分 \(Q\) 与排名
| 方案 | WSM | WPM | \(Q\) | 排名 |
|---|---|---|---|---|
| A | ||||
| B |
表注:\(Q\) 为按式(25)计算的综合得分,取值越大表示方案越优。
9. 实现说明与注意事项
- 当前有效核心文件是 waspas_calculator.py,而不是通用名
calculator.py。 - 当前核心对外的主要计算接口名仍然叫
calculate_topsis()与calculate_partial_topsis(),这是兼容旧 UI 命名遗留,并不表示该模块实际运行的是 TOPSIS。 - core/init.py 当前基本为空,因此在外部调用时应直接从
core.waspas_calculator导入。 - GUI 路径下,适度指标标准值不能为 0;但核心在缺失时会回退到中位数,这两种口径在论文中需要分开描述。
- 若研究关注参数敏感性,建议重点分析 \(\lambda\) 变化对排序结果的影响,因为该参数直接控制 WSM 的补偿性与 WPM 的惩罚性之间的权衡。
Scores工作表保留了wsm、wpm和score三列,比仅使用Ranking更适合放入论文正文;Normalized与Weights更适合放在附录。
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.png、charts/scores.png、charts/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、原始数据、Normalized、Weights、Scores、Ranking、图表清单。 - 当前主图目录为
charts/,实体图为weights.png、scores.png、wsm_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、原始数据、Normalized、Weights、Scores、Ranking、图表清单来写。 - 图证应对应
weights.png、scores.png、wsm_wpm.png,并把 WSM、WPM 和综合得分的关系写清。 - 复现脚本应按
repro_waspas.py + repro_inputs/input_snapshot.csv的口径说明;repro_outputs/里的多层结果只作为递归复现证据。