正在加载中...

展开本页目录
算法教程VIKOR多属性决策分析系统

VIKOR多属性决策分析系统

No.010 · 在线教程

VIKOR(VlseKriterijumska Optimizacija I Kompromisno Resenje)是一种多属性决策方法,核心思想是在“群体效用最大化”与“个体遗憾最小化”之间寻求折中解。

VIKOR 分析法

1. 方法概述

VIKOR(VlseKriterijumska Optimizacija I Kompromisno Resenje)是一种多属性决策方法,核心思想是在“群体效用最大化”与“个体遗憾最小化”之间寻求折中解。

设共有 \(n\) 个评价对象、\(m\) 个评价指标,原始决策矩阵记为

$$ X=(x_{ij})_{n\times m},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,m \tag{1} $$

其中 \(x_{ij}\) 表示第 \(i\) 个对象在第 \(j\) 个指标上的观测值。

2. 指标同向化与标准化

为保证“值越大越优”的一致偏好并消除量纲影响,先进行同向化,再进行向量标准化。

2.1 正向指标

$$ y_{ij}=\frac{x_{ij}-\min_i x_{ij}}{\max_i x_{ij}-\min_i x_{ij}} \tag{2} $$

2.2 负向指标

$$ y_{ij}=\frac{\max_i x_{ij}-x_{ij}}{\max_i x_{ij}-\min_i x_{ij}} \tag{3} $$

2.3 适度指标

若第 \(j\) 个指标目标值为 \(x_j^*\),则

$$ y_{ij}=1-\frac{|x_{ij}-x_j^*|}{\max\left\{|\max_i x_{ij}-x_j^*|,\ |\min_i x_{ij}-x_j^*|\right\}} \tag{4} $$

得到同向化矩阵 \(Y=(y_{ij})\) 后,进行向量标准化:

$$ z_{ij}=\frac{y_{ij}}{\sqrt{\sum_{i=1}^{n}y_{ij}^2}} \tag{5} $$

记标准化矩阵为 \(Z=(z_{ij})_{n\times m}\)。

3. 权重确定

VIKOR 可使用客观赋权(如熵权法)或主观给定权重。设权重向量为 \(w=(w_1,\ldots,w_m)\),满足

$$ \sum_{j=1}^{m}w_j=1,\quad w_j\ge 0 \tag{6} $$

若采用熵权法,可按下式计算:

$$ p_{ij}=\frac{y_{ij}}{\sum_{i=1}^{n}y_{ij}} \tag{7} $$

$$ e_j=-\frac{1}{\ln n}\sum_{i=1}^{n}p_{ij}\ln(p_{ij}) \tag{8} $$

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

$$ w_j=\frac{d_j}{\sum_{j=1}^{m}d_j} \tag{10} $$

4. 理想解与反理想解

在标准化矩阵 \(Z\) 上定义第 \(j\) 个指标的理想值与反理想值:

$$ f_j^*=\max_i z_{ij},\qquad f_j^-=\min_i z_{ij} \tag{11} $$

5. VIKOR 指数计算与排序

对第 \(i\) 个对象,定义群体效用指标 \(S_i\) 与个体最大遗憾指标 \(R_i\):

$$ S_i=\sum_{j=1}^{m}w_j\frac{f_j^*-z_{ij}}{f_j^*-f_j^-} \tag{12} $$

$$ R_i=\max_j\left\{w_j\frac{f_j^*-z_{ij}}{f_j^*-f_j^-}\right\} \tag{13} $$

再定义

$$ S^*=\min_i S_i,\quad S^-=\max_i S_i,\quad R^*=\min_i R_i,\quad R^-=\max_i R_i \tag{14} $$

综合折中指标 \(Q_i\) 为

$$ Q_i=v\frac{S_i-S^*}{S^- - S^*}+(1-v)\frac{R_i-R^*}{R^- - R^*},\quad v\in[0,1] \tag{15} $$

其中 \(v\) 表示“群体效用”权重(常用 \(v=0.5\))。最终按 \(Q_i\) 从小到大排序,\(Q_i\) 越小表示方案越优。

6. 妥协解判别(论文常用)

若需从排序结果中给出“妥协最优方案”,可进一步使用以下条件:

