写一个r语言的TOPSIS算法
时间: 2023-11-18 13:57:26 浏览: 188
以下是一个R语言的TOPSIS算法的示例代码,其中包含了计算距离矩阵、归一化矩阵、计算权重矩阵、计算正负理想解、计算综合得分等步骤:
```R
# 定义原始矩阵
X <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), nrow = 4)
# 定义权重向量
w <- c(0.3, 0.2, 0.4, 0.1)
# 定义指标方向,1表示正向,-1表示负向
d <- c(1, 1, -1, 1)
# 计算距离矩阵
d_mat <- matrix(0, nrow = nrow(X), ncol = nrow(X))
for (i in 1:nrow(X)) {
for (j in 1:nrow(X)) {
d_mat[i, j] <- sqrt(sum((X[i,] - X[j,])^2))
}
}
# 归一化矩阵
n_mat <- matrix(0, nrow = nrow(X), ncol = ncol(X))
for (i in 1:ncol(X)) {
n_mat[, i] <- X[, i] / sqrt(sum(X[, i]^2))
}
# 计算权重矩阵
W_mat <- matrix(w, nrow = nrow(X), ncol = ncol(X), byrow = TRUE)
# 计算正负理想解
Z_plus <- apply(n_mat, 2, max)
Z_minus <- apply(n_mat, 2, min)
for (i in 1:ncol(X)) {
if (d[i] == -1) {
temp <- Z_plus[i]
Z_plus[i] <- Z_minus[i]
Z_minus[i] <- temp
}
}
# 计算综合得分
s_plus <- apply(W_mat * n_mat, 1, sum, na.rm = TRUE)
s_minus <- apply(W_mat * n_mat, 1, function(x) sqrt(sum((x - Z_minus)^2)))
s_score <- s_minus / (s_plus + s_minus)
# 输出结果
s_score
```
需要注意的是,这里的示例代码中使用了一个4行3列的原始矩阵,其中每一行表示一个样本,每一列表示一个指标。权重向量、指标方向、距离矩阵、归一化矩阵、权重矩阵、正负理想解和综合得分的计算方式与TOPSIS算法的定义是一致的。如果使用该代码进行实际计算,需要根据实际情况调整输入参数和输出结果。
阅读全文