正在加载中...

展开本页目录
算法教程VIKOR-折衷排序法

VIKOR-折衷排序法

No.099 · 在线教程

VIKOR(VlseKriterijumska Optimizacija I Kompromisno Resenje)是一类以“群体效用”与“个体遗憾”折中为核心思想的多指标排序方法。就本项目 具体的算法3/多指标评价/VIKOR-折衷排序法 的实际实现而言,当前有效计算主链由…

VIKOR-折衷排序法

1. 方法概述

VIKOR(VlseKriterijumska Optimizacija I Kompromisno Resenje)是一类以“群体效用”与“个体遗憾”折中为核心思想的多指标排序方法。就本项目 具体的算法3/多指标评价/VIKOR-折衷排序法 的实际实现而言,当前有效计算主链由 vikor_calculator.py 完成,完整流程为:

  1. 读取方案列与指标列;
  2. 按指标类型进行同向化处理;
  3. 对处理后的矩阵执行 min-maxz-score + min-max 标准化;
  4. 通过熵权法或自定义权重得到指标权重;
  5. 计算 \(S_i\)、\(R_i\)、\(Q_i\);
  6. 按 \(Q_i\) 升序排序;
  7. 按经典 C1/C2 规则输出折衷解;
  8. 导出 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} $$

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

  • 方案
  • S
  • R
  • Q
  • 排名

其中 \(S\)、\(R\)、\(Q\) 均是越小越优,排名=1 表示最优方案。这与部分软件习惯输出“得分越大越优”的写法不同,论文中应保持与项目结果一致。

1.1 符号说明

符号 含义
\(x_{ij}\) 第 \(i\) 个方案在第 \(j\) 个指标上的原始值
\(u_{ij}\) 同向化处理后的中间值
\(n_{ij}\) 最终标准化矩阵中的元素
\(w_j\) 第 \(j\) 个指标权重
\(f_j^*\) 第 \(j\) 个指标的最优值
\(f_j^-\) 第 \(j\) 个指标的最劣值
\(S_i\) 第 \(i\) 个方案的群体效用距离
\(R_i\) 第 \(i\) 个方案的最大遗憾距离
\(Q_i\) 第 \(i\) 个方案的折衷排序指标
\(v\) 群体效用权重系数
\(DQ\) 可接受优势阈值

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. 选择标准化方式与权重方式;
  5. 结果页自动执行整体 VIKOR 计算;
  6. 如用户确认,可继续执行部分指标的分层计算。

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

UI 字段 代码字段 数学含义 当前实现说明
指标选择 selected_indicators 参与计算的指标集合 未选中指标不进入矩阵 \(X\)
指标类型 indicator_types 正向/负向/适度 影响式(4)至式(8)
适度标准值 standard_values / moderate_values 目标值 \(t_j\) UI 中适度指标标准值禁止为 0
标准化方法 normalization 矩阵标准化口径 仅支持 min-maxz-score
权重方法 weight_method 权重生成方式 仅支持 entropycustom
自定义权重 weights 预设权重 \(\alpha_j\) 保存时会再次归一化为 \(w_j\)
折衷系数 v \(Q_i\) 中群体效用权重 UI 未暴露输入框,标准 GUI 路径默认 \(v=0.5\)

这里必须强调一个与论文写作直接相关的实现事实:本项目当前 VIKOR 主流程并不是“仅接受外部给定权重”的固定版本,而是支持“熵权法”与“自定义权重”两条路径。 因此论文描述中若使用本软件结果,应明确写明权重来源。

3. 指标同向化与标准化

3.1 同向化中间矩阵

设经过指标类型处理后的中间矩阵记为

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

项目在进入 VIKOR 主计算前,会先把所有指标处理为“越大越优”的等价正向指标。

3.2 正向指标

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

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

3.3 负向指标

若第 \(j\) 个指标为负向指标,当前实现不是直接写成比例倒置,而是先做线性镜像变换:

$$ u_{ij}=x_j^{\max}+x_j^{\min}-x_{ij} \tag{6} $$

其中

$$ x_j^{\max}=\max_{1\le i\le m}x_{ij}, \quad x_j^{\min}=\min_{1\le i\le m}x_{ij} \tag{7} $$

变换后,该指标在后续计算中按正向指标处理。

3.4 适度指标

若第 \(j\) 个指标为适度指标,代码先把“接近目标值越好”的思想转换为接近度得分:

