VIKOR-折衷排序法
VIKOR(VlseKriterijumska Optimizacija I Kompromisno Resenje)是一类以“群体效用”与“个体遗憾”折中为核心思想的多指标排序方法。就本项目 具体的算法3/多指标评价/VIKOR-折衷排序法 的实际实现而言,当前有效计算主链由…
VIKOR-折衷排序法
1. 方法概述
VIKOR(VlseKriterijumska Optimizacija I Kompromisno Resenje)是一类以“群体效用”与“个体遗憾”折中为核心思想的多指标排序方法。就本项目 具体的算法3/多指标评价/VIKOR-折衷排序法 的实际实现而言,当前有效计算主链由 vikor_calculator.py 完成,完整流程为:
- 读取方案列与指标列;
- 按指标类型进行同向化处理;
- 对处理后的矩阵执行
min-max或z-score + min-max标准化; - 通过熵权法或自定义权重得到指标权重;
- 计算 \(S_i\)、\(R_i\)、\(Q_i\);
- 按 \(Q_i\) 升序排序;
- 按经典 C1/C2 规则输出折衷解;
- 导出 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} $$
项目最终结果表的核心列为:
方案SRQ排名
其中 \(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.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 的标准顺序为:
- 上传数据;
- 选择参与计算的指标;
- 设置指标类型与适度指标标准值;
- 选择标准化方式与权重方式;
- 结果页自动执行整体 VIKOR 计算;
- 如用户确认,可继续执行部分指标的分层计算。
主要界面参数与数学含义对应如下。
| UI 字段 | 代码字段 | 数学含义 | 当前实现说明 |
|---|---|---|---|
| 指标选择 | selected_indicators |
参与计算的指标集合 | 未选中指标不进入矩阵 \(X\) |
| 指标类型 | indicator_types |
正向/负向/适度 | 影响式(4)至式(8) |
| 适度标准值 | standard_values / moderate_values |
目标值 \(t_j\) | UI 中适度指标标准值禁止为 0 |
| 标准化方法 | normalization |
矩阵标准化口径 | 仅支持 min-max 与 z-score |
| 权重方法 | weight_method |
权重生成方式 | 仅支持 entropy 与 custom |
| 自定义权重 | 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_set 与 rule:
- 若同时满足 C1 与 C2,则唯一折衷解为
$$ \mathcal{C}=\{A_Q\} \tag{38} $$
- 若不满足 C1 但满足 C2,则返回所有满足
$$ Q_i\le Q^{(1)}+DQ \tag{39} $$
的方案集合。
- 若满足 C1 但不满足 C2,则返回
$$ \mathcal{C}=\{A_Q,\ A_S,\ A_R\} \tag{40} $$
- 若 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 张图:
weights.png:权重条形图;q_scores.png:\(Q\) 值条形图;ranking.png:排名横向柱图。
图表路径会写入 图表清单,且代码会按绝对路径去重。
7.3 复现输出
除 Excel 外,项目还会在结果目录中写出:
input_snapshot.xlsxrepro_module/core/__init__.pyrepro_module/core/vikor_calculator.pyrepro_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 指标类型与标准值设置表
- 表 2 VIKOR 指标权重结果表
- 表 3 各方案的 \(S\)、\(R\)、\(Q\) 与排名结果表
- 表 4 VIKOR 折衷解判据与最终折衷方案表
- 表 5 分层指标子集下的 VIKOR 对比结果表
9.4 图表题注模板
- 图 1 VIKOR 指标权重条形图。
- 图 2 各方案 \(Q\) 值分布图。
- 图 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. 实现说明与注意事项
- 当前有效核心文件是 vikor_calculator.py,而不是通用名
calculator.py。 - 为兼容旧界面与旧导入,核心保留了
calculate_topsis()与TOPSISCalculator这两个别名;但实际执行的仍是 VIKOR 逻辑,论文中不应把本模块误写为 TOPSIS。 - 当前 GUI 不暴露 \(v\) 的设置入口,因此常规软件操作默认 \(v=0.5\)。若研究者在论文中讨论不同 \(v\) 的敏感性,应使用核心类或导出脚本单独完成。
- 当前 GUI 对适度指标标准值执行“非 0”校验,而核心允许任意实数并在缺失时回退中位数;这两种口径不能混写。
折衷解判据工作表中的compromise_set以逗号拼接字符串形式保存,而参数字典中保存的是列表;若论文直接复制 Excel 结果,应注意格式差异。- 对标准 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.png、charts/q_scores.png、charts/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.png、q_scores.png、ranking.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.png、q_scores.png、ranking.png,并把 \(Q\) 值、折衷解判据和最终排名配套说明。 - 复现脚本应按
repro_vikor_20260329_170442.py + input_snapshot.xlsx的口径说明,且要明确当前脚本固化了V = 0.5。