正在加载中...

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

MARCOS-折衷排序法

No.089 · 在线教程

MARCOS(Measurement of Alternatives and Ranking according to COmpromise Solution,折衷排序法)是一种以理想解和反理想解为参照、通过综合得分与效用函数完成排序的多指标评价方法。其基本思想是:先构造理想解…

MARCOS-折衷排序法

1. 方法概述

MARCOS(Measurement of Alternatives and Ranking according to COmpromise Solution,折衷排序法)是一种以理想解和反理想解为参照、通过综合得分与效用函数完成排序的多指标评价方法。其基本思想是:先构造理想解 \(AI\) 与反理想解 \(AAI\),再把各方案与这两个参照解联系起来,最终以效用函数 \(f(K)\) 作为排序依据。

就本项目当前实现而言,MARCOS 模块并不是单纯的理论公式拼接,而是一条完整的工程化计算链:

  • 先读取“方案列 + 指标列”的表格数据;
  • 区分正向指标、负向指标与适度指标;
  • 对适度指标先做“越接近标准值越优”的接近度变换;
  • 对所有列执行正值平移,确保除法运算稳定;
  • 权重可通过熵权法自动计算,也可由用户自定义;
  • 之后构造理想解 \(AI\)、反理想解 \(AAI\)、扩展矩阵、归一化矩阵和加权矩阵;
  • 最终计算 \(S\)、\(k_n\)、\(k_p\) 以及综合得分 \(f(K)\),按 \(f(K)\) 降序得到排序;
  • 同时输出敏感性分析、Excel 多表、图表与复现脚本。

设共有 \(m\) 个方案、\(n\) 个指标,原始决策矩阵记为

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

设最终权重向量为

$$ w=\big(w_1,w_2,\ldots,w_n\big)^\top, \quad w_j\ge 0, \quad \sum_{j=1}^{n}w_j=1 \tag{2} $$

项目最终结果页与 Excel 的 得分与排名 工作表只保留真实方案,并输出 综合得分f(K)排名 两列。其中 \(f(K)\) 越大,方案越优

2. 输入结构与项目流程

2.1 输入数据结构

上传页 ui/upload_widget.py 支持 .xlsx.xls.csv 文件;结合 utils/data_validator.py,当前项目要求:

  • 第 1 列为方案或对象名称;
  • 第 2 列及以后为指标列;
  • 指标列必须全部可转为数值;
  • 不允许空值;
  • 方案名称不允许重复;
  • 不允许常数列。

因此,进入 core/calculator.py 的数据结构可记为

$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$

核心函数 _prepare_matrix() 还会再次检查:

  • 所选指标必须真实存在于数据表中;
  • 所选指标中若有空值或非数值,直接报错;
  • 所选指标中若有常数列,直接报错。

2.2 界面参数流程

主窗口 ui/main_window.py 的标准流程为:

  1. 上传数据;
  2. 选择参与计算的指标;
  3. 为各指标设定类型;
  4. 进入方法页,选择标准化方式与权重方式;
  5. 结果页调用 Calculator.run_analysis() 自动完成计算与导出。

方法页 ui/methods_widget.py 当前提供两类参数:

  • normalizationmin-maxz-score
  • weight_methodentropycustom

这里必须说明一个项目实现细节:界面上写的是“标准化方法”,但这只用于 熵权法求权重;真正 MARCOS 主体中的归一化公式并不跟随该选项变化,而是固定采用相对理想解 \(AI\) 的比值归一化。

3. 指标类型、适度指标与正值平移

3.1 指标类型

当前模块支持三类指标:

  • 正向指标:值越大越优;
  • 负向指标:值越小越优;
  • 适度指标:值越接近给定标准值越优。

指标页 ui/indicators_widget.py 会为每个被选中指标收集 indicator_typesstandard_values。若某指标被设为适度指标,则必须填写标准值。

3.2 适度指标接近度变换

对适度指标 \(C_j\),设其目标值为 \(s_j^\ast\)。项目先计算该列相对目标值的最大偏离尺度:

$$ M_j=\max\left(|\max_i x_{ij}-s_j^\ast|,\ |\min_i x_{ij}-s_j^\ast|\right) \tag{4} $$

若 \(M_j\le 0\),程序直接令

$$ y_{ij}=1 \tag{5} $$

