1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#多准则决策模型-TOPSIS评价方法
##R语言实现-代码
MCDM
=
function (decision
=
NULL, weights
=
NULL, impacts
=
NULL)
#决策矩阵,权重向量,影响因子
{
if
(missing(weights))
stop(
"缺少'权重向量-weights'"
)
if
(missing(impacts))
stop(
"缺少'影响因子-impacts'"
)
if
(!
is
.matrix(decision) |
is
.data.frame(decision))
stop(
"'决策矩阵-decision'必须是矩阵或数据框"
)
if
(length(weights) !
=
ncol(decision))
stop(
"权重向量长度错误"
)
if
(length(impacts) !
=
ncol(decision))
stop(
"影响因子长度错误"
)
if
(!
all
(weights >
0
))
stop(
"权重必须大于零"
)
if
(!
is
.character(impacts))
stop(
"影响因子必须是字符型 '+'或'-' 符号"
)
if
(!
all
(impacts
=
=
"+"
| impacts
=
=
"-"
))
stop(
"影响因子只能是字符型 '+'或'-' 符号"
)
weights <
-
weights
/
sum
(weights)
N <
-
matrix(nrow
=
nrow(decision), ncol
=
ncol(decision))
#建一个空矩阵
for
(i
in
1
:nrow(decision)) {
for
(j
in
1
:ncol(decision)) {
N[i, j] <
-
decision[i, j]
/
sqrt(
sum
(decision[, j]^
2
))
}
}
#决策矩阵标准化
W
=
diag(weights)
#建权重对角矩阵
V
=
N
%
*
%
W
#构造加权规范化矩阵
#确定理想方案和负理想方案
u <
-
as.integer(impacts
=
=
"+"
)
*
apply
(V,
2
,
max
)
+
as.integer(impacts
=
=
"-"
)
*
apply
(V,
2
,
min
)
l <
-
as.integer(impacts
=
=
"-"
)
*
apply
(V,
2
,
max
)
+
as.integer(impacts
=
=
"+"
)
*
apply
(V,
2
,
min
)
#构建理想方案和负理想方案距离公式
distance_u
=
function(x) {
sqrt(
sum
((x
-
u)^
2
))
}
distance_l
=
function(x) {
sqrt(
sum
((x
-
l)^
2
))
}
#计算相对接近度并排序
du <
-
apply
(V,
1
, distance_u)
dl <
-
apply
(V,
1
, distance_l)
score <
-
dl
/
(dl
+
du)
outcome <
-
data.frame(
"方案"
=
1
:nrow(decision), 得分
=
score,
排名
=
rank(
-
score))
return
(outcome)
}
Author(s)
Mahmoud Mosalman Yazdi <m.mosalman@gmail.com>
|