You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过成对比较矩阵选出Condorcet选举的胜者?

Condorcet胜者的判定方法与算法实现

1. 成对比较矩阵的核心含义

成对比较矩阵中,matrix[i][j] 代表候选人i在与候选人j的直接对决中获得的支持票数,matrix[j][i] 则是j击败i的票数(两者之和等于参与该对决的有效投票总数)。

2. 严格Condorcet胜者的判定规则

一个候选人成为严格Condorcet胜者的唯一条件是:

对于所有其他候选人j(j≠i),均满足 matrix[i][j] > matrix[j][i]
即该候选人在每一场一对一的对决中,得票都多于对手。

以你提到的维基百科示例矩阵为例:

[[0, 2, 2, 2],
[1, 0, 1, 2],
[1, 2, 0, 2],
[1, 1, 1, 0]]

候选人A(对应第0行):

  • A vs B:2 > 1 → 获胜
  • A vs C:2 > 1 → 获胜
  • A vs D:2 > 1 → 获胜
    所有对决均胜出,因此A是严格Condorcet胜者。

3. 非严格场景的胜者判定(针对多候选人打平案例)

你遇到的C与D打平但C最终胜出的情况,说明该选举不存在严格Condorcet胜者,平台采用了Condorcet方法的变体规则(如Schulze法、Ranked Pairs法)来确定最终胜者。

在该案例中:

  • C击败了除D外的所有候选人(A、B),仅与D打平
  • D未能击败全部其他候选人(比如可能输给了A或B)
    因此在变体规则下,C的整体表现优于D,最终被选为胜者。

4. 从成对比较矩阵选出Condorcet胜者的算法步骤

假设已构建好完整的成对比较矩阵,算法逻辑如下:

  • 遍历每个候选人i(按矩阵行顺序)
  • 对每个i,检查所有其他候选人j(j≠i):
    验证 matrix[i][j] > matrix[j][i] 是否始终成立
  • 若某候选人i满足上述所有条件,则i为严格Condorcet胜者
  • 若没有这样的候选人,需使用Condorcet变体方法进一步判定。

5. 优化后的Python实现代码

以下代码支持汇总多张选票生成成对比较矩阵,并实现严格Condorcet胜者的判定:

import numpy as np

# 定义候选人列表
candidates = ["A", "B", "C", "D"]
num_candidates = len(candidates)
# 创建候选人到索引的映射,方便快速查找
candidate_to_idx = {name: idx for idx, name in enumerate(candidates)}

def generate_aggregated_matrix(all_ranked_votes):
    """汇总所有选票,生成成对比较矩阵"""
    preference_matrix = np.zeros((num_candidates, num_candidates), dtype=int)
    
    for ranked in all_ranked_votes:
        # 遍历当前选票中所有两两候选人组合
        for i in range(num_candidates):
            for j in range(i + 1, num_candidates):
                cand_i = ranked[i]
                cand_j = ranked[j]
                # 因为ranked是偏好顺序,i在j前说明cand_i更受欢迎,对应矩阵位置加1
                preference_matrix[candidate_to_idx[cand_i]][candidate_to_idx[cand_j]] += 1
    
    return preference_matrix

def find_strict_condorcet_winner(matrix):
    """从成对比较矩阵中寻找严格Condorcet胜者"""
    num_candidates = matrix.shape[0]
    for idx in range(num_candidates):
        is_winner = True
        for opponent_idx in range(num_candidates):
            if idx == opponent_idx:
                continue
            # 只要有一场对决没赢,就不是严格胜者
            if matrix[idx][opponent_idx] <= matrix[opponent_idx][idx]:
                is_winner = False
                break
        if is_winner:
            return candidates[idx]
    # 没有严格胜者时返回None
    return None

# 测试示例:模拟4张选票
sample_votes = [
    ['B', 'C', 'A', 'D'],
    ['A', 'D', 'B', 'C'],
    ['C', 'B', 'D', 'A'],
    ['C', 'D', 'A', 'B']
]

# 生成汇总矩阵
full_matrix = generate_aggregated_matrix(sample_votes)
print("成对比较矩阵:")
print(full_matrix)

# 查找胜者
winner = find_strict_condorcet_winner(full_matrix)
if winner:
    print(f"\n严格Condorcet胜者:{winner}")
else:
    print("\n不存在严格Condorcet胜者,请使用Condorcet变体方法判定")

内容的提问来源于stack exchange,提问作者user23358153

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:57:07