否则采用接近度变换:

$$ y_{ij}=1-\frac{|x_{ij}-s_j^\ast|}{M_j} \tag{6} $$

随后程序会把 \(y_{ij}\) 裁剪到 \([0,1]\) 区间,并把该指标在后续全部计算中统一视为正向指标,即

$$ x_{ij}\longrightarrow y_{ij}\in[0,1]\longrightarrow \text{按正向指标处理} \tag{7} $$

这对应 Calculator._prepare_matrix() 的实现逻辑。

3.3 适度指标标准值的工程约束

虽然从纯数学角度看,适度指标的目标值可以取 0,但当前项目的 UI 和核心实现都把标准值等于 0 视为“未设置”。因此,在正常使用流程中必须满足

$$ s_j^\ast\ne 0 \tag{8} $$

否则程序会报出“适度指标未设置标准值”的错误。

3.4 正值平移

为避免后续比值计算出现 0 或负数,项目会在 _ensure_positive() 中对每一列进行正值平移。若某列最小值满足 \(\min_i y_{ij}\le 0\),则执行

$$ \tilde{x}_{ij}=y_{ij}+\big(-\min_i y_{ij}\big)+\varepsilon \tag{9} $$

其中 \(\varepsilon\) 为极小正数,项目默认取 \(10^{-12}\)。随后程序统一做下界裁剪:

$$ \tilde{x}_{ij}\leftarrow \max(\tilde{x}_{ij},\varepsilon) \tag{10} $$

于是,真正进入后续求权与 MARCOS 计算的预处理矩阵记为

$$ \tilde{X}=(\tilde{x}_{ij})_{m\times n} \tag{11} $$

Excel 中的 正值平移预处理矩阵 工作表,正对应式(9)至式(11)。

4. 权重确定:熵权法与自定义权重

4.1 熵权法标准化矩阵与 MARCOS 主归一化矩阵是两套对象

当前模块存在两套不同矩阵:

  • 一套是熵权法权重计算用的标准化矩阵;
  • 另一套是 MARCOS 主体中围绕 \(AI\) 构造的归一化矩阵 \(N_{ext}\)。

两者并不相同,不能混写。

4.2 熵权法的 Max-Min 标准化

当用户选择 min-max 且权重方式为 entropy 时,项目在 _entropy_normalize() 中对正向指标采用

$$ n_{ij}^{(E)}=\frac{\tilde{x}_{ij}-\min_i \tilde{x}_{ij}}{\max_i \tilde{x}_{ij}-\min_i \tilde{x}_{ij}} \tag{12} $$

对负向指标采用

$$ n_{ij}^{(E)}=\frac{\max_i \tilde{x}_{ij}-\tilde{x}_{ij}}{\max_i \tilde{x}_{ij}-\min_i \tilde{x}_{ij}} \tag{13} $$

若某列上下界相同,则该列熵权法标准化结果直接记为 0。

4.3 熵权法的 Z-score 后再归一化

当用户选择 z-score 时,项目先计算

$$ z_{ij}=\frac{\tilde{x}_{ij}-\mu_j}{\sigma_j} \tag{14} $$

其中 \(\mu_j\) 为第 \(j\) 列均值,\(\sigma_j\) 为总体标准差,代码中采用 std(ddof=0)。随后再映射到 \([0,1]\) 区间:

$$ \operatorname{mm}_{ij}=\frac{z_{ij}-\min_i z_{ij}}{\max_i z_{ij}-\min_i z_{ij}} \tag{15} $$

对正向指标,熵权法标准化结果取

$$ n_{ij}^{(E)}=\operatorname{mm}_{ij} \tag{16} $$

对负向指标则取

$$ n_{ij}^{(E)}=1-\operatorname{mm}_{ij} \tag{17} $$

于是熵权法标准化矩阵记为

$$ N^{(E)}=\big(n_{ij}^{(E)}\big)_{m\times n} \tag{18} $$

4.4 熵值、差异系数与权重

设第 \(j\) 个指标在矩阵 \(N^{(E)}\) 中的列和为 \(\sum_i n_{ij}^{(E)}\),则其比重为

$$ p_{ij}=\frac{n_{ij}^{(E)}}{\sum_{k=1}^{m}n_{kj}^{(E)}} \tag{19} $$

