COPRAS-复杂比例评估法
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_plus 与 S_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_plus、S_minus、Q、U(%) 与 rank 六列,对应式(19)—式(28)的实际输出。
5. 输出结构与结果文件
5.1 结果结构
当前 analyze_copras() 会返回统一结果字典,主要包括:
raw_data:原始数据表、对象名称列名、选中指标列表;processed_data:normalized、weighted_normalized、weights、positive_shift;step_results:S_plus、S_minus、Q;final_results:result_table与warnings;parameters:指标类型、权重方法、自定义权重;charts:图表路径字典。
与前面部分算法不同,COPRAS 这套导出工作表名称采用英文命名,而不是中文命名。
5.2 Excel 与图表导出
结果页会在每次计算完成后自动创建结果目录:
results/COPRAS-复杂比例评估法分析结果_<时间戳>/
并在目录下自动保存:
COPRAS_results_<时间戳>.xlsxcharts_<时间戳>/weights_<时间戳>.pngcharts_<时间戳>/utility_<时间戳>.png
Excel 文件中默认包含以下工作表:
ParametersRawDataWeightsNormalizedWeightedNormResultsWarnings(仅在存在告警时出现)Charts(仅在图表成功生成时出现)
其中:
Weights对应权重向量;Normalized对应式(15);WeightedNorm对应式(18);Results对应式(19)—式(28)的最终汇总结果;Warnings记录非正值平移、无效益型/无成本型、除零等实现层提示。
5.3 复现脚本
结果页还支持导出复现代码。导出后会在结果目录中额外生成:
copras_data_<时间戳>.csvrepro_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.py、core/copras_calculator.py::analyze_copras |
| 效益型/成本型指标集合 | 式(4)—式(5) | ui/indicators_widget.py、ui/main_window.py |
| 非正值整体平移 | 式(6)—式(8) | core/copras_calculator.py::_ensure_positive |
| 熵权法 | 式(9)—式(12) | core/copras_calculator.py::entropy_weights |
| 自定义权重归一化 | 式(13) | ui/weight_editor_widget.py、core/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.py、ui/results_widget.py |
总体来看,本项目中的 COPRAS 属于“保留经典列和归一 + 效益/成本分解主线,同时对非正值、权重录入和结果导出做了工程化增强”的实现版本。对论文写作而言,建议把式(14)—式(28)作为方法主体,再补充说明式(7)和式(13)所代表的项目实现细节。
9. 论文模板补充
9.1 方法描述模板
“本文采用 COPRAS 方法对候选方案进行综合评价。首先依据指标属性将指标划分为效益型和成本型,并在必要时对非正值指标列做正值平移;随后实施列和归一化,并结合熵权法或自定义权重构造加权标准化矩阵。进一步分别汇总效益项贡献与成本项贡献,计算各方案的相对重要度和效用值,最终据此完成排序。”
9.2 结果解释模板
结果部分可写为:结果表明,效益项贡献越高、成本项贡献越低的方案,其相对重要度与效用值通常越大。若某方案在效益型指标上优势明显,但在成本型指标上劣势较小,则其综合排名往往保持靠前;效用值越接近最优方案,说明其整体表现越接近理想水平。
9.3 表格标题模板
- 表 1 COPRAS 指标类型与权重设置表
- 表 2 COPRAS 效益项与成本项分解结果表
- 表 3 COPRAS 相对重要度与效用值结果表
- 表 4 COPRAS 综合排序结果表
9.4 图表题注模板
- 图 1 COPRAS 指标权重分布图。
- 图 2 COPRAS 效用值排序图。
- 图 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.png与utility_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.xlsx、COPRAS_results_20260329_021231.xlsx、COPRAS_results_20260329_132240.xlsx,并分别配套charts_20260329_021230/、charts_20260329_021231/、charts_20260329_132240/。因此正文若引用这一目录,必须明确“同一结果池内包含多轮运行产物”,不能误写成一次单轮执行的完整集合。 - 3 份工作簿的实际工作表一致,均为
Parameters、RawData、Weights、Normalized、WeightedNorm、Results、Warnings、Charts。这说明当前实现已把警告与图表索引纳入标准导出结构。 - 以主运行批次
20260329_021230为例,实际图文件只有两张,位于charts_20260329_021230/:weights_20260329_021230.png与utility_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为准。 - 正文应围绕
Parameters、RawData、Weights、Normalized、WeightedNorm、Results、Warnings、Charts来写。 - 图证应对应
charts_20260329_021230/weights_20260329_021230.png、charts_20260329_021230/utility_20260329_021230.png;不要把别的时间戳图混进这一次主结果。 repro_copras_20260329_021230.py采用脚本同目录旁路 CSV 的口径,DATA_FILE = Path(__file__).with_name('copras_data_20260329_021230.csv'),正文中应把这一点写清。