正在加载中...

展开本页目录
算法教程COPRAS-复杂比例评估法

COPRAS-复杂比例评估法

No.079 · 在线教程

COPRAS(Complex Proportional Assessment,复杂比例评估法)是一种典型的多指标综合评价方法。其基本思想是:先对各指标进行列和归一化,再结合指标权重得到加权标准化矩阵;随后分别汇总效益型指标贡献与成本型指标贡献,构造方案的相对重要度与效用值,并据…

COPRAS-复杂比例评估法

1. 方法概述

COPRAS(Complex Proportional Assessment,复杂比例评估法)是一种典型的多指标综合评价方法。其基本思想是:先对各指标进行列和归一化,再结合指标权重得到加权标准化矩阵;随后分别汇总效益型指标贡献与成本型指标贡献,构造方案的相对重要度与效用值,并据此完成排序。

就本项目的具体实现而言,COPRAS 模块采用的是一条相对简洁、稳定的工程化主线:

  • 指标类型仅区分为效益型与成本型;
  • 权重来源仅支持熵权法与自定义权重两种模式;
  • 为满足 COPRAS 的列和归一要求,程序会先把所有非正值列整体平移到正区间;
  • 导出结果时会同时写出中间矩阵、最终结果表、图表和复现脚本。

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

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

其中 \(x_{ij}\) 表示对象 \(A_i\) 在指标 \(C_j\) 上的原始观测值。

设指标权重向量为

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

项目最终输出的排序结果,本质上就是基于式(1)与式(2)计算得到的 COPRAS 相对重要度和效用值。

2. 输入结构与指标类型

2.1 输入文件结构

当前上传页 ui/upload_widget.py 与校验文件 utils/data_validator.py 要求输入数据满足:

  • 第 1 列为评价对象名称;
  • 第 2 列及之后为指标列;
  • 指标列必须全部可转为数值;
  • 不允许对象名称重复;
  • 至少包含 1 个指标列。

因此,项目实际进入算法计算的数据结构可表示为

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

其中第一个字段为对象名称,其余字段为指标值。项目还提供了 导出模板加载示例 功能,模板中默认包含 评价对象指标1指标2指标3 四列,可直接作为论文附录里的数据组织示例。

2.2 指标类型

在指标设置页中,用户可以从全部指标中选择参与计算的子集,并为每个指标指定类型。当前项目只支持两类:

  • 效益型指标:值越大越好;
  • 成本型指标:值越小越好。

记效益型指标集合为

$$ B=\{C_j:\ C_j \text{ 为效益型}\} \tag{4} $$

记成本型指标集合为

$$ C=\{C_j:\ C_j \text{ 为成本型}\} \tag{5} $$

程序会要求至少选择一个指标,但并不强制必须同时存在效益型与成本型指标。若某次分析只包含效益型指标或只包含成本型指标,核心代码仍会继续计算,只是在结果中增加告警提示。

3. 数据预处理与权重确定

3.1 非正值整体平移

COPRAS 的列和归一化隐含要求各列总和为正,且分母不能为 0。为此,项目在正式计算前会先检查每个指标列是否存在非正值。若第 \(j\) 列最小值满足

$$ \min_i x_{ij}\le 0 \tag{6} $$

则程序会对整列做正值平移:

$$ \tilde{x}_{ij}=x_{ij}+\left(-\min_i x_{ij}\right)+\varepsilon \tag{7} $$

其中 \(\varepsilon>0\) 为极小常数,项目默认取 \(10^{-12}\)。若某列原本已经全部为正,则有

$$ \tilde{x}_{ij}=x_{ij} \tag{8} $$

式(7)—式(8)对应 core/copras_calculator.py::_ensure_positive() 的实际实现。程序还会把平移量 positive_shift 一并写入结果结构,供结果页与导出文件使用。

3.2 熵权法

若用户选择熵权法,则项目先基于平移后的正值矩阵 \(\tilde{X}=(\tilde{x}_{ij})\) 计算权重。首先定义比例矩阵