熵值定义为

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

差异系数定义为

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

最终熵权为

$$ w_j=\frac{g_j}{\sum_{k=1}^{n}g_k} \tag{22} $$

当前导出的 熵权法标准化熵权法计算 工作表,分别对应式(18)和式(19)至式(22)。

4.5 自定义权重

当用户选择 custom 时,项目不会计算式(19)至式(22),而是读取用户输入的原始权重 \(\hat{w}_j\),先按所选指标顺序重排,对缺失项补 0,再统一归一化:

$$ w_j=\frac{\hat{w}_j}{\sum_{k=1}^{n}\hat{w}_k} \tag{23} $$

与 MAIRCA 不同,当前 MARCOS 模块在自定义权重总和不大于 0 时不会自动回退为等权,而是直接报错。因此,工程上必须满足

$$ \sum_{j=1}^{n}\hat{w}_j>0 \tag{24} $$

5. 理想解、扩展矩阵与 MARCOS 归一化

5.1 理想解与反理想解

对预处理矩阵 \(\tilde{X}\) 中的第 \(j\) 个指标,项目按有效指标类型 eff_types 构造理想解 \(AI_j\) 与反理想解 \(AAI_j\)。

对正向指标:

$$ AI_j=\max_i \tilde{x}_{ij}, \qquad AAI_j=\min_i \tilde{x}_{ij} \tag{25} $$

对负向指标:

$$ AI_j=\min_i \tilde{x}_{ij}, \qquad AAI_j=\max_i \tilde{x}_{ij} \tag{26} $$

需要注意的是,若某指标最初是适度指标,则在式(25)和式(26)之前已根据式(4)至式(7)被转成正向指标。

5.2 扩展矩阵

项目不会只对真实方案计算,而是先构造扩展矩阵,把反理想解行和理想解行分别拼接到方案矩阵的前后。记

$$ X_{ext}= \begin{bmatrix} AAI_1 & AAI_2 & \cdots & AAI_n\\ \tilde{x}_{11} & \tilde{x}_{12} & \cdots & \tilde{x}_{1n}\\ \vdots & \vdots & \ddots & \vdots\\ \tilde{x}_{m1} & \tilde{x}_{m2} & \cdots & \tilde{x}_{mn}\\ AI_1 & AI_2 & \cdots & AI_n \end{bmatrix} \tag{27} $$

在代码中,这一矩阵的行顺序固定为:

  • 第 1 行:AAI(反理想)
  • 第 2 至第 \(m+1\) 行:真实方案;
  • 最后一行:AI(理想)

因此,扩展矩阵的数值部分规模为

$$ (m+2)\times n \tag{28} $$

这也解释了基线测试中 归一化矩阵N_ext加权矩阵V_ext 在 4 个方案、3 个指标场景下会得到 \(6\times 4\) 的展示表结构,其中额外一列是 方案 标签列。

5.3 MARCOS 归一化矩阵

当前项目的 MARCOS 归一化以 \(AI\) 为统一参照。对正向指标:

$$ n_{ij}=\frac{x_{ij}^{ext}}{AI_j} \tag{29} $$

对负向指标:

$$ n_{ij}=\frac{AI_j}{x_{ij}^{ext}} \tag{30} $$

其中 \(x_{ij}^{ext}\) 表示扩展矩阵 \(X_{ext}\) 中对应行列的数值。于是得到扩展归一化矩阵

$$ N_{ext}=(n_{ij})_{(m+2)\times n} \tag{31} $$

理想解行经过归一化后恒为 1,而反理想解行通常不超过 1。项目导出的 归一化矩阵 工作表,对应的正是式(31)。

5.4 加权矩阵

在得到权重向量 \(w\) 后,程序构造加权矩阵:

$$ v_{ij}=w_j n_{ij} \tag{32} $$

$$ V_{ext}=(v_{ij})_{(m+2)\times n} \tag{33} $$

Excel 中的 加权矩阵 工作表即对应式(33)。

6. 得分、效用度与最终排序

6.1 综合得分

项目对扩展矩阵中的每一行都计算综合得分:

$$ S_i=\sum_{j=1}^{n}v_{ij}, \qquad i=0,1,\ldots,m+1 \tag{34} $$