6.1 可接受优势条件

设 \(A^{(1)}\)、\(A^{(2)}\) 分别为 \(Q\) 排名第 1、2 的方案,则

$$ Q\big(A^{(2)}\big)-Q\big(A^{(1)}\big)\ge DQ,\quad DQ=\frac{1}{n-1} \tag{16} $$

6.2 可接受稳定性条件

排名第 1 的方案 \(A^{(1)}\) 还应在 \(S\) 或 \(R\) 排名中至少一项位居第一。

若两条件均满足,可将 \(A^{(1)}\) 作为妥协解;若不满足,可按 VIKOR 规则给出妥协解集合。

7. 结果解读与写作建议

论文中建议按“权重—S/R/Q—排序—解释”组织:

  1. 给出指标权重 \(w_j\),说明关键驱动指标;
  2. 给出 \(S_i\)、\(R_i\)、\(Q_i\) 与排序表;
  3. 解释高排名对象为何兼具较低总体遗憾与较低最大遗憾;
  4. 若采用妥协解判别,单独报告式(16)及稳定性判断结论。

为保证结论稳健性,建议补充参数 \(v\) 的敏感性分析(如 \(v=0.3,0.5,0.7\))并比较排序变化。

8. 输出结果

当前项目中的 VIKOR 模块位于 具体的算法/VIKOR_desktop,每次运行都会在 results/ 下新建独立目录 VIKOR_result_<时间戳>/,并在其中生成一个 Excel 结果文件 VIKOR分析结果_<输入文件名>_<时间戳>.xlsx。Excel 主体通常包含以下工作表:

  1. 原始数据
  2. 正向化数据
  3. 标准化数据
  4. 权重
  5. 理想解
  6. VIKOR结果
  7. 可视化图表

其中,权重 用于展示熵权法或自定义权重的最终结果,理想解 用于记录各指标的理想解与反理想解,VIKOR结果 用于集中展示 \(S\)、\(R\)、\(Q\) 及排序。可视化图表 工作表会把生成的多张图像嵌入 Excel,用于直接支撑报告和论文插图。

从源码看,图表不只是一两张基础图,而是包含权重分布图、排序结果图、\(Q\) 趋势图、\(S/R\) 分布图、\(S\)-\(R\) 散点图、Top 方案雷达图、优劣分类图、一致性分析图、累计贡献图等一组分析图。若启用了敏感性分析,对应图也会一并生成。

9. 实现说明与注意事项

当前实现与教材里的“最简 VIKOR 公式演示”相比,有几处必须如实写进 md:

  1. 输入文件支持 Excel 或 CSV,且默认第一列为评价对象,后续列为指标。
  2. 指标类型使用 正向指标 / 负向指标 / 适度指标 三种口径;适度指标若用户未提供最优值,代码会自动退回到该列中位数。
  3. 权重支持两种来源:entropycustom。当使用自定义权重时,代码会自动归一化;当使用熵权法时,会先把负值统一平移到非负区间,再构造比重矩阵,避免出现对数与除零异常。
  4. 标准化采用向量标准化,而不是 z-score 标准化,这一点应与一般机器学习文献中的“标准化”概念区分。
  5. 参数 \(c\) 必须满足 \(0\le c\le 1\),其含义是平衡群体效用与个体最大遗憾的折中系数,而不是任意调参常数。

因此,当前这个 VIKOR 模块更准确的表述应是“带输入正向化、可选熵权/自定义权重、丰富图表输出和 Excel 集成导出的 VIKOR 决策分析系统”。

10. 论文写作建议

建议正文先交代权重来源,再给出 \(S\)、\(R\)、\(Q\) 结果和最终排序,最后补充妥协解判别与敏感性分析。若篇幅允许,可在附录中展示理想解/反理想解表以及主要图表。

可直接改写使用的结果段落示例如下:

“本文采用 VIKOR 方法对备选方案进行折中排序。首先,对原始指标进行同向化与向量标准化处理,并结合熵权法确定指标权重;其次,计算各方案的群体效用指标 \(S\)、个体最大遗憾指标 \(R\) 以及综合折中指标 \(Q\),据此完成方案排序。结果表明,排名靠前的方案在总体效用和最大遗憾两方面均表现较优,体现了较好的折中性能。进一步结合妥协解判别条件和敏感性分析可知,主要优选方案在不同参数设定下保持较高稳定性,说明评价结果具有一定稳健性。”

