WSM_SAW-加权和法、简单加权法
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,完整流程为:
- 读取方案列与指标列;
- 按指标类型进行标准化准备;
- 采用
min-max或z-score + min-max进行标准化; - 通过熵权法或自定义权重得到权重向量;
- 计算加权和得分;
- 按得分降序排序;
- 导出 Excel、图表、portable
repro_module与复现脚本; - 支持对部分指标重新计算并追加到原结果工作簿。
设共有 \(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} $$
项目最终结果表中的核心列为:
alternativescorerank
其中 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.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\) 个方案名称。
2.2 界面参数与代码变量对应
当前主界面 main_window.py 的标准流程为:
- 上传数据;
- 选择指标并设置指标类型;
- 在方法页设置标准化方式与权重方式;
- 结果页自动执行整体 WSM/SAW 计算;
- 如用户确认,可继续执行部分指标的分层计算。
主要参数如下。
| UI 字段 | 代码字段 | 数学含义 | 当前实现说明 |
|---|---|---|---|
| 指标选择 | selected_indicators |
进入矩阵 \(X\) 的指标集合 | 未选中指标不参与计算 |
| 指标类型 | indicator_types |
正向/负向/适度 | 影响式(4)至式(12) |
| 适度标准值 | moderate_values |
目标值 \(t_j\) | UI 中适度标准值禁止为 0 |
| 标准化方法 | normalization |
min-max 或 z-score |
z-score 实际为 z-score + min-max |
| 权重方法 | weight_method |
entropy 或 custom |
默认 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-max 或 z-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 工作表当前列名是 chart 与 path,不是中文列名。
6.2 图表输出
项目默认输出 3 张图:
weights.png:指标权重图;scores.png:综合得分图;ranking.png:排名图。
6.3 复现输出
当前 save_results() 在每次保存结果时都会自动生成:
repro_module/core/wsm_saw_calculator.pyrepro_module/utils/config.pyrepro_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 指标类型与标准值设置表
- 表 2 WSM/SAW 指标权重结果表
- 表 3 WSM/SAW 综合得分与排名结果表
- 表 4 部分指标分层计算结果表
- 表 5 不同模型排序对比表(可与 WPM、WASPAS 比较)
8.4 图表题注模板
- 图 1 WSM/SAW 指标权重图。
- 图 2 WSM/SAW 综合得分图。
- 图 3 WSM/SAW 排名图。
8.5 表格示例
表 1 WSM/SAW 综合评价结果
| 方案 | 综合得分 \(S_i\) | 排名 |
|---|---|---|
| A | ||
| B |
表注:综合得分 \(S_i\) 按式(20)计算,取值越大表示方案越优。
9. 实现说明与注意事项
- 当前有效核心文件是 wsm_saw_calculator.py,不是通用名
calculator.py。 - 当前
core/__init__.py仅导出WSMSAWCalculator,因此外部调用时可直接从core或core.wsm_saw_calculator导入。 - 适度指标的工程实现为式(6)的绝对偏差惩罚形式,而不是许多教材常见的“除以最大偏差”的接近度公式;论文中必须按本项目真实实现描述。
- 当前模块支持“熵权法”和“自定义权重”,不支持标准差赋权。
- 结果页的“导出复现代码”按钮本质上会再次调用
save_results()生成一份新的结果目录,因此导出后目录和文件时间戳可能发生变化。 - 分层计算依赖
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.png、charts/scores.png、charts/ranking.png。若正文讨论“完全补偿型”加权和机制,应把Normalized/Weights/Scores三张表配套说明。 - 真实 repro 脚本为
repro_wsm_saw_20260321_053114.py。它不是读取repro_inputs/...,而是通过EXCEL_PATH = THIS_DIR / 'WSM_SAW_results_20260321_053114.xlsx'回读主结果簿,再从Parameters与RawData恢复参数和原始数据。 - 当前复现脚本依赖结果目录内的
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,真实工作表为Parameters、RawData、Normalized、Weights、Scores、Ranking、Charts。 - 当前图目录为
charts/,实体图为weights.png、scores.png、ranking.png。因此这篇当前的主图证据完整,适合直接支撑“权重-得分-排名”三联图。 - 当前 repro 脚本为
repro_wsm_saw_20260321_053114.py,并不是读repro_inputs/...,而是通过EXCEL_PATH = THIS_DIR / 'WSM_SAW_results_20260321_053114.xlsx'回读主结果簿,再从其中RawData与Parameters恢复输入与参数。 - 目录中还实际携带
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。 - 正文应围绕
Parameters、RawData、Normalized、Weights、Scores、Ranking、Charts来写。 - 图证应对应
weights.png、scores.png、ranking.png,并把加权和型结果解释清楚。 - 复现脚本应按
repro_wsm_saw_20260321_053114.py + WSM_SAW_results_20260321_053114.xlsx的口径说明,结果包中的repro_module/也要作为复现依赖说明。