其中:

  • \(S_0\) 对应反理想解 \(AAI\);
  • \(S_{m+1}\) 对应理想解 \(AI\);
  • 中间 \(m\) 个 \(S_i\) 对应真实方案。

6.2 相对反理想解与理想解的效用度

当前项目在 _marcos_scores() 中定义:

$$ k_n=\frac{S_i}{S_{AAI}} \tag{35} $$

$$ k_p=\frac{S_i}{S_{AI}} \tag{36} $$

结果表中的列名分别写为 k_n(S/S_AAI)k_p(S/S_AI)

6.3 中间效用函数

项目进一步采用如下中间函数:

$$ f(k_n)=\frac{k_p}{k_p+k_n} \tag{37} $$

$$ f(k_p)=\frac{k_n}{k_p+k_n} \tag{38} $$

需要特别指出的是:式(37)和式(38)的写法与代码变量命名严格一致,属于当前项目采用的 pyDecision 风格实现。也就是说,f(k_n) 列在程序里对应的是 \(\frac{k_p}{k_p+k_n}\),f(k_p) 列对应的是 \(\frac{k_n}{k_p+k_n}\)。

6.4 最终综合得分 \(f(K)\)

程序最终采用如下效用函数:

$$ f(K)= \frac{k_p+k_n} {1+\dfrac{1-f(k_p)}{f(k_p)}+\dfrac{1-f(k_n)}{f(k_n)}} \tag{39} $$

排序时只保留真实方案行,剔除扩展矩阵中的 AAI(反理想)AI(理想) 两行。最终排名规则为

$$ \operatorname{Rank}(A_i)=\operatorname{rank}_{\downarrow}^{\text{min}}\big(f(K_i)\big) \tag{40} $$

这正是 Calculator._rank_from_scores() 的实现。结果页 ui/results_widget.py 也只展示 排名方案综合得分f(K) 三列,并在顶部单独显示 Top1

7. 敏感性分析、导出结构与复现脚本

7.1 权重敏感性分析

当前模块支持权重敏感性分析,默认扰动比例为 0.1,即 \(\pm 10\%\)。对第 \(j\) 个指标,先构造未归一化扰动权重:

$$ \tilde{w}_{k}^{(\pm,j)}= \begin{cases} (1\pm\delta)w_k, & k=j\\ w_k, & k\ne j \end{cases} \tag{41} $$

随后再归一化为

$$ w_{k}^{(\pm,j)}= \frac{\tilde{w}_{k}^{(\pm,j)}}{\sum_{\ell=1}^{n}\tilde{w}_{\ell}^{(\pm,j)}} \tag{42} $$

程序在固定 \(N_{ext}\) 的前提下,重新计算 \(S\)、\(k_n\)、\(k_p\) 与 \(f(K)\),并输出:

  • Spearman相关系数
  • 最大名次变化
  • Top1(基准)
  • Top1(扰动后)
  • Top1是否变化

7.2 默认导出路径与图表

若未显式指定 output_file,核心函数 _prepare_output_path() 会在 results/ 目录下自动创建:

  • MARCOS-折衷排序法分析结果_<时间戳>/

并在其中生成:

  • MARCOS-折衷排序法分析结果_<时间戳>.xlsx
  • charts/weights.png
  • charts/scores.png
  • charts/sensitivity.png(若存在敏感性分析)
  • repro_inputs/input_snapshot.csv
  • repro_marcos.py

其中图表含义分别为:

  • weights.png:指标权重柱状图;
  • scores.png:各方案 f(K) 柱状图;
  • sensitivity.png:各指标敏感性稳定度柱状图。

7.3 Excel 工作表

结合 _write_excel() 的实际逻辑,当前模块可能生成以下工作表:

  • 参数
  • 原始数据
  • 指标类型
  • 适度指标
  • 正值平移
  • 预处理矩阵
  • 理想反理想
  • 扩展矩阵
  • 归一化矩阵
  • 权重
  • 加权矩阵
  • 得分效用
  • 敏感性分析
  • 熵权法标准化
  • 熵权法计算
  • 得分与排名
  • 图表清单

其中:

  • 得分效用 会保留 AAI、真实方案和 AI 的全量得分链;
  • 得分与排名 只保留真实方案,是论文中最适合直接引用的结果表;
  • 图表清单 用于记录图表路径,且测试中要求路径不重复、文件真实存在。