$$ p_{ij}=\frac{\tilde{x}_{ij}}{\sum_{k=1}^{m}\tilde{x}_{kj}} \tag{9} $$

然后按熵权法计算熵值

$$ e_j=-\frac{1}{\ln m}\sum_{i=1}^{m}p_{ij}\ln\big(p_{ij}+\varepsilon\big) \tag{10} $$

差异系数为

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

最终权重为

$$ w_j=\frac{d_j}{\sum_{k=1}^{n}d_k} \tag{12} $$

当前实现还有一个兜底规则:若方案数 \(m\le 1\),程序直接返回等权向量。

3.3 自定义权重

若用户选择自定义权重,则不会在方法页直接编辑,而是进入独立的权重编辑页 ui/weight_editor_widget.py。用户可以逐页录入权重、平均分配权重,或者在保存时让程序自动归一化。

设用户输入的原始权重向量为 \(\hat{w}\),则程序内部会统一执行

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

不过需要说明的是,界面上的权重输入框本身只允许输入非负数,因此式(13)中的绝对值主要是代码层的稳健性处理。

4. COPRAS 主体计算过程

4.1 列和归一化

在平移后的正值矩阵 \(\tilde{X}\) 上,项目采用列和归一化:

$$ r_{ij}=\frac{\tilde{x}_{ij}}{\sum_{k=1}^{m}\tilde{x}_{kj}} \tag{14} $$

由此得到归一化矩阵

$$ R=(r_{ij})_{m\times n} \tag{15} $$

若某一列满足

$$ \sum_{i=1}^{m}\tilde{x}_{ij}=0 \tag{16} $$

则程序会直接报错并终止,因为此时无法完成式(14)的归一化。

4.2 加权标准化矩阵

得到归一化矩阵后,程序进一步计算加权标准化矩阵:

$$ q_{ij}=w_j r_{ij} \tag{17} $$

$$ Q=(q_{ij})_{m\times n} \tag{18} $$

项目导出结果中的 WeightedNorm 工作表就是式(18)的具体数值形式。

4.3 效益型与成本型指标汇总

对每个评价对象 \(A_i\),程序分别计算效益型指标加权和与成本型指标加权和。效益型部分定义为

$$ S_i^{+}=\sum_{j\in B}q_{ij} \tag{19} $$

成本型部分定义为

$$ S_i^{-}=\sum_{j\in C}q_{ij} \tag{20} $$

在项目代码中,这两项分别保存为 S_plusS_minus

若没有效益型指标,则程序把

$$ S_i^{+}=0 \tag{21} $$

并增加告警。若没有成本型指标,则后续的相对重要度不再使用标准成本项修正,而直接按 \(Q_i=S_i^+\) 计算。

4.4 相对重要度

当成本型指标集合非空时,项目当前采用如下相对重要度公式:

$$ \mathcal{Q}_i=S_i^{+}+\frac{S_{\min}^{-}\sum_{k=1}^{m}S_k^{-}}{S_i^{-}} \tag{22} $$

其中

$$ S_{\min}^{-}=\min_{1\le i\le m}S_i^{-} \tag{23} $$

需要特别说明的是,式(22)是本项目代码 core/copras_calculator.py 的实际实现口径。经典文献中 COPRAS 的相对重要度写法有不同变体,而当前软件输出结果必须以式(22)为准。

若不存在成本型指标,则项目直接采用

$$ \mathcal{Q}_i=S_i^{+} \tag{24} $$

若某个方案满足

$$ S_i^{-}=0 \tag{25} $$

则式(22)会出现除零。此时程序会把该方案对应的 \(\mathcal{Q}_i\) 缺失值填为 0,并在结果中加入告警说明。

4.5 效用值与排序

在得到相对重要度后,程序按最大值归一化得到效用值:

$$ U_i=\frac{\mathcal{Q}_i}{\max_k \mathcal{Q}_k}\times 100\% \tag{26} $$

若满足

$$ \max_k \mathcal{Q}_k \le 0 \tag{27} $$

则程序将所有方案的效用值直接记为 0,并加入告警。

最后按效用值降序排序,得到方案排名:

$$ \operatorname{Rank}(A_i)=\operatorname{rank}_{\downarrow}(U_i) \tag{28} $$

项目导出的最终结果表包含对象名称、S_plusS_minusQU(%)rank 六列,对应式(19)—式(28)的实际输出。

5. 输出结构与结果文件

5.1 结果结构

当前 analyze_copras() 会返回统一结果字典,主要包括:

  • raw_data:原始数据表、对象名称列名、选中指标列表;
  • processed_datanormalizedweighted_normalizedweightspositive_shift
  • step_resultsS_plusS_minusQ
  • final_resultsresult_tablewarnings
  • parameters:指标类型、权重方法、自定义权重;
  • charts:图表路径字典。

与前面部分算法不同,COPRAS 这套导出工作表名称采用英文命名,而不是中文命名。

5.2 Excel 与图表导出

结果页会在每次计算完成后自动创建结果目录:

  • results/COPRAS-复杂比例评估法分析结果_<时间戳>/

并在目录下自动保存:

  • COPRAS_results_<时间戳>.xlsx
  • charts_<时间戳>/weights_<时间戳>.png
  • charts_<时间戳>/utility_<时间戳>.png

Excel 文件中默认包含以下工作表:

  • Parameters
  • RawData
  • Weights
  • Normalized
  • WeightedNorm
  • Results
  • Warnings(仅在存在告警时出现)
  • Charts(仅在图表成功生成时出现)

其中:

  • Weights 对应权重向量;
  • Normalized 对应式(15);
  • WeightedNorm 对应式(18);
  • Results 对应式(19)—式(28)的最终汇总结果;
  • Warnings 记录非正值平移、无效益型/无成本型、除零等实现层提示。

5.3 复现脚本

结果页还支持导出复现代码。导出后会在结果目录中额外生成:

  • copras_data_<时间戳>.csv
  • repro_copras_<时间戳>.py

该复现脚本会写入:

  • 原始数据 CSV 路径;
  • 对象名称列;
  • 选中指标列表;
  • 指标类型字典;
  • 权重方法;
  • 自定义权重字典。

随后脚本重新调用 analyze_copras()save_calculation_results() 完成一次完整复算。因此,对论文复现而言,该脚本可以直接作为项目实现口径的辅助说明材料。

6. 实现说明与注意事项

6.1 非正值不会直接报错,而会先平移

这是本项目 COPRAS 模块最重要的工程化处理之一。只要指标列能成功转为数值,即使存在 0 或负值,程序通常也不会直接拒绝,而是按式(7)先整体平移到正区间后再计算。因此,在论文中如果直接复述“原始数据做列和归一化”,容易漏掉这一实现细节。

6.2 无成本型指标时退化为 \(Q=S^+\)

界面允许用户把所有指标都设成效益型。在这种情况下,项目不会报错,而是直接采用式(24)计算相对重要度。这意味着当前模块既支持标准“效益+成本”混合情形,也支持纯效益型的退化场景。

6.3 当前项目采用的 \(Q_i\) 公式必须以代码为准

COPRAS 文献中的 \(\mathcal{Q}_i\) 存在不同写法,而本项目明确采用式(22)这一实现版本。如果论文结果是从本软件直接导出的,应优先写出式(22),而不是套用其他资料中的变体公式。

7. 论文写作模板

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

首先构建评价对象与指标组成的原始决策矩阵,并依据指标属性将各指标划分为效益型指标和成本型指标。考虑到原始数据中可能存在非正值,先对非正值指标列执行整体平移,使所有指标取值均处于正区间。随后采用列和归一化得到标准化矩阵,并结合熵权法或专家给定权重构造加权标准化矩阵。进一步分别汇总效益型指标贡献与成本型指标贡献,计算各方案的相对重要度与效用值,最终依据效用值大小完成方案排序。

