G1-序关系法
G1-序关系法是一种典型的主观赋权方法。与 AHP 需要构造完整两两比较矩阵不同,G1 只要求决策者先给出指标重要性排序,再给出相邻指标权重之比,即可递推出完整权重向量。
G1-序关系法
1. 方法概述
G1-序关系法是一种典型的主观赋权方法。与 AHP 需要构造完整两两比较矩阵不同,G1 只要求决策者先给出指标重要性排序,再给出相邻指标权重之比,即可递推出完整权重向量。
就本项目的具体实现而言,当前模块采用的是一条非常清晰的工程化计算链:
- 先对方案-指标数据做正向/负向/适度指标预处理;
- 再按
min-max或z-score口径进行标准化; - 根据 G1 指标排序与相邻比值 \(r_i\) 递推权重;
- 最后采用标准化矩阵与 G1 权重做加权求和,得到综合得分与排名。
因此,本项目中的 G1 模块并不是“只输出权重”的纯赋权工具,而是一个“G1 主观权重 + 方案综合评分”的一体化评价模块。
设共有 \(m\) 个方案、\(n\) 个指标,原始决策矩阵记为
$$ X=(x_{ij})_{m\times n}, \quad i=1,2,\ldots,m, \quad j=1,2,\ldots,n \tag{1} $$
设最终 G1 权重向量为
$$ 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)基础上,通过 G1 权重递推和加权求和得到的结果。
2. 输入结构与项目流程
2.1 输入数据结构
当前上传页 ui/upload_widget.py 支持 .xlsx、.xls 与 .csv 文件。结合 utils/data_validator.py,界面层要求:
- 第 1 列为对象名称;
- 第 2 列及之后为指标列;
- 指标列必须全部可转为数值;
- 不允许空值;
- 对象名称不允许重复;
- 上传页默认不允许常数列。
因此,进入 core/g1_calculator.py 的数据结构可以表示为
$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$
其中第一个字段为对象名称,其余字段为指标值。若研究者绕过上传页直接调用核心类,则数值与缺失检查仍会在 _ensure_numeric() 中继续执行。
2.2 正向流程与逆向流程
主窗口 ui/main_window.py 在指标设置完成后,会进入一个流程选择页 FlowSelectWidget。当前项目支持两条路径:
- 正向流程:手动设置指标顺序与相邻比值;
- 逆向流程:从专家评分表自动倒推指标顺序与相邻比值。
需要特别说明的是:G1 的核心计算在正向和逆向流程中完全相同。逆向流程只负责生成 g1_order 与 g1_ratios,生成完成后仍然调用同一个 G1Calculator.calculate_g1() 进行权重递推与方案评分。
3. 指标类型、预处理与标准化
3.1 指标类型
当前项目支持三类指标:
- 正向指标:值越大越优;
- 负向指标:值越小越优;
- 适度指标:值越接近给定标准值越优。
3.2 适度指标处理
对适度指标,设第 \(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=0\),说明该列所有值都与目标值完全一致,则程序直接记为
$$ y_{ij}=1 \tag{5} $$
否则采用
$$ y_{ij}=1-\frac{|x_{ij}-s_j^\ast|}{M_j} \tag{6} $$
这对应 G1Calculator._process_moderate() 的实际实现。与其他部分算法不同,本模块对适度指标处理后,会直接把结果当成最终标准化值,不再继续做 min-max 或 z-score 变换。
3.3 Max-Min 标准化
对正向指标,当用户选择 min-max 时,项目采用
$$ n_{ij}=\frac{x_{ij}-\min_i x_{ij}}{\max_i x_{ij}-\min_i x_{ij}} \tag{7} $$
对负向指标,则采用
$$ n_{ij}=\frac{\max_i x_{ij}-x_{ij}}{\max_i x_{ij}-\min_i x_{ij}} \tag{8} $$
若某列满足 \(\max_i x_{ij}=\min_i x_{ij}\),则程序直接把该列标准化结果记为 0。
3.4 Z-score 后再归一化
当用户选择 z-score 时,对正向指标先做
$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{9} $$
对负向指标,则先取反方向
$$ z_{ij}=-\frac{x_{ij}-\mu_j}{\sigma_j} \tag{10} $$
其中 \(\mu_j\) 和 \(\sigma_j\) 分别表示第 \(j\) 列均值与总体标准差,代码中采用 std(ddof=0)。随后再映射到 \([0,1]\) 区间:
$$ n_{ij}=\frac{z_{ij}-\min_i z_{ij}}{\max_i z_{ij}-\min_i z_{ij}} \tag{11} $$
若 \(\sigma_j=0\) 或 \(\max_i z_{ij}=\min_i z_{ij}\),则该列同样直接记为 0。
3.5 项目中的最终标准化矩阵
综合上述规则,本项目实际用于后续 G1 加权求和的标准化矩阵为
$$ N=(n_{ij})_{m\times n} \tag{12} $$
其中:
- 正向指标和负向指标按式(7)—式(11)处理;
- 适度指标直接采用式(5)—式(6)的结果;
- 因此,当用户选择
z-score时,适度指标不会再参与 z-score 变换。
这正是 G1Calculator._normalize() 中最需要注意的实现细节之一。
4. G1 权重递推
4.1 指标排序
设指标按重要性从高到低排序后记为
$$ C_{(1)} \succ C_{(2)} \succ \cdots \succ C_{(n)} \tag{13} $$
这里 \(C_{(1)}\) 表示最重要指标,\(C_{(n)}\) 表示最不重要指标。项目中的 g1_order 就是式(13)的具体列表。
4.2 相邻重要性比值
G1 法只要求给出相邻指标的权重之比:
$$ r_i=\frac{w_i}{w_{i+1}}, \quad i=1,2,\ldots,n-1 \tag{14} $$
其中 \(w_i\) 表示排序后第 \(i\) 个指标的权重。当前代码允许任意正数比值,但界面提示中明确建议一般取
$$ r_i\ge 1 \tag{15} $$
因为排序本身已经约定前者比后者更重要。
4.3 末位权重
项目首先根据全部相邻比值计算最末位指标权重:
$$ w_n=\frac{1}{1+\sum_{i=1}^{n-1}\prod_{k=i}^{n-1}r_k} \tag{16} $$
这与 G1Calculator._compute_g1_weights() 中 w_n 的实现完全一致。
4.4 递推公式
随后按从后往前的方式递推:
$$ w_i=r_i\,w_{i+1}, \quad i=n-1,n-2,\ldots,1 \tag{17} $$
若仅有 1 个指标,则项目直接返回
$$ w_1=1 \tag{18} $$
得到排序权重后,程序会再按实际数据列顺序 selected_indicators 重新对齐,以确保后续加权求和时权重与指标列一一对应。
5. 方案综合得分与排序
在得到标准化矩阵 \(N\) 与 G1 权重向量 \(w\) 后,项目采用简单加权和计算方案综合得分:
$$ S_i=\sum_{j=1}^{n}n_{ij}w_j \tag{19} $$
随后按 \(S_i\) 降序排列,得到方案排名:
$$ \operatorname{Rank}(A_i)=\operatorname{rank}_{\downarrow}^{\text{min}}(S_i) \tag{20} $$
这里的 min 表示并列时取最小名次。例如两个方案并列第 1,则下一个名次为第 3。
因此,本项目中的 G1 结果并不是只导出一组主观权重,而是“G1 权重 + 标准化加权和得分”的综合评价结果。
6. 逆向流程:由专家评分表倒推排序与比值
6.1 专家评分聚合
在逆向流程下,方法页 ui/methods_widget.py::reverse_import_scores() 要求导入一张专家评分表。设共有 \(K\) 位专家,第 \(k\) 位专家对第 \(j\) 个指标的评分为 \(s_{kj}\),专家权重为 \(\rho_k\),则程序先归一化专家权重:
$$ \rho_k\ge 0, \quad \sum_{k=1}^{K}\rho_k=1 \tag{21} $$
随后计算各指标加权平均评分:
$$ \bar{s}_j=\sum_{k=1}^{K}\rho_k\,s_{kj} \tag{22} $$
若评分表中不存在 专家权重、权重、weight 或 Weight 这些列,则程序默认采用等权专家。
6.2 倒推顺序与比值
项目首先按照 \(\bar{s}_j\) 从大到小排序,得到逆向流程下的指标顺序:
$$ C_{(1)},C_{(2)},\ldots,C_{(n)} \quad \text{满足} \quad \bar{s}_{(1)}\ge \bar{s}_{(2)}\ge \cdots \ge \bar{s}_{(n)} \tag{23} $$
随后,以相邻指标平均评分之比构造 G1 比值:
$$ r_i=\frac{\bar{s}_{(i)}}{\bar{s}_{(i+1)}}, \quad i=1,2,\ldots,n-1 \tag{24} $$
程序进一步把该比值裁剪到
$$ 1\le r_i\le 9 \tag{25} $$
从而得到逆向流程中的 g1_ratios。需要特别注意的是:
- G1 逆向流程不会像 FAHP 那样把比值再投影到离散 Saaty 标度;
- 它直接使用连续实数比值;
- 因此,逆向流程仅仅是在专家评分表基础上自动推得式(13)和式(14)中的参数。
7. 输出结构、图表与复现脚本
7.1 结果结构
G1Calculator.calculate_g1() 返回统一结果字典,主要包括:
raw_data:原始数据摘要、对象列名;processed_data:标准化矩阵摘要与normalized_matrix;step_results:g1_order、g1_ratios、权重、标准化矩阵与计算步骤;final_results:综合得分与排名;charts:图表路径;parameters:标准化方法、指标类型、标准值、G1 顺序与比值、对象列等参数。
7.2 默认输出路径与图表
结果页 ui/results_widget.py 会先创建目录:
- 正向流程:
results/G1-序关系法-<时间戳>-正向/ - 逆向流程:
results/G1-序关系法-<时间戳>-逆向/
随后 save_results() 会在目录中生成同名 Excel:
G1-序关系法-<时间戳>-正向.xlsxG1-序关系法-<时间戳>-逆向.xlsx
同时生成图表目录 charts/,默认包含:
score_bar.png:综合得分柱状图;weight_bar.png:G1 权重柱状图。
7.3 Excel 工作表
当前模块会同时导出业务页签与论文导向页签。
业务页签包括:
原始数据标准化矩阵G1权重G1比值综合得分
论文导向页签包括:
参数设置计算过程结果-权重结果-排序Charts(图表存在时)
其中:
参数设置记录标准化方法、指标类型、标准值、排序与比值等;计算过程会集中写出指标排序、相邻比值以及权重递推公式;结果-权重与结果-排序适合直接作为论文附录结果表使用。
7.4 复现脚本
结果页支持“导出复现代码”。导出后会在结果目录中生成:
repro_inputs/(若原始数据可复制)repro_g1_<时间戳>.py
该脚本会记录:
- 原始数据路径或复制后的输入文件路径;
- 所选指标;
- 指标类型与适度指标标准值;
g1_order与g1_ratios;- 标准化方法;
- 流程模式
source_mode。
重新运行该脚本后,会再次调用 calculate_g1() 和 save_results(),在同目录生成一份新的 G1 结果文件。
8. 与项目实现一致的若干注意事项
8.1 G1 是“序关系赋权 + 客观数据评分”
当前模块并不是只做主观赋权,而是把主观排序权重进一步用于客观方案数据的综合评分。因此,论文若直接使用软件结果,不能只写“采用 G1 法确定权重”,还应补充说明“基于标准化方案矩阵进行加权求和排序”。
8.2 适度指标在 G1 中会绕过所选标准化方式
这是本模块最容易被忽略的实现细节。正向指标和负向指标会按 min-max 或 z-score 路径处理,而适度指标一旦按式(4)—式(6)转换为 \([0,1]\) 变量,就直接作为最终标准化值写入矩阵,不再额外做 z-score。这意味着在同一次分析中,不同类型指标的标准化链路并不完全相同。
8.3 逆向流程只倒推顺序和 \(r_i\),不改变 G1 主体公式
与 FAHP 的逆向流程不同,G1 逆向流程不会生成新的判断矩阵,也不会做模糊数映射。它仅仅根据专家评分均值生成排序与相邻比值,然后仍然使用式(16)—式(18)进行权重递推。
8.4 UI 要求适度指标标准值不能为 0,但核心可自动回退
界面页 ui/indicators_widget.py 当前会把适度指标标准值等于 0 视为“未设置”;但核心 _normalize() 在缺失标准值时其实会默认回退到列均值。这意味着:
- 通过正常 UI 流程时,适度指标标准值必须是非 0;
- 直接调用核心类时,即使未显式提供标准值,程序也会用列均值继续计算。
这是 UI 约束与核心逻辑之间的一个实际差异。
9. 论文写作模板
若本文采用本项目中的 G1 模块进行综合评价,可按如下方式描述:
首先构建方案-指标原始决策矩阵,并依据指标属性将指标划分为正向指标、负向指标和适度指标。对于负向指标,通过方向翻转将其统一转换为效益型;对于适度指标,依据其与目标值的偏离程度构造接近度指标。随后对指标数据进行标准化处理,并根据 G1-序关系法给出的指标重要性排序与相邻指标权重比,递推出完整权重向量。最后将标准化指标矩阵与 G1 权重向量进行加权求和,得到各方案综合得分,并据此完成排序。
若本文采用的是逆向流程,还可进一步写为:
在 G1 参数设定阶段,先收集专家对各指标的重要性评分,并按照专家权重计算各指标的加权平均评分;再根据平均评分从高到低确定指标顺序,并由相邻指标评分之比构造 G1 相邻比值,从而自动生成 G1 权重参数。
10. 与代码实现的对应关系
表 1 G1 关键公式与项目实现对应关系
| 内容 | 数学表达 | 项目实现 |
|---|---|---|
| 原始输入结构 | 式(1)—式(3) | ui/upload_widget.py、utils/data_validator.py、core/g1_calculator.py::set_data |
| 适度指标处理与标准化 | 式(4)—式(12) | core/g1_calculator.py::_process_moderate、_normalize |
| 指标排序与相邻比值 | 式(13)—式(15) | ui/methods_widget.py、core/g1_calculator.py::_compute_g1_weights |
| G1 权重递推 | 式(16)—式(18) | core/g1_calculator.py::_compute_g1_weights |
| 综合得分与排名 | 式(19)—式(20) | core/g1_calculator.py::calculate_g1 |
| 逆向流程倒推顺序与比值 | 式(21)—式(25) | ui/methods_widget.py::reverse_import_scores |
| Excel、图表与复现脚本导出 | 第 7 节 | core/g1_calculator.py::save_results、ui/results_widget.py |
总体来看,本项目中的 G1 属于“序关系主观赋权 + 标准化加权和评分 + 正向/逆向双流程”的工程化实现。对论文写作而言,建议把式(13)—式(25)作为方法主体,再结合式(4)—式(12)说明本软件在指标预处理、标准化与逆向建模方面的具体口径。
11. 论文模板补充
11.1 方法描述模板
“本文采用 G1 序关系法进行主观赋权与综合评价。首先依据专家给出的指标重要性排序与相邻指标权重比,递推出完整权重向量;随后将标准化后的指标矩阵与 G1 权重结合,计算各方案综合得分并完成排序。若使用逆向流程,则先由专家评分生成指标顺序与相邻比值,再进入标准 G1 递推过程。”
11.2 结果解释模板
结果部分可写为:结果表明,排序靠前且相邻比值较大的指标通常在最终权重中占据更大比重。若方案综合得分差异明显,则说明主观序关系赋权对方案区分具有较强作用;若逆向流程与正向流程得到相近权重,则可认为评分倒推结果具有较好的稳定性。
11.3 表格标题模板
- 表 1 G1 指标排序与相邻比值设置表
- 表 2 G1 指标权重递推结果表
- 表 3 G1 方案综合得分与排序结果表
- 表 4 G1 逆向评分结果表
11.4 图表题注模板
- 图 1 G1 指标权重分布图。
- 图 2 G1 方案综合得分排序图。
- 图 3 G1 逆向评分与正向参数对比图。
11.5 表格示例
表 1 G1 权重与方案排序结果表示例
| 项目 | 结果 |
|---|---|
| 指标顺序 | |
| 相邻比值 | |
| 指标权重 | |
| 方案综合得分与排名 |
表注:指标权重由 G1 相邻比值递推得到,方案综合得分按标准化矩阵与权重向量加权求和计算。
12. 单篇终审补充
12.1 图题与表题对齐建议
原始数据表可写为:表X G1 原始数据表。标准化矩阵表可写为:表X G1 标准化矩阵表。G1权重表可写为:表X G1 指标权重表。G1比值表可写为:表X G1 相邻比值表。综合得分表可写为:表X G1 综合得分与排序表。参数设置表可写为:表X G1 参数设置表。计算过程表可写为:表X G1 计算过程表。结果-权重表可写为:表X G1 权重结果表。结果-排序表可写为:表X G1 排序结果表。weight_bar.png建议写为:图X G1 指标权重图。score_bar.png建议写为:图X G1 方案得分图。
12.2 终审说明
- 当前代表性结果目录建议同时保留正向与逆向两套,其中正向可采用
results/G1-序关系法-20260329_021609-正向,逆向可采用results/G1-序关系法-20260329_021610-逆向。 - 当前真实工作表为
原始数据/标准化矩阵/G1权重/G1比值/综合得分/参数设置/计算过程/结果-权重/结果-排序。论文表题应按这组中文 sheet 名准确落地。 - 当前稳定实体图文件为
charts/weight_bar.png与charts/score_bar.png。若正文需要解释排序逻辑,应把G1比值、G1权重和综合得分三张表配套说明,而不是只引用最终分数图。 - 真实 repro 脚本为
repro_g1_20260329_021610.py或相邻时间戳脚本,并通过SRC_FILE = 'repro_inputs/g1_sample.xlsx'读取输入副本。附录应保持这一repro_inputs/...xlsx相对路径结构。 - 正向与逆向目录可能共用同一份
g1_sample.xlsx输入副本,但脚本内部的G1_ORDER/G1_RATIOS/SOURCE_MODE不同。论文若做双流程对照,应以脚本参数快照而不是仅凭输入文件名来区分两套实验。
12.3 全量强化补充
- 当前应绑定的两套真实结果目录分别是
具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021609-正向与具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021610-逆向。这两套目录是首层主结果,不存在额外的repro_outputs/递归链。 - 需要修正旧文一个命名误差:当前真实主工作簿文件名并不是
G1-序关系法分析结果_时间戳.xlsx,而是直接与目录同名,分别为具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021609-正向/G1-序关系法-20260329_021609-正向.xlsx与具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021610-逆向/G1-序关系法-20260329_021610-逆向.xlsx。 - 上述两本工作簿当前实际工作表完全一致,均为
原始数据、标准化矩阵、G1权重、G1比值、综合得分、参数设置、计算过程、结果-权重、结果-排序。因此正向与逆向的差异不体现在 sheet 名层面,而体现在参数来源和脚本运行模式上。 - 两套目录的实体图都只包含两张:
具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021609-正向/charts/weight_bar.png、具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021609-正向/charts/score_bar.png,以及逆向目录下对应同名图片。正文如果比较正逆向结果,应明确写出目录前缀,否则图名本身无法区分两套实验。 - 当前还有一个容易误判的细节:正向目录里的 repro 脚本文件名也是
repro_g1_20260329_021610.py,并没有单独生成021609版本。也就是说,区分正向与逆向不能靠脚本文件名,而要看它所在目录和脚本内部参数。 - 两个目录中的 repro 脚本都使用
SRC_FILE = 'repro_inputs/g1_sample.xlsx',对应输入副本位于各自目录下的repro_inputs/g1_sample.xlsx;但正向脚本内部写的是SOURCE_MODE = 'forward',逆向脚本内部写的是SOURCE_MODE = 'reverse'。当前磁盘证据表明,这才是区分两套流程的真实依据。
13. 软件实现核查补充(2026-07)
- 当前实现的两套真实结果目录应写作
具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021609-正向与具体的算法3/多指标评价/G1-序关系法/results/G1-序关系法-20260329_021610-逆向。 - 正文应围绕
原始数据、标准化矩阵、G1权重、G1比值、综合得分、参数设置、计算过程、结果-权重、结果-排序来写。 - 图证应对应
weight_bar.png与score_bar.png,并说明正向/逆向目录各自存在同名图副本。 repro_g1_20260329_021610.py + repro_inputs/g1_sample.xlsx属于标准repro_inputs复现口径,SOURCE_MODE才是区分正逆向的关键。