7.4 复现脚本

程序会在结果目录下自动生成 repro_marcos.py。该脚本会记录:

  • 原始数据快照 repro_inputs/input_snapshot.csv
  • 所选指标;
  • 指标类型;
  • 适度指标标准值;
  • 熵权法标准化方式;
  • 权重方式;
  • 自定义权重;
  • 敏感性扰动比例。

重新运行该脚本后,会再次调用 Calculator.run_analysis(),并在脚本目录或其子目录中生成一份新的 MARCOS 结果文件。

8. 与项目实现一致的若干注意事项

8.1 界面“标准化方法”只影响熵权法,不影响 MARCOS 主归一化

这是当前模块最容易被误写的地方。项目中:

  • min-maxz-score 只用于式(12)至式(18)的熵权法标准化;
  • 真正用于 MARCOS 主体的是式(29)至式(31)的 \(AI\) 参照归一化。

若论文把两者混为一谈,就会与项目代码实际实现脱节。

8.2 适度指标会先变成接近度,再按正向指标处理

因此,适度指标在当前模块中不会保留原始量纲。它会先根据式(4)至式(7)转成接近度变量,再参与理想解、反理想解、归一化与加权运算。

8.3 自定义权重总和必须大于 0

这一点与前面已经完成的 MAIRCA 文档不同。当前 MARCOS 模块在自定义权重无效时不会自动回退到等权,而是直接中止计算。因此,论文中若写“采用自定义权重”,应确保该权重向量在软件内部经过重排、补零和归一化后仍具有正总和。

8.4 最终排序只针对真实方案

虽然 得分效用 工作表中包含 AAI(反理想)AI(理想) 两行,但 得分与排名 工作表和结果页都会把这两行剔除,只对真实方案做排序。这也是为什么最终结果表只有 \(m\) 行,而不是 \(m+2\) 行。

8.5 f(k_n)f(k_p) 的表达式需要按代码口径写

当前实现采用的中间效用函数写法与不少教材版表述不同。若论文要完全贴合软件实现,应直接采用式(37)至式(39),而不要自行替换成其他文献中的变体,否则会导致“论文公式”和“软件结果”不一致。

9. 论文写作模板

若本文采用本项目中的 MARCOS 模块进行多指标综合评价,可按如下方式描述:

首先构建方案-指标原始决策矩阵,并依据指标属性将指标划分为正向指标、负向指标和适度指标。对于适度指标,依据其与目标标准值的偏离程度构造接近度指标,并将其统一转化为效益型变量;随后对全部指标数据进行正值平移,以保证后续比值计算的稳定性。权重确定阶段可采用熵权法或自定义权重,其中熵权法通过标准化矩阵计算各指标熵值、差异系数及权重。之后,根据指标类型分别构造理想解与反理想解,并形成包含反理想解、各待评方案和理想解的扩展矩阵;在此基础上完成归一化、加权求和、效用度计算与效用函数求值,最终依据综合得分 \(f(K)\) 对各方案进行排序。

若研究同时采用了软件默认的稳定性检验,还可进一步写为:

在获得基准排序结果后,对各指标权重分别施加正负扰动并重新归一化,在保持扩展归一化矩阵不变的前提下重新计算综合得分与排名,并利用 Spearman 相关系数、最大名次变化以及最优方案是否变化等指标,对 MARCOS 结果的稳定性进行检验。

10. 与代码实现的对应关系

表 1 MARCOS 关键公式与项目实现对应关系

内容 数学表达 项目实现
原始输入结构与数据约束 式(1)—式(3) ui/upload_widget.pyutils/data_validator.pycore/calculator.py::_prepare_matrix
适度指标接近度变换 式(4)—式(8) ui/indicators_widget.pycore/calculator.py::_prepare_matrix
正值平移与预处理矩阵 式(9)—式(11) core/calculator.py::_ensure_positive
熵权法标准化与权重计算 式(12)—式(24) ui/methods_widget.pycore/calculator.py::_entropy_normalize_entropy_weights_resolve_weights
理想解、反理想解与扩展矩阵 式(25)—式(28) core/calculator.py::_ideal_anti_ideal_marcos_matrices
MARCOS 归一化与加权矩阵 式(29)—式(33) core/calculator.py::_marcos_matrices
得分、效用度与最终排序 式(34)—式(40) core/calculator.py::_marcos_scores_rank_from_scores
敏感性分析 式(41)—式(42) core/calculator.py::_sensitivity_analysis
Excel、图表与复现脚本导出 第 7 节 core/calculator.py::_write_excel_write_repro_scriptui/results_widget.py