若本文采用的是自定义权重,还可补充说明:

在权重设置环节,先由研究者给出各指标的主观权重,再统一归一化为和为 1 的权重向量,并据此进行 COPRAS 综合评价。

8. 公式与代码对应关系

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

内容 数学表达 项目实现
原始决策矩阵与权重向量 式(1)—式(3) ui/upload_widget.pycore/copras_calculator.py::analyze_copras
效益型/成本型指标集合 式(4)—式(5) ui/indicators_widget.pyui/main_window.py
非正值整体平移 式(6)—式(8) core/copras_calculator.py::_ensure_positive
熵权法 式(9)—式(12) core/copras_calculator.py::entropy_weights
自定义权重归一化 式(13) ui/weight_editor_widget.pycore/copras_calculator.py::_normalize_weights
列和归一化与加权矩阵 式(14)—式(18) core/copras_calculator.py::copras
\(S_i^+\)、\(S_i^-\) 与 \(\mathcal{Q}_i\) 式(19)—式(25) core/copras_calculator.py::copras
效用值与排序 式(26)—式(28) core/copras_calculator.py::copras
Excel、图表与复现脚本导出 第 5 节 utils/excel_handler.pyui/results_widget.py

总体来看,本项目中的 COPRAS 属于“保留经典列和归一 + 效益/成本分解主线,同时对非正值、权重录入和结果导出做了工程化增强”的实现版本。对论文写作而言,建议把式(14)—式(28)作为方法主体,再补充说明式(7)和式(13)所代表的项目实现细节。

9. 论文模板补充

9.1 方法描述模板

“本文采用 COPRAS 方法对候选方案进行综合评价。首先依据指标属性将指标划分为效益型和成本型,并在必要时对非正值指标列做正值平移;随后实施列和归一化,并结合熵权法或自定义权重构造加权标准化矩阵。进一步分别汇总效益项贡献与成本项贡献,计算各方案的相对重要度和效用值,最终据此完成排序。”

9.2 结果解释模板

结果部分可写为:结果表明,效益项贡献越高、成本项贡献越低的方案,其相对重要度与效用值通常越大。若某方案在效益型指标上优势明显,但在成本型指标上劣势较小,则其综合排名往往保持靠前;效用值越接近最优方案,说明其整体表现越接近理想水平。

9.3 表格标题模板

  1. 表 1 COPRAS 指标类型与权重设置表
  2. 表 2 COPRAS 效益项与成本项分解结果表
  3. 表 3 COPRAS 相对重要度与效用值结果表
  4. 表 4 COPRAS 综合排序结果表

9.4 图表题注模板

  1. 图 1 COPRAS 指标权重分布图。
  2. 图 2 COPRAS 效用值排序图。
  3. 图 3 COPRAS 效益项与成本项贡献对比图。

9.5 表格示例

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

方案 \(S_i^+\) \(S_i^-\) 效用值 排名
\(A_1\)
\(A_2\)

表注:\(S_i^+\) 与 \(S_i^-\) 分别表示效益项与成本项贡献,效用值越大表示方案越优。

10. 单篇终审补充

10.1 图题与表题对齐建议

  • Parameters 表可写为:表X COPRAS 参数设置表。
  • RawData 表可写为:表X COPRAS 原始数据表。
  • Weights 表可写为:表X COPRAS 指标权重表。
  • Normalized 表可写为:表X COPRAS 归一化矩阵表。
  • WeightedNorm 表可写为:表X COPRAS 加权归一化矩阵表。
  • Results 表可写为:表X COPRAS 综合结果表。
  • Warnings 表可写为:表X COPRAS 计算警告与修正信息表。
  • Charts 表可写为:表X COPRAS 图表索引表。
  • weights_*.png 建议写为:图X COPRAS 指标权重图。
  • utility_*.png 建议写为:图X COPRAS 效用值图。