$$ u_{ij}=1-\frac{|x_{ij}-t_j|}{\max\left(|x_j^{\max}-t_j|,\ |x_j^{\min}-t_j|\right)} \tag{8} $$

若式(8)分母不大于 \(10^{-12}\),程序直接令

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

适度指标目标值 \(t_j\) 的来源具有“核心默认值”与“界面强制输入”两层口径:

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

这意味着:

  • 在核心 vikor_calculator.py 中,适度指标标准值缺失时会回退到该列中位数;
  • 在界面 indicators_widget.py 中,若用户把某指标设为“适度指标”,则必须手工填写且当前不允许填 0。

因此,论文中若直接依据 GUI 使用结果,应写“适度指标标准值由研究者指定”;若直接复用核心类,则需注明“缺失时按样本中位数回退”。

3.5 Z-score 预处理

若用户选择 normalization="z-score",项目先对 \(U\) 执行标准分数变换:

$$ 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} $$

这里使用的是 std(ddof=0)。若 \(\sigma_j=0\),代码直接令该列

$$ z_{ij}=0 \tag{14} $$

3.6 Min-Max 标准化

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

$$ n_{ij}=\frac{y_{ij}-y_j^{\min}}{y_j^{\max}-y_j^{\min}} \tag{15} $$

其中:

  • 若用户选择 min-max,则 \(y_{ij}=u_{ij}\);
  • 若用户选择 z-score,则 \(y_{ij}=z_{ij}\)。

若分母满足 \(y_j^{\max}-y_j^{\min}\le 10^{-12}\),则程序直接令

$$ n_{ij}=0 \tag{16} $$

最终实际进入权重与 VIKOR 计算的标准化矩阵为

$$ N=(n_{ij})_{m\times n} \tag{17} $$

4. 权重确定

4.1 熵权法

weight_method="entropy" 时,项目在标准化矩阵 \(N\) 上计算客观权重。先定义第 \(j\) 个指标下第 \(i\) 个方案的比重:

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

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

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

熵值计算为

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

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

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

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

若全部 \(d_j\) 之和近似为 0,则程序退化为等权重分配。

4.2 自定义权重

weight_method="custom" 时,核心要求研究者提供一组非负预设权重 \(\alpha_j\),并自动归一化为

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

若存在负权重,或 \(\sum_{k=1}^{n}\alpha_k\le 0\),程序将直接报错。

4.3 当前实现口径

在当前 GUI 主流程中:

  • 默认权重方式为“熵权法”;
  • 若选择“自定义权重”,则会跳转到独立的权重编辑页 weight_editor_widget.py
  • 主窗口会先保存用户输入的自定义权重,再由核心按式(23)执行一次归一化。

因此,在论文中应明确写成“本文采用熵权法确定权重”或“本文采用研究者给定权重并归一化处理”,而不应笼统表述为“权重已知”。

5. VIKOR 核心模型

5.1 最优解与最劣解

由于前处理后所有指标都按正向指标解释,因此在标准化矩阵 \(N\) 上定义

$$ f_j^*=\max_{1\le i\le m}n_{ij}, \quad f_j^-=\min_{1\le i\le m}n_{ij} \tag{24} $$

5.2 方案与理想解的距离

项目当前实现的差距矩阵为

$$ g_{ij}=\frac{f_j^*-n_{ij}}{f_j^*-f_j^-} \tag{25} $$

若 \(f_j^*-f_j^-\le 10^{-12}\),代码把该指标差距直接记为 0。

5.3 群体效用与个体遗憾

第 \(i\) 个方案的群体效用距离定义为

$$ S_i=\sum_{j=1}^{n}w_j g_{ij} \tag{26} $$

第 \(i\) 个方案的最大遗憾距离定义为

$$ R_i=\max_{1\le j\le n}(w_j g_{ij}) \tag{27} $$

5.4 归一化折衷指标

先定义

$$ S^*=\min_{1\le i\le m}S_i, \quad S^-=\max_{1\le i\le m}S_i \tag{28} $$

$$ R^*=\min_{1\le i\le m}R_i, \quad R^-=\max_{1\le i\le m}R_i \tag{29} $$

则归一化后的群体效用项与个体遗憾项分别为

$$ \bar{S}_i=\frac{S_i-S^*}{S^- - S^*} \tag{30} $$

$$ \bar{R}_i=\frac{R_i-R^*}{R^- - R^*} \tag{31} $$