11. 单篇终审补充

11.1 图题与表题对齐建议

  • 原始数据 表可写为:表X VIKOR 原始指标数据表。
  • 正向化数据 表可写为:表X VIKOR 指标同向化结果表。
  • 标准化数据 表可写为:表X VIKOR 向量标准化结果表。
  • 权重 表可写为:表X VIKOR 指标权重表。
  • 理想解 表可写为:表X VIKOR 理想解与反理想解表。
  • VIKOR结果 表可写为:表X VIKOR 的 \(S\)、\(R\)、\(Q\) 与排序结果表。
  • 可视化图表 表可写为:表X VIKOR 图表索引表。
  • weights_*.png 建议写为:图X VIKOR 指标权重图。
  • ranking_*.png 建议写为:图X VIKOR 综合排序图。
  • q_trend_*.png 建议写为:图X VIKOR 的 \(Q\) 值变化图。
  • sr_scatter_*.png 建议写为:图X VIKOR 的 \(S\)-\(R\) 散点分布图。
  • top5_radar_*.png 建议写为:图X VIKOR 前五方案指标雷达图。

11.2 终审说明

  • 当前可直接引用的代表性结果目录可采用 具体的算法/VIKOR_desktop/results/VIKOR_result_20260329_163910。主结果文件为 VIKOR分析结果_vikor_ui_input_20260329_163910.xlsx
  • 该目录下真实工作表为 原始数据/正向化数据/标准化数据/权重/理想解/VIKOR结果/可视化图表,与正文“输出结果”部分的自述一致,因此论文表题应直接按这一组 sheet 名落地,不要改写成其他泛化标题。
  • 当前真实图文件不是固定无后缀名,而是带哈希后缀的一组实体文件,例如 weights_584a5dd1.pngranking_b96d51d0.pngq_trend_d4077c6c.pngsr_scatter_5be521ca.pngtop5_radar_eebd769e.png。正文若引用图题,应按图义命名,不应把哈希串写进论文标题。
  • 当前历史 repro 脚本为 repro_vikor_20260329_163910.py,但脚本中的 DATA_FILE 仍指向 pytest 临时目录绝对路径,而不是 repro_inputs/...。脚本内部带有 _candidate_paths() 回退逻辑,会优先尝试脚本同目录、模块 uploads/results/ 下的同名文件,因此它是“可回退的历史脚本”,不是严格标准化的复现模板。
  • 因此,这一篇在论文终稿里应把结果证据锚定在真实 xlsx 与真实图文件,不宜把 repro_vikor_20260329_163910.py 直接描述成“采用 repro_inputs/... 的标准复现脚本”。若后续要把 VIKOR 单独整理为论文附录级复现实例,建议另选已标准化的新目录或补写新脚本。

11.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法/VIKOR_desktop,代表性结果目录为 具体的算法/VIKOR_desktop/results/VIKOR_result_20260329_163910
  • 该目录当前实际包含 1 份主工作簿 VIKOR分析结果_vikor_ui_input_20260329_163910.xlsx、1 个历史 repro 脚本 repro_vikor_20260329_163910.py,以及 17 张实体图:classification_7c770cf8.pngconsistency_046bd775.pngcontribution_c188ed08.pngcumulative_fc8ef34b.pngdecision_table_a3fb7a0a.pngq_histogram_4afc71df.pngq_trend_d4077c6c.pngr_distribution_4aa28eb6.pngranking_b96d51d0.pngs_distribution_6bfe8e91.pngsensitivity_analysis_406ae31c.pngsr_scatter_5be521ca.pngsuperiority_1dff751e.pngthree_compare_8a9c4108.pngtop3_compare_3729e254.pngtop5_radar_eebd769e.pngweights_584a5dd1.png
  • 主结果工作簿的实际工作表确认为 原始数据正向化数据标准化数据权重理想解VIKOR结果可视化图表。图文件数量明显多于工作表数量,说明大量图是以外部文件形式保存,再由 可视化图表 sheet 做索引或嵌入引用。
  • 当前 repro 口径必须如实写成“历史脚本+回退查找”,不能写成标准 repro_inputs 模式。因为 repro_vikor_20260329_163910.py 中仍写有 pytest 临时绝对路径 DATA_FILE = '/private/var/folders/.../vikor_ui_input.xlsx',同时依赖 VIKOR_DATA_FILE 环境变量或脚本内部候选路径回退。
  • 因此,这一篇的强证据应优先锚定真实结果目录中的主 xlsx 与 17 张实体图,而不是把 repro 脚本当成首要证据。若后续要做论文附录级标准复现实例,应重新生成带 repro_inputs/... 的新目录。
  • 另一个需要避免的误写是:VIKOR_result_20260329_163910 只是多批历史结果中的一个 UI 运行目录,与 163839163857163915 等目录并列存在;这些目录分别对应 baseline、smoke、再次 UI 运行等不同来源,不能在正文里混写成同一轮实验。

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

