MOORA-比率分析法
MOORA(Multi-Objective Optimization by Ratio Analysis,比率分析法)是一类典型的多指标综合评价方法。其核心思想是:先对各指标进行标准化,再乘以指标权重,最后以“效益项之和减去成本项之和”的方式得到综合得分,并据此完成排序。
MOORA-比率分析法
1. 方法概述
MOORA(Multi-Objective Optimization by Ratio Analysis,比率分析法)是一类典型的多指标综合评价方法。其核心思想是:先对各指标进行标准化,再乘以指标权重,最后以“效益项之和减去成本项之和”的方式得到综合得分,并据此完成排序。
就本项目当前实现而言,MOORA 模块采用的是 比率系统(Ratio System) 路径,而不是参考点法或全家族扩展形式。结合 core/moora_calculator.py 的实际代码,完整流程为:
- 读取“方案列 + 指标列”的原始数据;
- 区分正向指标、负向指标与适度指标;
- 对适度指标先转化为“偏离目标值的绝对距离”,并把它作为负向指标处理;
- 对全部指标构造统一标准化矩阵;
- 通过熵权法或自定义方式得到权重;
- 计算加权标准化矩阵;
- 用“效益得分减成本得分”得到
MOORA综合得分S; - 按综合得分降序排序。
设共有 \(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} $$
项目最终结果表中的核心列为 效益得分、成本得分、MOORA综合得分S 与 排名。其中 \(S_i\) 越大,方案越优。
2. 输入结构与项目流程
2.1 输入数据结构
上传页 ui/upload_widget.py 支持 .xlsx、.xls 与 .csv 文件;结合 utils/data_validator.py,当前项目对输入数据的要求为:
- 第 1 列必须为方案或对象名称;
- 第 2 列及以后为指标列;
- 指标列必须全部可转为数值;
- 不允许空值;
- 方案名称不允许重复;
- 不允许常数列。
因此,进入 core/moora_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 的典型流程为:
- 上传数据;
- 选择参与计算的指标;
- 为每个指标设定类型;
- 在方法页选择标准化方式和权重方式;
- 在结果页调用
MOORACalculator.calculate_moora()自动完成计算与导出。
方法页 ui/methods_widget.py 当前支持三种标准化方式:
vector:向量标准化;min_max:Max-Min 归一化;z_score:Z-score 后再映射到 \([0,1]\)。
同时支持两种权重方式:
entropy:熵权法;custom:自定义权重。
3. 指标类型与适度指标处理
3.1 指标类型
当前项目支持三类指标:
- 正向指标:值越大越优;
- 负向指标:值越小越优;
- 适度指标:值越接近给定标准值越优。
指标页 ui/indicators_widget.py 会收集:
selected_indicators;indicator_types;standard_values。
3.2 适度指标在本项目中的真实处理方式
这里必须特别说明:当前 MOORA 模块对适度指标的处理方式,与前面已经完成的 MAIRCA、MARCOS 不同。它并不会先转成“接近度得分”,而是直接转化为“偏离目标值的绝对距离”:
$$ d_{ij}=|x_{ij}-s_j^\ast| \tag{4} $$
其中 \(s_j^\ast\) 为第 \(j\) 个适度指标的标准值。完成式(4)之后,程序会立即把该指标的有效类型改写为负向指标,即
$$ x_{ij}\longrightarrow d_{ij}, \qquad \text{并令 } C_j \in \text{成本指标集合} \tag{5} $$
这意味着:在当前项目中,适度指标并不是“越接近 1 越好”的接近度型变量,而是“越偏离目标值越差”的距离型变量。
3.3 适度指标标准值约束
当前 UI 和核心实现都把适度指标标准值等于 0 视为“未设置”。因此,在正常界面流程中必须满足
$$ s_j^\ast\ne 0 \tag{6} $$
否则程序会直接报出“适度指标未设置标准值”的错误。
3.4 本模块不做正值平移
这一点与 MAIRCA、MARCOS 不同。当前 MOORA 核心实现中 没有 对指标列执行正值平移步骤,也没有单独的 ensure_positive() 流程。也就是说,标准化直接作用于式(4)处理后的原始数值矩阵:
$$ X^\ast=(x_{ij}^\ast)_{m\times n} \tag{7} $$
其中 \(x_{ij}^\ast\) 表示:
- 对正向指标和负向指标,\(x_{ij}^\ast=x_{ij}\);
- 对适度指标,\(x_{ij}^\ast=d_{ij}\)。
4. 标准化矩阵与权重确定
4.1 向量标准化
当用户选择 vector 时,项目采用 MOORA 最常见的向量标准化方式:
$$ n_{ij}=\frac{x_{ij}^\ast}{\sqrt{\sum_{k=1}^{m}\left(x_{kj}^\ast\right)^2}} \tag{8} $$
若某列分母为 0,则该列直接记为 0。
4.2 Max-Min 标准化
当用户选择 min_max 时,程序对所有指标统一采用
$$ n_{ij}=\frac{x_{ij}^\ast-\min_i x_{ij}^\ast}{\max_i x_{ij}^\ast-\min_i x_{ij}^\ast} \tag{9} $$
需要特别注意的是:当前实现 不会 在式(9)中对负向指标额外做反向处理。也就是说,负向指标不会改写成
\(\frac{\max-x}{\max-\min}\)
这与不少通用教材写法不同。
4.3 Z-score 后再归一化
当用户选择 z_score 时,程序先计算
$$ z_{ij}=\frac{x_{ij}^\ast-\mu_j}{\sigma_j} \tag{10} $$
其中 \(\mu_j\) 为第 \(j\) 列均值,\(\sigma_j\) 为总体标准差,代码中使用 std(ddof=0)。随后再把 \(z_{ij}\) 映射到 \([0,1]\) 区间:
$$ n_{ij}=\frac{z_{ij}-\min_i z_{ij}}{\max_i z_{ij}-\min_i z_{ij}} \tag{11} $$
若 \(\sigma_j=0\) 或上下界重合,则该列标准化结果记为 0。
4.4 项目中的方向处理不在标准化阶段完成
这是当前模块最重要的实现细节之一。无论使用式(8)、式(9)还是式(11),代码都不会在标准化阶段把负向指标翻转,而是把方向处理延迟到最终综合得分的“效益项减成本项”步骤中完成。因此,项目实际得到的标准化矩阵统一记为
$$ N=(n_{ij})_{m\times n} \tag{12} $$
这里 \(N\) 同时服务于:
- MOORA 最终评分;
- 熵权法权重计算。
也就是说,本模块并不存在“评分矩阵”和“熵权矩阵”两套不同标准化口径。
4.5 熵权法
当用户选择 entropy 时,程序直接在标准化矩阵 \(N\) 上计算熵权。设第 \(j\) 个指标的列和为 \(\sum_i n_{ij}\),则其比重为
$$ p_{ij}=\frac{n_{ij}}{\sum_{k=1}^{m}n_{kj}} \tag{13} $$
熵值定义为
$$ e_j=-\frac{1}{\ln m}\sum_{i=1}^{m}p_{ij}\ln p_{ij} \tag{14} $$
差异系数定义为
$$ g_j=1-e_j \tag{15} $$
最终权重为
$$ w_j=\frac{g_j}{\sum_{k=1}^{n}g_k} \tag{16} $$
这部分对应 MOORACalculator._entropy_weights() 的实现。
4.6 自定义权重
当用户选择 custom 时,程序读取用户输入的原始权重 \(\hat{w}_j\),先按所选指标重排并补零,再统一归一化:
$$ w_j=\frac{\hat{w}_j}{\sum_{k=1}^{n}\hat{w}_k} \tag{17} $$
如果没有提供权重对象,则程序直接报错;但如果提供了权重对象且其重排后总和不大于 0,则当前实现会回退为等权:
$$ w_j=\frac{1}{n} \tag{18} $$
因此,当前 MOORA 模块对“自定义权重缺失”和“自定义权重无效”两类情形的处理并不完全相同:
- 完全未提供:报错;
- 已提供但总和无效:回退为等权。
5. 加权矩阵、综合得分与排序
5.1 加权标准化矩阵
得到标准化矩阵 \(N\) 与权重向量 \(w\) 后,程序构造加权标准化矩阵:
$$ v_{ij}=w_j n_{ij} \tag{19} $$
记
$$ V=(v_{ij})_{m\times n} \tag{20} $$
Excel 中的 加权矩阵 工作表,对应的就是式(20)。
5.2 效益指标集合与成本指标集合
项目在适度指标处理完成后,按有效指标类型 eff_types 自动划分:
$$ B=\{j\mid C_j \text{ 为正向指标}\} \tag{21} $$
$$ C=\{j\mid C_j \text{ 为负向指标}\} \tag{22} $$
其中,原始适度指标在式(4)—式(5)之后已经进入集合 \(C\)。
5.3 效益得分、成本得分与综合得分
对方案 \(A_i\),项目先计算效益得分
$$ Y_i^{+}=\sum_{j\in B}v_{ij} \tag{23} $$
再计算成本得分
$$ Y_i^{-}=\sum_{j\in C}v_{ij} \tag{24} $$
最终 MOORA 综合得分定义为
$$ S_i=Y_i^{+}-Y_i^{-} \tag{25} $$
这对应结果表中的三列:
效益得分成本得分MOORA综合得分S
需要注意的是,式(25)中的 \(S_i\) 完全可能为负值。只要成本项大于效益项,程序输出负分也是正常现象。
5.4 排名规则
项目不是使用 rank() 生成并列名次,而是先按 MOORA综合得分S 降序排序,再直接赋予连续名次 \(1,2,\ldots,m\)。因此可写为:若排序后得到
$$ S_{(1)}\ge S_{(2)}\ge \cdots \ge S_{(m)} \tag{26} $$
则程序输出
$$ \operatorname{Rank}(A_{(k)})=k, \quad k=1,2,\ldots,m \tag{27} $$
这意味着:即便两个方案得分完全相同,当前结果表里也会给出连续名次,而不是“并列第 1、下一个第 3”这种并列排名口径。
6. 输出结构、分层计算与复现脚本
6.1 统一结果结构
MOORACalculator.calculate_moora() 返回统一结果字典,主要包括:
raw_data:原始数据中首列与所选指标列;processed_data:实际参与计算的矩阵与有效指标类型;step_results:标准化矩阵、权重、加权矩阵、效益/成本/综合得分等中间结果;final_results:最终得分与排名;charts:导出图表路径;parameters:算法参数、指标类型、标准值、收益/成本列集合等。
其中 step_results 内部包含 有效指标类型,但当前 Excel 导出函数并不会把这个对象单独写成工作表。
6.2 默认导出路径与图表
若未显式指定输出文件,save_results() 会在 results/ 目录下生成:
MOORA-比率分析法分析结果_<时间戳>/moora_results_<时间戳>.xlsx
同时生成:
charts/moora_scores.pngcharts/weights.pngrepro_inputs/input_snapshot.csvrepro_moora_<时间戳>.py
其中图表含义分别为:
moora_scores.png:方案MOORA综合得分S柱状图;weights.png:指标权重柱状图。
6.3 Excel 工作表
结合 save_results() 的实际实现,当前模块会导出以下工作表:
参数原始数据标准化矩阵指标权重加权矩阵得分与排名得分分解熵权法图表清单
其中:
得分与排名记录最终排序;得分分解记录效益得分、成本得分与综合得分;熵权法仅在选择熵权法时出现;图表清单记录所有图表的用途与路径。
6.4 分层计算
结果页 ui/results_widget.py 在整体计算完成后,会询问用户是否继续做部分指标计算。若用户选择继续,程序会调用 calculate_partial_moora() 重新用指标子集执行完整 MOORA 流程,并通过 append_layer_results() 把结果追加写入主结果文件。当前默认追加页签名为:
子集得分排名
因此,本模块不仅支持整体计算,也支持“部分指标子集重算”。
6.5 复现脚本
程序会在结果目录中生成 repro_moora_<时间戳>.py。该脚本会固化以下参数:
- 输入快照路径
repro_inputs/input_snapshot.csv; - 所选指标;
- 指标类型;
- 适度指标标准值;
- 标准化方式;
- 权重方式;
- 自定义权重。
重新执行该脚本后,会再次调用 calculate_moora() 和 save_results(),并把新结果写入 repro_outputs/ 子目录。
7. 与项目实现一致的若干注意事项
7.1 适度指标不是转接近度,而是转偏离度
这是当前模块与 MAIRCA、MARCOS 最明显的差异。项目对适度指标使用的是式(4)的绝对偏差,而不是“1 减偏差比例”的接近度变换。因此,论文若直接引用软件口径,不能把该步骤写成“适度指标转换为正向指标接近度”;更准确的说法应是“转换为对目标值的偏离度,并作为负向指标处理”。
7.2 负向指标方向不在标准化阶段翻转
无论使用 vector、min_max 还是 z_score,当前代码都不会在标准化阶段把负向指标变成“越大越好”,而是统一在最终式(25)中通过 效益项 - 成本项 来处理方向。若论文把 min_max 写成负向指标使用 \((\max-x)/(\max-\min)\),就会与项目实际实现不一致。
7.3 同一个标准化矩阵同时用于评分和熵权
当前 MOORA 模块没有为熵权法额外构造第二套标准化矩阵。也就是说,step_results["标准化矩阵"] 既是 MOORA 评分用矩阵,也是熵权法的输入矩阵。这一点和 MAIRCA、MARCOS 的实现差别很大,必须单独说明。
7.4 本模块不做正值平移
这意味着它不像 MAIRCA、MARCOS 那样为了避免除零而先把数据整体平移到正区间。对论文写作而言,这一点既是简化,也是实现差异,应明确说明。
7.5 排名为连续名次,不是并列名次
当前 final_results 的 排名 列是排序后直接生成 1,2,3,...。因此,如果研究场景中非常关心并列方案的严格名次定义,需要注意软件当前输出并不是并列排名口径。
8. 论文写作模板
若本文采用本项目中的 MOORA 模块进行综合评价,可按如下方式描述:
首先构建方案-指标原始决策矩阵,并依据指标属性将指标划分为正向指标、负向指标和适度指标。对于适度指标,依据其与目标标准值之间的绝对偏离程度构造距离变量,并将其作为负向指标处理。随后对全部指标数据进行标准化处理,并采用熵权法或自定义权重方法确定各指标权重。在获得加权标准化矩阵后,将正向指标的加权值求和得到效益得分,将负向指标的加权值求和得到成本得分,最终以效益得分与成本得分之差作为 MOORA 综合得分,并据此完成方案排序。
若研究采用的是软件默认推荐口径,还可补充说明:
在标准化方式上,优先采用向量标准化,以保持各指标相对比例关系;在方向处理上,不在标准化阶段对负向指标进行反向变换,而是在综合得分计算阶段通过效益项减成本项的方式完成统一处理。
9. 与代码实现的对应关系
表 1 MOORA 关键公式与项目实现对应关系
| 内容 | 数学表达 | 项目实现 |
|---|---|---|
| 原始输入结构与数据约束 | 式(1)—式(3) | ui/upload_widget.py、utils/data_validator.py、core/moora_calculator.py::_prepare_matrix |
| 适度指标偏离度处理 | 式(4)—式(7) | ui/indicators_widget.py、core/moora_calculator.py::_prepare_matrix |
| 标准化矩阵 | 式(8)—式(12) | ui/methods_widget.py、core/moora_calculator.py::_normalize |
| 熵权法与自定义权重 | 式(13)—式(18) | core/moora_calculator.py::_entropy_weights、set_weights、calculate_moora |
| 加权矩阵与综合得分 | 式(19)—式(25) | core/moora_calculator.py::calculate_moora |
| 排名规则 | 式(26)—式(27) | core/moora_calculator.py::calculate_moora |
| Excel、分层计算与复现脚本导出 | 第 6 节 | core/moora_calculator.py::save_results、append_layer_results、ui/results_widget.py |
总体来看,本项目中的 MOORA 属于“适度指标偏离度转换 + 单一标准化矩阵 + 熵权/自定义赋权 + 效益减成本打分 + 连续名次排序”的工程化实现。论文写作时,建议把式(19)—式(27)作为方法主体,再结合式(4)—式(18)说明本软件在适度指标处理、标准化和权重生成方面的具体实现口径。
10. 论文模板补充
10.1 方法描述模板
“本文采用 MOORA 比率系统方法对候选方案进行综合评价。首先对原始决策矩阵执行指标类型处理、标准化与权重确定;随后在加权标准化矩阵上分别汇总效益型指标贡献与成本型指标贡献,并以二者之差作为 MOORA 综合得分,最终据此完成排序。”
10.2 结果解释模板
结果部分可写为:结果表明,效益项贡献越大且成本项贡献越小的方案,其综合得分越高。若连续名次排序下方案得分差异明显,则说明方案之间区分度较强;若得分差异较小,则需要结合具体指标贡献进一步解释相邻方案间的排序差异。
10.3 表格标题模板
- 表 1 MOORA 指标类型与权重设置表
- 表 2 MOORA 加权标准化矩阵结果表
- 表 3 MOORA 效益项、成本项与综合得分结果表
- 表 4 MOORA 综合排序结果表
10.4 图表题注模板
- 图 1 MOORA 指标权重分布图。
- 图 2 MOORA 综合得分排序图。
- 图 3 MOORA 效益项与成本项贡献对比图。
10.5 表格示例
表 1 MOORA 综合评价结果表示例
| 方案 | 效益项得分 | 成本项得分 | 综合得分 | 排名 |
|---|---|---|---|---|
| \(A_1\) | ||||
| \(A_2\) |
表注:综合得分由效益项减成本项得到,数值越大表示方案越优;当前软件输出为连续名次排序。
11. 单篇终审补充
11.1 图题与表题对齐建议
参数表可写为:表X MOORA 参数设置表。原始数据表可写为:表X MOORA 原始数据表。标准化矩阵表可写为:表X MOORA 标准化矩阵表。指标权重表可写为:表X MOORA 指标权重表。加权矩阵表可写为:表X MOORA 加权矩阵表。得分与排名表可写为:表X MOORA 综合得分与排名表。得分分解表可写为:表X MOORA 效益项与成本项分解表。熵权法表可写为:表X MOORA 熵权法计算表。图表清单表可写为:表X MOORA 图表索引与路径表。weights.png建议写为:图X MOORA 指标权重图。moora_scores.png建议写为:图X MOORA 综合得分图。
11.2 终审说明
- 当前代表性结果目录可采用
results/manual_check_moora_20260321_after_fix/MOORA-比率分析法分析结果_20260321_044403。其中主工作簿为moora_results_20260321_044403.xlsx。 - 当前真实工作表为
参数/原始数据/标准化矩阵/指标权重/加权矩阵/得分与排名/得分分解/熵权法/图表清单。论文表题应按这套中文 sheet 名准确落地。 - 当前稳定实体图文件为
charts/weights.png与charts/moora_scores.png。正文若讨论“效益项减成本项”的机制,应同时引用得分分解工作表,而不是只展示最终排序图。 - 真实 repro 脚本为
repro_moora_20260321_044403.py,并通过INPUT_FILE = 'repro_inputs/input_snapshot.csv'读取输入快照,再输出到repro_outputs/。附录中的复现实验说明应保持这一repro_inputs + repro_outputs目录结构口径。 - 当前结果目录同样存在多层
repro_outputs/递归复现结果。论文正文如果只陈述主实验,应固定引用首层结果,不要把后续复现层的图表和结果簿混入主文。
11.3 全量强化补充
- 本轮按真实磁盘再次核对,算法目录为
具体的算法3/多指标评价/MOORA-比率分析法,代表性结果目录为具体的算法3/多指标评价/MOORA-比率分析法/results/manual_check_moora_20260321_after_fix/MOORA-比率分析法分析结果_20260321_044403。 - 该目录主工作簿为
moora_results_20260321_044403.xlsx,真实工作表为参数、原始数据、标准化矩阵、指标权重、加权矩阵、得分与排名、得分分解、熵权法、图表清单。 - 当前主图目录为
charts/,实体图为weights.png与moora_scores.png。因此正文若解释 MOORA 结果,除排名表外还应配合得分分解工作表说明“效益项减成本项”的结构。 - 当前 repro 脚本为
repro_moora_20260321_044403.py,并通过INPUT_FILE = 'repro_inputs/input_snapshot.csv'读取输入快照;该文件在repro_inputs/中实际存在。脚本随后把结果输出到repro_outputs/。 repro_outputs/下已经实际生成MOORA-比率分析法分析结果_20260321_044405/,并继续向更深层递归。论文与交付说明仍应固定引用首层目录20260321_044403,不要把复现层工作簿与主结果混写。- 旧的
20251229/20251231目录虽然也可运行,但缺少当前这套更完整的“repro_inputs + repro_outputs”结构;后续应统一以manual_check_moora_20260321_after_fix这一修复后目录为准。
12. 软件实现核查补充(2026-07)
- 当前实现的主结果目录应写作
具体的算法3/多指标评价/MOORA-比率分析法/results/manual_check_moora_20260321_after_fix/MOORA-比率分析法分析结果_20260321_044403。 - 正文应围绕
参数、原始数据、标准化矩阵、指标权重、加权矩阵、得分与排名、得分分解、熵权法、图表清单来写。 - 图证应对应
weights.png与moora_scores.png。 repro_moora_20260321_044403.py + repro_inputs/input_snapshot.csv是目录内标准复现口径,repro_outputs/里的后续递归结果只应作为复现链说明。