总体来看,本项目中的 MARCOS 属于“适度指标接近度转换 + 正值平移 + 熵权/自定义赋权 + AI/AAI 扩展矩阵建模 + 效用函数 \(f(K)\) 排序 + 敏感性分析”的工程化实现。若要写成论文方法说明,建议把式(25)至式(40)作为方法主体,再结合式(4)至式(24)说明软件在预处理、权重生成与参数约束上的具体实现口径。

11. 论文模板补充

11.1 方法描述模板

“本文采用 MARCOS 方法对候选方案进行综合评价。首先对原始决策矩阵执行指标类型处理、正值平移和权重确定,并构造包含反理想解与理想解的扩展矩阵;随后完成归一化、加权求和以及效用度与效用函数计算,最终依据综合得分 \(f(K)\) 对方案进行排序。”

11.2 结果解释模板

结果部分可写为:结果表明,方案相对于理想解的效用度越高,其综合得分通常越大,排序越靠前。若敏感性分析中最优方案在多次权重扰动后保持不变,则说明评价结果具有较好的稳定性;若某些方案在扩展矩阵中与理想解距离明显较近,则其优势更为稳定。

11.3 表格标题模板

  1. 表 1 MARCOS 指标类型与权重设置表
  2. 表 2 MARCOS 扩展矩阵与加权矩阵结果表
  3. 表 3 MARCOS 效用度与综合得分结果表
  4. 表 4 MARCOS 敏感性分析结果表

11.4 图表题注模板

  1. 图 1 MARCOS 指标权重分布图。
  2. 图 2 MARCOS 综合得分排序图。
  3. 图 3 MARCOS 权重扰动稳定性分析图。

11.5 表格示例

表 1 MARCOS 综合评价结果表示例

方案 相对反理想效用度 相对理想效用度 综合得分 \(f(K)\) 排名
\(A_1\)
\(A_2\)

表注:最终排序依据综合得分 \(f(K)\) 降序确定;若需完全贴合软件实现,应使用当前文档中给出的效用函数口径。

12. 单篇终审补充

12.1 图题与表题对齐建议

  • 参数 表可写为:表X MARCOS 参数设置表。
  • 原始数据 表可写为:表X MARCOS 原始数据表。
  • 指标类型 表可写为:表X MARCOS 指标类型设置表。
  • 适度指标 表可写为:表X MARCOS 适度指标设置表。
  • 正值平移 表可写为:表X MARCOS 正值平移结果表。
  • 预处理矩阵 表可写为:表X MARCOS 预处理矩阵表。
  • 理想反理想 表可写为:表X MARCOS 理想解与反理想解表。
  • 扩展矩阵 表可写为:表X MARCOS 扩展矩阵表。
  • 归一化矩阵 表可写为:表X MARCOS 归一化矩阵表。
  • 权重 表可写为:表X MARCOS 指标权重表。
  • 加权矩阵 表可写为:表X MARCOS 加权矩阵表。
  • 得分效用 表可写为:表X MARCOS 得分与效用度表。
  • 敏感性分析 表可写为:表X MARCOS 敏感性分析表。
  • 熵权法标准化 表可写为:表X MARCOS 熵权法标准化表。
  • 熵权法计算 表可写为:表X MARCOS 熵权法计算过程表。
  • 得分与排名 表可写为:表X MARCOS 得分与排名表。
  • 图表清单 表可写为:表X MARCOS 图表索引与路径表。
  • weights.png 建议写为:图X MARCOS 指标权重图。
  • scores.png 建议写为:图X MARCOS 综合得分图。
  • sensitivity.png 建议写为:图X MARCOS 敏感性分析图。

