• 多准则决策模型-TOPSIS评价方法-源码


    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))
            }
        }                 #决策矩阵标准化
        = diag(weights) #建权重对角矩阵
        = %*% W       #构造加权规范化矩阵
     
     
    #确定理想方案和负理想方案
        u <- as.integer(impacts == "+"* apply(V, 2max+ as.integer(impacts == 
            "-"* apply(V, 2min)
        l <- as.integer(impacts == "-"* apply(V, 2max+ as.integer(impacts == 
            "+"* apply(V, 2min)
     
    #构建理想方案和负理想方案距离公式
        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>
  • 相关阅读:
    一个该不该抽出来的函数引起的思考
    规范代码之方法重用
    web列表分页与问题
    win10系统休眠无法唤醒,无法完全关机问题
    java父子类的初始化顺序--个人总结
    java并发包-concurrentMap和CopyOnWriteArrayList
    大浏览量系统的静态化架构设计
    Angular4 innerHtml呈现富文本内容样式
    Angular4项目运行时URL自动加#方法
    在Angular4中使用ng2-baidu-map详解
  • 原文地址:https://www.cnblogs.com/shangfr/p/4998406.html
Copyright © 2020-2023  润新知