若式(30)或式(31)分母为 0,代码会直接把对应项置为 0。

最终折衷排序指标为

$$ Q_i=v\bar{S}_i+(1-v)\bar{R}_i, \quad 0\le v\le 1 \tag{32} $$

代码会把 \(v\) 截断到 \([0,1]\) 区间。当前核心默认

$$ v=0.5 \tag{33} $$

但必须说明:当前 GUI 并未提供 \(v\) 的可视化设置入口,因此常规界面路径等价于固定使用 \(v=0.5\)。 若研究需要比较不同 \(v\) 取值,应通过核心类或导出的复现脚本调整。

5.5 排序规则

项目对 \(Q_i\) 采用升序排序,并以 rank(ascending=True, method="min") 生成名次,即

$$ \text{Rank}_i=\operatorname{rank}_{\uparrow}(Q_i) \tag{34} $$

因此,\(Q_i\) 越小、排名越靠前,表示方案越优

6. 折衷解判据

当前实现通过内部函数 _compromise_solution() 按经典 VIKOR 的 C1/C2 规则给出折衷解。

6.1 可接受优势条件

设按 \(Q\) 值升序排序后,第 1 名与第 2 名方案的指标分别为 \(Q^{(1)}\) 与 \(Q^{(2)}\)。定义

$$ DQ= \begin{cases} \dfrac{1}{m-1}, & m>1\\ 0, & m=1 \end{cases} \tag{35} $$

则可接受优势条件 C1 为

$$ Q^{(2)}-Q^{(1)}\ge DQ \tag{36} $$

6.2 可接受稳定性条件

设按 \(Q\) 最优的方案记为 \(A_Q\),按 \(S\) 最优的方案记为 \(A_S\),按 \(R\) 最优的方案记为 \(A_R\)。则可接受稳定性条件 C2 为

$$ A_Q\in \{A_S,\ A_R\} \tag{37} $$

6.3 折衷解输出规则

当前代码按照下列规则输出 compromise_setrule

  1. 若同时满足 C1 与 C2,则唯一折衷解为

$$ \mathcal{C}=\{A_Q\} \tag{38} $$

  1. 若不满足 C1 但满足 C2,则返回所有满足

$$ Q_i\le Q^{(1)}+DQ \tag{39} $$

的方案集合。

  1. 若满足 C1 但不满足 C2,则返回

$$ \mathcal{C}=\{A_Q,\ A_S,\ A_R\} \tag{40} $$

  1. 若 C1 与 C2 均不满足,则返回阈值集合与 \(\{A_S,A_R\}\) 的并集。

论文中建议把 C1/C2 与最终折衷集合单独列为一张表,因为这部分不是普通排序表能完整表达的。

7. 输出结果与论文应用

7.1 Excel 工作表与文件结构

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

Sheet 名称 主要内容 论文中的建议用途
参数 算法名称、标准化方法、权重方法、\(v\)、指标列表、折衷解信息等 参数表或附录参数清单
原始数据 原始输入数据 数据附录
有效指标类型 同向化后的有效指标类型 指标定义表
适度指标处理 适度指标标准值与分母 适度指标说明表
归一化矩阵 标准化后的 \(N\) 附录计算明细
权重 指标权重 权重结果表
最优最劣解 \(f_j^*\)、\(f_j^-\) 计算过程表
S_R_Q 各方案的 \(S\)、\(R\)、\(Q\) 核心结果表
折衷解判据 DQ、C1、C2、best_by_Q/S/R、compromise_set 折衷解判据表
得分与排名 方案,S,R,Q,排名 正文排序结果表
图表清单 图表名、用途、路径 图表索引或附录

7.2 图表输出

项目默认输出 3 张图:

  1. weights.png:权重条形图;
  2. q_scores.png:\(Q\) 值条形图;
  3. ranking.png:排名横向柱图。

图表路径会写入 图表清单,且代码会按绝对路径去重。

7.3 复现输出

除 Excel 外,项目还会在结果目录中写出:

  • input_snapshot.xlsx
  • repro_module/core/__init__.py
  • repro_module/core/vikor_calculator.py
  • repro_vikor_<时间戳>.py

这意味着论文附录可以直接引用“输入快照 + 复现脚本”作为可复现性材料。

7.4 分层计算

结果页 results_widget.py 还提供“计算选中指标”的分层路径,内部调用 calculate_partial_vikor()。若用户在整体分析完成后继续选择部分指标,系统会在已有结果文件中追加工作表:

