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)

多准则决策模型-TOPSIS评价方法-源码的更多相关文章

  1. 多准则决策模型-TOPSIS方法

    多准则决策–Multiple Criteria Decision Making 多准则决策–Multiple Criteria Decision Making 多准则决策是指在具有相互冲突.不可共度的 ...

  2. Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...

  3. Java split方法源码分析

    Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 bool ...

  4. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  5. erlang下lists模块sort(排序)方法源码解析(一)

    排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不 ...

  6. getOrCreateEnvironment()方法源码探究

    该方法目的是创建一个环境对象,并且根据环境类型,自动判断是创建web环境对象,还是标准非web环境对象. 首先该方法源于prepareEnvironment准备环境: 然后进入该方法源码: 可以发现: ...

  7. TreeSet集合的add()方法源码解析(01.Integer自然排序)

    >TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itca ...

  8. invalidate和requestLayout方法源码分析

    invalidate方法源码分析 在之前分析View的绘制流程中,最后都有调用一个叫invalidate的方法,这个方法是啥玩意?我们来看一下View类中invalidate系列方法的源码(ViewG ...

  9. Linq分组操作之GroupBy,GroupJoin扩展方法源码分析

    Linq分组操作之GroupBy,GroupJoin扩展方法源码分析 一. GroupBy 解释: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值. 查询表达式: var ...

随机推荐

  1. MT写的对URL操作的两个方法

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. android自定义viewgroup实现等分格子布局

    先上效果图: 实现这样的效果: 一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面的效果 还有就是利用g ...

  3. android SDK Manager 上载失败

    android SDK Manager 下载失败如题,利用android SDK Manager 无法下载各个版本的SDK,是最近无法连接上谷歌的服务器吗?我用了网上说的在C:\WINDOWS\sys ...

  4. c# dataGridview的Cellclick移除事件

    private void gvMoldInfo_CellClick(object sender, DataGridViewCellEventArgs e) { ) return; string col ...

  5. MyBatis知多少(7)持久层

    持久层是适合使用MyBatis的地方.在面向对象的系统中,持久层主要关注对象(或者更精确地说应该是存储在那些对象中的数据)的存取.在企业应用程序中持久层通常用关系数据库系统来存储数据,虽然某些情况下其 ...

  6. table相关的API

    void lua_getglobal (lua_State *L, const char *name);获取lua全局变量,将lua的全局变量global name压栈.堆栈+1 void lua_s ...

  7. UVa11292

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  8. SSL握手步骤【收藏】

    http://www.codeweblog.com/ssl-handshake-process-of-interaction-and/ SSL to send a message in the fol ...

  9. Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

    PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封 ...

  10. Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...