正在加载中...

展开本页目录
算法教程WSM_SAW-加权和法、简单加权法

WSM_SAW-加权和法、简单加权法

No.102 · 在线教程

WSM(Weighted Sum Model)或 SAW(Simple Additive Weighting)是一类最典型的加权和综合评价方法。其核心思想是:先将各指标统一到可比较尺度,再按权重进行线性求和,得到每个方案的综合得分。

WSM_SAW-加权和法、简单加权法

1. 方法概述

WSM(Weighted Sum Model)或 SAW(Simple Additive Weighting)是一类最典型的加权和综合评价方法。其核心思想是:先将各指标统一到可比较尺度,再按权重进行线性求和,得到每个方案的综合得分。

就本项目 具体的算法3/多指标评价/WSM_SAW-加权和法、简单加权法 的实际实现而言,当前有效核心位于 wsm_saw_calculator.py,完整流程为:

  1. 读取方案列与指标列;
  2. 按指标类型进行标准化准备;
  3. 采用 min-maxz-score + min-max 进行标准化;
  4. 通过熵权法或自定义权重得到权重向量;
  5. 计算加权和得分;
  6. 按得分降序排序;
  7. 导出 Excel、图表、portable repro_module 与复现脚本;
  8. 支持对部分指标重新计算并追加到原结果工作簿。

设共有 \(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} $$

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

  • alternative
  • score
  • rank

其中 score 越大表示方案越优,rank=1 表示最优方案

1.1 符号说明

符号 含义
\(x_{ij}\) 第 \(i\) 个方案在第 \(j\) 个指标上的原始值
\(z_{ij}\) Z-score 预处理后的数值
\(r_{ij}\) 最终标准化矩阵中的元素
\(w_j\) 第 \(j\) 个指标的权重
\(S_i\) 第 \(i\) 个方案的综合得分
\(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\) 个方案名称。

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

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

  1. 上传数据;
  2. 选择指标并设置指标类型;
  3. 在方法页设置标准化方式与权重方式;
  4. 结果页自动执行整体 WSM/SAW 计算;
  5. 如用户确认,可继续执行部分指标的分层计算。

主要参数如下。

UI 字段 代码字段 数学含义 当前实现说明
指标选择 selected_indicators 进入矩阵 \(X\) 的指标集合 未选中指标不参与计算
指标类型 indicator_types 正向/负向/适度 影响式(4)至式(12)
适度标准值 moderate_values 目标值 \(t_j\) UI 中适度标准值禁止为 0
标准化方法 normalization min-maxz-score z-score 实际为 z-score + min-max
权重方法 weight_method entropycustom 默认 entropy
自定义权重 weights 预设权重 \(\alpha_j\) 由独立权重页录入

3. 指标处理与标准化

3.1 正向指标

若第 \(j\) 个指标为正向指标,则项目直接保留原值:

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

3.2 负向指标

当前实现并没有在标准化前做单独镜像,而是在标准化阶段按“负向口径”处理。

当采用 min-max 时,负向指标写为

$$ r_{ij}=\frac{x_j^{\max}-x_{ij}}{x_j^{\max}-x_j^{\min}} \tag{5} $$

当采用 z-score 时,先做标准分数变换,再取反,见式(10)和式(11)。

3.3 适度指标

当前 WSM/SAW 模块的适度指标处理方式,需要特别和其他算法区分。代码不是先计算“距离/最大距离”的相对接近度,而是直接构造

$$ u_{ij}=1-|x_{ij}-t_j| \tag{6} $$

其中 \(t_j\) 为适度指标目标值。

这里必须强调:这不是教材中最常见的适度指标处理式,而是本项目当前 wsm_saw_calculator.py 的真实实现。 后续再通过 min-maxz-score + min-max 把式(6)结果映射到 \([0,1]\) 区间。

适度指标目标值的来源为

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

因此:

  • GUI 路径要求研究者显式填写适度指标标准值;
  • 核心类在缺失时会回退到该列样本中位数。

3.4 Z-score 预处理

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

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

其中

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

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

若第 \(j\) 个指标为负向指标,代码在 Z-score 后直接取反:

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

若 \(\sigma_j\le 10^{-12}\),代码把分母替换为 1.0,从而使该列最终归一化结果退化为 0。

3.5 Min-Max 标准化

无论最初选择的是 min-max 还是 z-score,项目最终都会执行一次线性归一化。记进入该阶段的列值为 \(v_{ij}\),则

$$ r_{ij}=\frac{v_{ij}-v_j^{\min}}{v_j^{\max}-v_j^{\min}} \tag{12} $$

其中:

  • normalization="min-max" 时,\(v_{ij}=u_{ij}\);
  • normalization="z-score" 时,\(v_{ij}=z_{ij}\) 或 \(z_{ij}^{(-)}\)。

若某列满足 \(v_j^{\max}-v_j^{\min}\le 10^{-12}\),代码以 1.0 作为分母处理,结果该列整体变为 0。

最终进入加权求和计算的标准化矩阵为