$$ \texttt{子集得分\_<HHMMSS>} \tag{41} $$

这部分结果适合论文中的“维度对比分析”或“稳健性补充分析”。

8. 基线回归样例

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

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

在该基线中,最终排序结果为

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

对应的 \(Q\) 值为

$$ Q=(0.0000,\ 0.1771,\ 0.6285,\ 1.0000) \tag{43} $$

折衷解集合为

$$ \mathcal{C}=\{A,\ C\} \tag{44} $$

这一结果已经被自动化测试固定校验,可作为当前实现版本的回归基准。

9. 论文写作模板

9.1 方法描述模板

“本文采用 VIKOR 方法对备选方案进行多指标折衷排序。首先根据指标属性对原始决策矩阵进行同向化处理,其中负向指标按式(6)转换,适度指标按式(8)映射为接近度得分;随后依据研究设定采用 Min-Max 标准化或 Z-score 与 Min-Max 组合标准化,得到标准化矩阵 \(N\)(式(11)–式(17))。在权重方面,本文使用熵权法/自定义权重确定指标权重(式(18)–式(23))。进一步计算各方案的群体效用距离 \(S_i\)、最大遗憾距离 \(R_i\) 以及折衷排序指标 \(Q_i\)(式(24)–式(34)),并结合 C1、C2 判据识别最终折衷解(式(35)–式(40))。”

9.2 结果解释模板

结果部分可写为:VIKOR 结果表显示,方案的 \(Q\) 值越小表示其综合折衷表现越优。与单纯的加权和排序不同,\(S_i\) 反映方案相对理想解的整体差距,\(R_i\) 则反映单个指标上的最大遗憾程度。当某方案同时具有较小的 \(S_i\)、\(R_i\) 与 \(Q_i\) 时,可认为其在群体效用与个体遗憾之间取得了较优平衡。进一步结合 C1 与 C2 判据,可判断最优方案是否具有足够优势,以及其稳定性是否得到 \(S\) 或 \(R\) 排序支持。

9.3 表格标题模板

  1. 表 1 指标类型与标准值设置表
  2. 表 2 VIKOR 指标权重结果表
  3. 表 3 各方案的 \(S\)、\(R\)、\(Q\) 与排名结果表
  4. 表 4 VIKOR 折衷解判据与最终折衷方案表
  5. 表 5 分层指标子集下的 VIKOR 对比结果表

9.4 图表题注模板

  1. 图 1 VIKOR 指标权重条形图。
  2. 图 2 各方案 \(Q\) 值分布图。
  3. 图 3 各方案 VIKOR 排名图。

9.5 表格示例

表 1 各方案的 \(S\)、\(R\)、\(Q\) 与排名结果

方案 \(S\) \(R\) \(Q\) 排名
A
B

表注:\(S\) 表示群体效用距离,\(R\) 表示最大遗憾距离,\(Q\) 为折衷排序指标,三者均为越小越优。

表 2 VIKOR 折衷解判据

指标 数值/结果 含义
\(DQ\) 可接受优势阈值
C1 是否满足可接受优势
C2 是否满足可接受稳定性
best_by_Q \(Q\) 最优方案
best_by_S \(S\) 最优方案
best_by_R \(R\) 最优方案
compromise_set 折衷解集合

10. 实现说明与注意事项

  1. 当前有效核心文件是 vikor_calculator.py,而不是通用名 calculator.py
  2. 为兼容旧界面与旧导入,核心保留了 calculate_topsis()TOPSISCalculator 这两个别名;但实际执行的仍是 VIKOR 逻辑,论文中不应把本模块误写为 TOPSIS。
  3. 当前 GUI 不暴露 \(v\) 的设置入口,因此常规软件操作默认 \(v=0.5\)。若研究者在论文中讨论不同 \(v\) 的敏感性,应使用核心类或导出脚本单独完成。
  4. 当前 GUI 对适度指标标准值执行“非 0”校验,而核心允许任意实数并在缺失时回退中位数;这两种口径不能混写。
  5. 折衷解判据 工作表中的 compromise_set 以逗号拼接字符串形式保存,而参数字典中保存的是列表;若论文直接复制 Excel 结果,应注意格式差异。
  6. 对标准 GUI 使用者而言,得分与排名 工作表已经是最适合直接进入论文正文的结果表;归一化矩阵最优最劣解折衷解判据 更适合放在附录或方法补充材料中。

