← 返回模型库
MODEL / 评价

TOPSIS

多方案多指标排序,尤其已经通过 AHP 或熵权法拿到权重之后,需要给出综合排序结果。

核心公式

v_{ij}=w_j z_{ij},\quad d_i^{\pm}=\sqrt{\sum_j(v_{ij}-v_j^{\pm})^2},\quad C_i=\frac{d_i^-}{d_i^++d_i^-}

Python 最小示例

下载 .py 文件 ↓

依赖见代码开头;示例在自己的 Python 环境运行,页面不执行代码。用于理解方法,正式参赛请补齐数据检验与误差分析。

Python · TOPSIS
# 依赖: numpy
import numpy as np

def topsis(X, w, benefit=None):
    X, w = np.asarray(X, float), np.asarray(w, float)
    if X.ndim != 2 or min(X.shape) < 1 or not np.isfinite(X).all():
        raise ValueError('输入必须是非空、有限的二维矩阵')
    if w.shape != (X.shape[1],) or not np.isfinite(w).all() or np.any(w < 0) or w.sum() <= 0:
        raise ValueError('权重须与列数对应、非负且总和为正')
    benefit = np.ones(X.shape[1], bool) if benefit is None else np.asarray(benefit, bool)
    if benefit.shape != (X.shape[1],):
        raise ValueError('指标方向数量与列数不一致')
    norm = np.linalg.norm(X, axis=0)
    Z = X / np.where(norm > 0, norm, 1)  # 全零列保持为 0
    Z[:, ~benefit] *= -1
    V = Z * (w / w.sum())
    d_best = np.linalg.norm(V - V.max(axis=0), axis=1)
    d_worst = np.linalg.norm(V - V.min(axis=0), axis=1)
    total = d_best + d_worst
    # 所有方案无差异时约定同分 0.5,不制造 NaN 或虚假的排序。
    return np.divide(d_worst, total, out=np.full(len(X), .5), where=total > 1e-12)

print(topsis([[9, 3], [7, 5], [6, 8]], w=[.6, .4], benefit=[True, False]).round(4))

用它研究过哪些问题?

浏览赛题库 →
国赛 · 2026E

SEM 广告投放策略

依据搜索广告的历史展现、点击与转化数据,在预算约束下确定关键词出价与预算分配,使投放效果最优。

优化统计营销
2 个关联模型拆解这道题 →
国赛 · 2023A

定日镜场的优化设计

由太阳位置与镜场几何推导光学效率与输出功率,优化镜场布局与镜面尺寸参数以提高单位面积输出。

优化几何光学评价
2 个关联模型拆解这道题 →