$$ R=(r_{ij})_{m\times n}, \quad 0\le r_{ij}\le 1 \tag{13} $$

4. 权重确定

4.1 熵权法

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

$$ p_{ij}=\frac{r_{ij}}{\sum_{i=1}^{m}r_{ij}} \tag{14} $$

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

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

熵值为

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

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

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

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

若所有 \(d_j\le 0\),代码退化为等权重。

4.2 自定义权重

weight_method="custom" 时,核心要求所选指标都在权重字典中出现,并按

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

进行归一化。若缺少所选指标的权重,或权重和不大于 0,则当前实现会直接报错。

5. WSM / SAW 主模型

5.1 加权和得分

项目的核心打分公式为

$$ S_i=\sum_{j=1}^{n}w_j r_{ij} \tag{20} $$

矩阵形式可写为

$$ S=Rw \tag{21} $$

这意味着该模块是一个典型的“完全补偿型”模型:某一指标上的低分可以被其他指标上的高分部分补偿。

5.2 排序规则

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

$$ \text{Rank}_i=\operatorname{rank}_{\downarrow}(S_i) \tag{22} $$

5.3 接口别名

当前核心除 calculate_topsis() 外,还保留:

  • calculate_wsm()
  • calculate_partial_topsis()

其中 calculate_wsm()calculate_topsis() 在当前实现中等价,这属于兼容旧界面命名的工程设计。

6. 输出结果与论文应用

6.1 Excel 工作表与文件结构

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

Sheet 名称 主要内容 论文中的建议用途
Parameters 参数字典展开表 参数表或附录参数清单
RawData 原始输入数据 数据附录
Normalized 标准化矩阵 附录计算明细
Weights 指标与权重 权重结果表
Scores alternative,score,rank 正文核心结果表
Ranking alternative,rank 排名总表
Charts 图表名与路径 图表索引

需要注意:Charts 工作表当前列名是 chartpath,不是中文列名。

6.2 图表输出

项目默认输出 3 张图:

  1. weights.png:指标权重图;
  2. scores.png:综合得分图;
  3. ranking.png:排名图。

6.3 复现输出

当前 save_results() 在每次保存结果时都会自动生成:

  • repro_module/core/wsm_saw_calculator.py
  • repro_module/utils/config.py
  • repro_wsm_saw_<时间戳>.py

也就是说,WSM/SAW 模块的标准保存结果本身就包含 portable 复现包,不需要像 WPM 那样依赖结果页按钮单独导出模板。

6.4 分层结果追加

当前 append_layer_results() 会把部分指标结果追加到已有工作簿中,追加的 sheet 名为:

$$ \texttt{PartialScores\_<YYYYMMDD\_HHMMSS>} \tag{23} $$

$$ \texttt{PartialWeights\_<YYYYMMDD\_HHMMSS>} \tag{24} $$

$$ \texttt{PartialNorm\_<YYYYMMDD\_HHMMSS>} \tag{25} $$

若环境缺少 openpyxl,则回退为新建结果文件。

7. 基线回归样例

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

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

在该基线下,最终排序为

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

对应综合得分为

$$ S=(0.9667,\ 0.8000,\ 0.3667,\ 0.0000) \tag{27} $$

这表明在当前实现版本中,方案 \(A\) 具有最高加权和得分,方案 \(D\) 最低。

8. 论文写作模板

8.1 方法描述模板

“本文采用加权和法(WSM/SAW)对备选方案进行综合评价。首先根据指标属性对原始数据进行标准化处理,其中负向指标按式(5)或式(11)进行反向转换,适度指标按式(6)映射为目标值偏差惩罚后的中间值;随后依据研究设定采用 Min-Max 标准化或 Z-score 与 Min-Max 组合标准化,得到标准化矩阵 \(R\)(式(8)–式(13))。在权重方面,本文采用熵权法/自定义权重确定指标权重(式(14)–式(19))。最终根据加权和公式计算各方案综合得分 \(S_i\)(式(20)–式(21)),并按 \(S_i\) 降序进行排序(式(22))。”

8.2 结果解释模板

结果部分可写为:WSM/SAW 结果表显示,综合得分越大表示方案越优。由于该方法采用线性加权和结构,某一指标上的低值可在一定程度上被其他高值指标补偿,因此它属于典型的完全补偿型评价模型。与乘积型模型相比,WSM/SAW 更适合指标之间允许相互补偿的决策场景。需要注意的是,本文所用软件实现中,适度指标并非采用常见的比例距离式,而是按绝对偏差惩罚形式构造中间值,再进入统一标准化流程。

8.3 表格标题模板

  1. 表 1 指标类型与标准值设置表
  2. 表 2 WSM/SAW 指标权重结果表
  3. 表 3 WSM/SAW 综合得分与排名结果表
  4. 表 4 部分指标分层计算结果表
  5. 表 5 不同模型排序对比表(可与 WPM、WASPAS 比较)

8.4 图表题注模板

  1. 图 1 WSM/SAW 指标权重图。
  2. 图 2 WSM/SAW 综合得分图。
  3. 图 3 WSM/SAW 排名图。