11. 单篇终审补充

11.1 图题与表题对齐建议

  • 参数 表可写为:表X VIKOR 参数设置表。
  • 原始数据 表可写为:表X VIKOR 原始数据表。
  • 有效指标类型 表可写为:表X VIKOR 有效指标类型表。
  • 适度指标处理 表可写为:表X VIKOR 适度指标处理表。
  • 归一化矩阵 表可写为:表X VIKOR 归一化矩阵表。
  • 权重 表可写为:表X VIKOR 指标权重表。
  • 最优最劣解 表可写为:表X VIKOR 最优解与最劣解表。
  • S_R_Q 表可写为:表X VIKOR 群体效用、个体遗憾与折衷指标表。
  • 折衷解判据 表可写为:表X VIKOR 折衷解判据表。
  • 得分与排名 表可写为:表X VIKOR 得分与排名表。
  • 图表清单 表可写为:表X VIKOR 图表索引与路径表。
  • weights.png 建议写为:图X VIKOR 指标权重图。
  • q_scores.png 建议写为:图X VIKOR \(Q\) 值图。
  • ranking.png 建议写为:图X VIKOR 排名图。

11.2 终审说明

  • 当前代表性结果目录可采用 results/VIKOR-折衷排序法分析结果_20260329_170442。其中主工作簿为 VIKOR-折衷排序法分析结果_20260329_170442.xlsx
  • 当前真实工作表为 参数/原始数据/有效指标类型/适度指标处理/归一化矩阵/权重/最优最劣解/S_R_Q/折衷解判据/得分与排名/图表清单。论文表题应按这组中文 sheet 名落地。
  • 当前稳定实体图文件为 charts/weights.pngcharts/q_scores.pngcharts/ranking.png。若正文解释 VIKOR 折衷排序,应把 S_R_Q折衷解判据 两张表与 q_scores.png 一并引用。
  • 真实 repro 脚本为 repro_vikor_20260329_170442.py,并通过 SRC_FILE = SCRIPT_DIR / 'input_snapshot.xlsx' 读取脚本同目录输入快照,再输出到 repro_outputs/。它不是 repro_inputs/... 结构。
  • 当前脚本会携带 V = 0.5 参数快照。论文若讨论不同 \(v\) 取值,不能只引用 GUI 常规结果,应另行补充不同 \(v\) 的复现实验。

11.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/多指标评价/VIKOR-折衷排序法,代表性结果目录为 具体的算法3/多指标评价/VIKOR-折衷排序法/results/VIKOR-折衷排序法分析结果_20260329_170442
  • 该目录主工作簿为 VIKOR-折衷排序法分析结果_20260329_170442.xlsx,真实工作表为 参数原始数据有效指标类型适度指标处理归一化矩阵权重最优最劣解S_R_Q折衷解判据得分与排名图表清单。同目录还保留 input_snapshot.xlsx,其用途是复现输入快照。
  • 当前图目录为 charts/,实体图为 weights.pngq_scores.pngranking.png。因此这篇最合适的图文搭配仍是 S_R_Q/折衷解判据 两张表配 q_scores.png
  • 当前 repro 脚本为 repro_vikor_20260329_170442.py,并通过 SRC_FILE = SCRIPT_DIR / 'input_snapshot.xlsx' 读取输入快照;脚本里还显式固化了 V = 0.5
  • 当前代表性目录本身未见 repro_outputs/ 子目录,而更早的 20260324_232707 目录已出现 repro_outputs/。因此这篇应把 20260329_170442 作为“更干净的首层主结果目录”引用,而把递归复现结构作为旧目录中的工程事实补充,不要混为一谈。
  • 这篇应明确写成“脚本同目录 input_snapshot.xlsx 复现”结构,而不是 repro_inputs/... 结构。

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

  • 当前主结果目录应写作 具体的算法3/多指标评价/VIKOR-折衷排序法/results/VIKOR-折衷排序法分析结果_20260329_170442
  • 正文应围绕 参数原始数据有效指标类型适度指标处理归一化矩阵权重最优最劣解S_R_Q折衷解判据得分与排名图表清单 来写。
  • 图证应对应 weights.pngq_scores.pngranking.png,并把 \(Q\) 值、折衷解判据和最终排名配套说明。
  • 复现脚本应按 repro_vikor_20260329_170442.py + input_snapshot.xlsx 的口径说明,且要明确当前脚本固化了 V = 0.5