12.1 当前软件实现口径

本软件当前对应的源码目录为 具体的算法/VIKOR_desktop,核心类为 core/vikor_calculator.py 中的 VikorCalculator。软件实现的是多属性决策 VIKOR:上传方案和指标数据后,按指标类型进行正向化与标准化,计算权重、理想解、群体效用值 S、个体遗憾值 R 和综合折中指标 Q,最终按 Q 从小到大排序。

标准理论中的妥协解判别条件可以作为论文写作补充;当前软件主结果页和 Excel 以 VIKOR结果 中的 S/R/Q/排名 为核心输出。

12.2 输入数据和参数

上传页支持 Excel/CSV,示例数据位于 uploads/vikor_sample.xlsxuploads/vikor_sample.csv。数据应以第 1 列为对象名称,后续列为数值型指标。界面提供指标类型设置:正向、负向、适度;适度指标需要填写最优值。

权重方法支持熵权法和自定义权重。自定义权重界面提供平均分配、归一化到 1 和保存功能。VIKOR 折中系数在核心函数中默认按 c_value=0.5 处理,代表群体效用和个体遗憾之间的折中权衡;若界面传入了其他值,应以本次运行参数为准。

12.3 输出结果和图表

程序会在 results/VIKOR_result_YYYYMMDD_HHMMSS/ 下生成结果。Excel 文件通常命名为 VIKOR分析结果_输入文件名_YYYYMMDD_HHMMSS.xlsx,主要工作表包括:原始数据正向化数据标准化数据权重理想解VIKOR结果可视化图表

图表较多,常见文件包括 weights_*.pngranking_*.pngq_trend_*.pngs_distribution_*.pngr_distribution_*.pngsr_scatter_*.pngthree_compare_*.pngtop5_radar_*.pngsensitivity_analysis_*.pngq_histogram_*.pngdecision_table_*.png 等。文件名带随机短后缀,以实际结果目录为准。

阅读结果时,应先看 VIKOR结果Q 越小排名越靠前;再看 SR,区分整体表现好和最大短板小的方案;最后结合 权重理想解 解释排序原因。

12.4 复现与源码对应关系

结果页提供“打开结果目录”“打开结果文件”“导出复现代码”。按当前 ui/results_widget.py 源码,复现导出会尽量把输入保存到 repro_inputs/ 并生成核心复现脚本;但旧历史结果目录中可能保留带绝对临时路径和候选路径回退逻辑的旧式脚本。交付说明应以本次实际导出的复现文件为准。对应源码如下:

  • core/vikor_calculator.py:数据读取、正向化、标准化、熵权/自定义权重、理想解、S/R/Q 计算、图表和 Excel 导出。
  • ui/upload_widget.py:数据上传、示例数据、指标类型和权重设置。
  • ui/weight_editor_widget.py:自定义权重编辑。
  • ui/results_widget.py:结果展示、图表展示、打开结果和导出复现代码。

12.5 解释边界

VIKOR 是折中排序方法,不等同于“绝对最优”。当多个方案的 Q 值非常接近时,应谨慎宣称排名差异显著。权重方法、折中系数、指标方向和适度值都会影响排序,正式报告中应同步披露这些设置。