VIKOR灰色关联分析法
VIKOR 灰色关联分析法简介
VIKOR (VlseKriterijumska Optimizacija I Kompromisno Resenje) 是一种多准则决策方法,旨在解决具有冲突目标的优化问题。该方法通过计算各方案与理想解之间的距离来评估不同选项,并选出最优或次优解决方案。
灰色关联分析法则是一种处理不确定性和少量数据的有效工具,在缺乏充分统计数据的情况下尤为有用。它通过对系统行为特征曲线形状相似程度的研究来进行定量描述和比较。两者结合形成的 VIKOR 灰色关联分析法能够更好地适应复杂环境下的决策需求[^1]。
方法流程概述
构建评价矩阵 构建由多个属性构成的评价指标体系,并收集相应的历史数据作为样本集。对于每个待选方案 (i) 和属性 (j), 计算标准化后的评分值 (x_{ij}),形成初始决策矩阵 (\mathbf{X}=[x_{ij}]^{m×n}_{(i=1,2,...,m;j=1,2,...,n)}) ,其中 m 表示候选方案数量,n 代表属性数目。
确定权重向量 w 根据实际应用场景设定各个属性的重要性系数 wi(i = 1, ..., n),满足条件 ∑wi = 1 。这一步骤通常依赖于专家意见或其他定量化手段得出合理分配比例。
求取正负理想解 S+ 和 S− 对每一个属性 j(j = 1, … , n),分别找出最大值 max(x_j) 及最小值 min(x_j),从而定义出正理想解 (S^+)={max(x_1),…,max(x_n)} 和 负理想解(S^-)= {min(x_1),...,min(x_n)}
计算相对接近度 Q_i 利用加权欧氏距离公式衡量第 i 方案到两个极端点的距离 d+(i) 和d-(i):
[Q_i=\frac{\sum^n_{j=1}(w_j|x_{ij}-_j-s^+_j|)}, i=1,…,m.]
- 排序并做出最终决定 将所有 Qi 值按照升序排列,则对应的方案即为从好到差依次列出的结果列表;当存在平局情况时可进一步考虑其他辅助标准加以区分。
import numpy as np
def vikor_grey_relation_analysis(X, weights):
"""
:param X: Evaluation matrix of shape (num_schemes, num_attributes)
:param weights: Weights vector for each attribute
:return: Ranking based on the relative closeness value
"""
# Step 1 & 2: Normalize data and set up ideal solutions
normalized_X = normalize_data(X)
positive_ideal_solution = np.max(normalized_X, axis=0)
negative_ideal_solution = np.min(normalized_X, axis=0)
# Step 3: Calculate distances to both ideals
distance_to_positive = weighted_euclidean_distance(
normalized_X,
positive_ideal_solution.reshape((1,-1)),
weights
)
distance_to_negative = weighted_euclidean_distance(
normalized_X,
negative_ideal_solution.reshape((1,-1)),
weights
)
# Step 4: Compute relative closeness values
denominator = sum([weights[j]*abs(negative_ideal_solution[j]-positive_ideal_solution[j])
for j in range(len(weights))])
q_values = [distance_to_positive[i]/denominator for i in range(len(distance_to_positive))]
return sorted([(q_values[i], i) for i in range(len(q_values))])
def normalize_data(data):
"""Normalize input dataset"""
mins = np.min(data, axis=0)
maxes = np.max(data, axis=0)
ranges = maxes - mins
normed_data = []
for row in data:
new_row = [(row[i] - mins[i])/ranges[i] if ranges[i]!=0 else 0 for i in range(len(row))]
normed_data.append(new_row)
return np.array(normed_data)
def weighted_euclidean_distance(a,b,w):
diff_squared_sum = ((a-b)**2 * w).sum(axis=-1)
return np.sqrt(diff_squared_sum)
相关推荐