12.2 终审说明

  • 当前代表性结果目录可采用 results/MARCOS-折衷排序法分析结果_20260329_170403,因为该目录既包含 熵权法标准化/熵权法计算,又保留了完整图表与 repro。
  • 当前真实工作表为 参数/原始数据/指标类型/适度指标/正值平移/预处理矩阵/理想反理想/扩展矩阵/归一化矩阵/权重/加权矩阵/得分效用/敏感性分析/熵权法标准化/熵权法计算/得分与排名/图表清单。部分目录缺 熵权法 两张表,论文若讨论熵权细节,应优先引用较完整目录。
  • 当前稳定实体图文件为 charts/weights.pngcharts/scores.pngcharts/sensitivity.png。如果正文解释“最优方案在扰动下稳定”,应直接对应 敏感性分析 工作表和 sensitivity.png
  • 真实 repro 脚本统一命名为 repro_marcos.py。当前较新目录里脚本通常采用 REPRO_INPUT = 'repro_inputs/input_snapshot.csv' 作为主输入快照,而 SRC_FILE 可能为空字符串或保留旧测试路径。附录应以 REPRO_INPUT 这条可移植口径为主,不要引用空 SRC_FILE
  • 当前 repro 脚本还会在找不到 REPRO_INPUT 时回退到结果簿 RESULT_XLSX_NAME原始数据 sheet。论文若描述复现机制,应说明它支持“优先使用输入快照,必要时从结果簿自恢复原始数据”的双重回退逻辑。

12.3 全量强化补充

  • 当前 MARCOS 文档建议绑定的真实目录为 具体的算法3/多指标评价/MARCOS-折衷排序法/results/MARCOS-折衷排序法分析结果_20260329_170403
  • 该目录首层主工作簿为 MARCOS-折衷排序法分析结果_20260329_170403.xlsx,实际工作表为 参数原始数据指标类型适度指标正值平移预处理矩阵理想反理想扩展矩阵归一化矩阵权重加权矩阵得分效用敏感性分析熵权法标准化熵权法计算得分与排名图表清单
  • 首层图表目录为 charts/,真实图片为 weights.pngscores.pngsensitivity.png,分别对应权重结构、最终得分排序和敏感性分析。
  • 该目录首层复现入口为 repro_marcos.py,输入快照为 repro_inputs/input_snapshot.csv。脚本中同时存在 SRC_FILE = r'具体的算法3/多指标评价/Z冒烟测试/uploads/window4_baseline_input.csv'REPRO_INPUT = r'repro_inputs/input_snapshot.csv'
  • 因为脚本候选顺序会先加入 SRC_FILE,再加入 script_dir / REPRO_INPUT,所以论文附录不能简单说“只读取 repro_inputs”。更准确的写法是:当前脚本保留了历史测试源路径,同时提供同目录 repro_inputs/input_snapshot.csv 作为可移植输入快照,并在候选路径不可用时继续回退到结果簿。
  • 这也意味着 MARCOS 属于“历史绝对/测试路径 + 相对输入快照 + 结果簿回读”三重兼容复现口径,而不是单一 repro_inputs 口径。面向论文或用户说明时,应优先展示 repro_inputs/input_snapshot.csv 的可移植路径,同时补充说明脚本中保留旧路径兼容逻辑。
  • 当前目录没有另建 repro_outputs/ 子目录,复现说明应以 repro_marcos.pyrepro_inputs/input_snapshot.csv 和主结果簿回读能力为核心,不要套用 CODAS 或 ANP 那类 repro_outputs 分层结构。
  • 若结果解释涉及熵权法,应使用本目录完整存在的 熵权法标准化熵权法计算 两张表;不要引用缺少这两张表的早期 MARCOS 目录作为论文主证据。

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

  • 当前实现的主结果目录应写作 具体的算法3/多指标评价/MARCOS-折衷排序法/results/MARCOS-折衷排序法分析结果_20260329_170403
  • 正文应围绕 参数原始数据指标类型适度指标正值平移预处理矩阵理想反理想扩展矩阵归一化矩阵权重加权矩阵得分效用敏感性分析熵权法标准化熵权法计算得分与排名图表清单 来写。
  • 图证应对应 charts/weights.pngcharts/scores.pngcharts/sensitivity.png
  • repro_marcos.py 采用 REPRO_INPUT = 'repro_inputs/input_snapshot.csv' 的可移植路径,同时保留旧测试路径兼容逻辑;正文应以 repro_inputs 为主,不要把空 SRC_FILE 当成有效输入口径。