10.2 终审说明

  • 当前代表性结果目录可采用 results/COPRAS-复杂比例评估法分析结果_20260329_021230。其中主工作簿为 COPRAS_results_20260329_021230.xlsx;同目录下还保留了复现后再次生成的结果簿。
  • 当前真实工作表为 Parameters/RawData/Weights/Normalized/WeightedNorm/Results/Warnings/Charts。部分较早目录没有 Warnings,正文若要讨论异常值平移、权重修正或兼容性提醒,应优先引用较新目录。
  • 当前稳定实体图文件位于 charts_时间戳/ 目录下,典型文件名为 weights_20260329_021230.pngutility_20260329_021230.png。图题应与时间戳无关,只需在附录文件清单中保留完整文件名。
  • 真实 repro 脚本为 repro_copras_20260329_021230.py,并通过 DATA_FILE = Path(__file__).with_name('copras_data_20260329_021230.csv') 读取同目录 CSV 数据副本。它不是统一的 repro_inputs/... 结构,而是“脚本同目录旁路 CSV”口径,这一点应在附录中写清。
  • 当前 repro 脚本支持通过 COPRAS_ROOT 环境变量定位算法根目录;若结果包脱离原工程结构运行,附录可补一句说明需要保证 core/utils/ 可被定位。

10.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/多指标评价/COPRAS-复杂比例评估法,代表性结果目录为 具体的算法3/多指标评价/COPRAS-复杂比例评估法/results/COPRAS-复杂比例评估法分析结果_20260329_021230
  • 该目录不是单次单文件输出,而是累积保留了 3 份工作簿:COPRAS_results_20260329_021230.xlsxCOPRAS_results_20260329_021231.xlsxCOPRAS_results_20260329_132240.xlsx,并分别配套 charts_20260329_021230/charts_20260329_021231/charts_20260329_132240/。因此正文若引用这一目录,必须明确“同一结果池内包含多轮运行产物”,不能误写成一次单轮执行的完整集合。
  • 3 份工作簿的实际工作表一致,均为 ParametersRawDataWeightsNormalizedWeightedNormResultsWarningsCharts。这说明当前实现已把警告与图表索引纳入标准导出结构。
  • 以主运行批次 20260329_021230 为例,实际图文件只有两张,位于 charts_20260329_021230/weights_20260329_021230.pngutility_20260329_021230.png。论文图题应分别对应“权重图”和“效用值图”,不要凭经验扩写为更多不存在的分析图。
  • 当前 repro 口径不是 repro_inputs/...,而是脚本与 CSV 同目录并列:repro_copras_20260329_021230.py 配合 copras_data_20260329_021230.csv 使用。脚本中写明 DATA_FILE = Path(__file__).with_name('copras_data_20260329_021230.csv'),并支持 COPRAS_ROOT 环境变量回退定位算法根目录。
  • 这篇在论文和交付文档中应如实写成“主结果目录内保存多轮结果与旁路 CSV 复现脚本”,而不是强行套用统一的 repro_inputs 模板。

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

  • 当前实现的主结果目录应写作 具体的算法3/多指标评价/COPRAS-复杂比例评估法/results/COPRAS-复杂比例评估法分析结果_20260329_021230,主工作簿以 COPRAS_results_20260329_021230.xlsx 为准。
  • 正文应围绕 ParametersRawDataWeightsNormalizedWeightedNormResultsWarningsCharts 来写。
  • 图证应对应 charts_20260329_021230/weights_20260329_021230.pngcharts_20260329_021230/utility_20260329_021230.png;不要把别的时间戳图混进这一次主结果。
  • repro_copras_20260329_021230.py 采用脚本同目录旁路 CSV 的口径,DATA_FILE = Path(__file__).with_name('copras_data_20260329_021230.csv'),正文中应把这一点写清。