8.5 表格示例

表 1 WSM/SAW 综合评价结果

方案 综合得分 \(S_i\) 排名
A
B

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

9. 实现说明与注意事项

  1. 当前有效核心文件是 wsm_saw_calculator.py,不是通用名 calculator.py
  2. 当前 core/__init__.py 仅导出 WSMSAWCalculator,因此外部调用时可直接从 corecore.wsm_saw_calculator 导入。
  3. 适度指标的工程实现为式(6)的绝对偏差惩罚形式,而不是许多教材常见的“除以最大偏差”的接近度公式;论文中必须按本项目真实实现描述。
  4. 当前模块支持“熵权法”和“自定义权重”,不支持标准差赋权。
  5. 结果页的“导出复现代码”按钮本质上会再次调用 save_results() 生成一份新的结果目录,因此导出后目录和文件时间戳可能发生变化。
  6. 分层计算依赖 openpyxl 追加 sheet;若环境缺少该库,程序会回退为新建结果文件,这一点在论文整理附录时应注意。

10. 单篇终审补充

10.1 图题与表题对齐建议

  • Parameters 表可写为:表X WSM/SAW 参数设置表。
  • RawData 表可写为:表X WSM/SAW 原始数据表。
  • Normalized 表可写为:表X WSM/SAW 标准化矩阵表。
  • Weights 表可写为:表X WSM/SAW 指标权重表。
  • Scores 表可写为:表X WSM/SAW 综合得分表。
  • Ranking 表可写为:表X WSM/SAW 排名结果表。
  • Charts 表可写为:表X WSM/SAW 图表索引表。
  • weights.png 建议写为:图X WSM/SAW 指标权重图。
  • scores.png 建议写为:图X WSM/SAW 综合得分图。
  • ranking.png 建议写为:图X WSM/SAW 排名图。

10.2 终审说明

  • 当前代表性结果目录可采用 results/manual_check_20260321_02/WSM_SAW-加权和法、简单加权法分析结果_20260321_053114。其中主工作簿为 WSM_SAW_results_20260321_053114.xlsx
  • 当前真实工作表为 Parameters/RawData/Normalized/Weights/Scores/Ranking/Charts。论文表题应按这组英文 sheet 名落地。
  • 当前稳定实体图文件为 charts/weights.pngcharts/scores.pngcharts/ranking.png。若正文讨论“完全补偿型”加权和机制,应把 Normalized/Weights/Scores 三张表配套说明。
  • 真实 repro 脚本为 repro_wsm_saw_20260321_053114.py。它不是读取 repro_inputs/...,而是通过 EXCEL_PATH = THIS_DIR / 'WSM_SAW_results_20260321_053114.xlsx' 回读主结果簿,再从 ParametersRawData 恢复参数和原始数据。
  • 当前复现脚本依赖结果目录内的 repro_module/core/。论文若强调可移植复现,应说明结果包已携带核心模块,而不是完全依赖主工程路径。

10.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/多指标评价/WSM_SAW-加权和法、简单加权法,代表性结果目录为 具体的算法3/多指标评价/WSM_SAW-加权和法、简单加权法/results/manual_check_20260321_02/WSM_SAW-加权和法、简单加权法分析结果_20260321_053114
  • 该目录主工作簿为 WSM_SAW_results_20260321_053114.xlsx,真实工作表为 ParametersRawDataNormalizedWeightsScoresRankingCharts
  • 当前图目录为 charts/,实体图为 weights.pngscores.pngranking.png。因此这篇当前的主图证据完整,适合直接支撑“权重-得分-排名”三联图。
  • 当前 repro 脚本为 repro_wsm_saw_20260321_053114.py,并不是读 repro_inputs/...,而是通过 EXCEL_PATH = THIS_DIR / 'WSM_SAW_results_20260321_053114.xlsx' 回读主结果簿,再从其中 RawDataParameters 恢复输入与参数。
  • 目录中还实际携带 repro_module/core/repro_module/utils/,说明其复现包是“结果簿回读 + 最小模块副本”结构。repro_outputs/ 下已经继续生成 WSM_SAW-加权和法、简单加权法分析结果_20260321_053115/ 及更深层复现结果。
  • 因此,这篇应明确写成“首层主结果目录 + 携带最小复现模块 + 递归 repro_outputs”结构,正文固定引用首层主结果,后续复现层仅作技术说明。

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

  • 当前主结果目录应写作 具体的算法3/多指标评价/WSM_SAW-加权和法、简单加权法/results/manual_check_20260321_02/WSM_SAW-加权和法、简单加权法分析结果_20260321_053114
  • 正文应围绕 ParametersRawDataNormalizedWeightsScoresRankingCharts 来写。
  • 图证应对应 weights.pngscores.pngranking.png,并把加权和型结果解释清楚。
  • 复现脚本应按 repro_wsm_saw_20260321_053114.py + WSM_SAW_results_20260321_053114.xlsx 的口径说明,结果包中的 repro_module/ 也要作为复现依赖说明。