多准则决策模型-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)) } } #决策矩阵标准化 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) |
多准则决策模型-TOPSIS评价方法-源码的更多相关文章
- 多准则决策模型-TOPSIS方法
多准则决策–Multiple Criteria Decision Making 多准则决策–Multiple Criteria Decision Making 多准则决策是指在具有相互冲突.不可共度的 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...
- Java split方法源码分析
Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 bool ...
- erlang下lists模块sort(排序)方法源码解析(二)
上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...
- erlang下lists模块sort(排序)方法源码解析(一)
排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不 ...
- getOrCreateEnvironment()方法源码探究
该方法目的是创建一个环境对象,并且根据环境类型,自动判断是创建web环境对象,还是标准非web环境对象. 首先该方法源于prepareEnvironment准备环境: 然后进入该方法源码: 可以发现: ...
- TreeSet集合的add()方法源码解析(01.Integer自然排序)
>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码 TreeSet集合使用实例 package cn.itca ...
- invalidate和requestLayout方法源码分析
invalidate方法源码分析 在之前分析View的绘制流程中,最后都有调用一个叫invalidate的方法,这个方法是啥玩意?我们来看一下View类中invalidate系列方法的源码(ViewG ...
- Linq分组操作之GroupBy,GroupJoin扩展方法源码分析
Linq分组操作之GroupBy,GroupJoin扩展方法源码分析 一. GroupBy 解释: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值. 查询表达式: var ...
随机推荐
- MT写的对URL操作的两个方法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- android自定义viewgroup实现等分格子布局
先上效果图: 实现这样的效果: 一般的思路就是,直接写布局文件,用LinearLayout 嵌套多层子LinearLayout,然后根据权重layout_weight可以达到上面的效果 还有就是利用g ...
- android SDK Manager 上载失败
android SDK Manager 下载失败如题,利用android SDK Manager 无法下载各个版本的SDK,是最近无法连接上谷歌的服务器吗?我用了网上说的在C:\WINDOWS\sys ...
- c# dataGridview的Cellclick移除事件
private void gvMoldInfo_CellClick(object sender, DataGridViewCellEventArgs e) { ) return; string col ...
- MyBatis知多少(7)持久层
持久层是适合使用MyBatis的地方.在面向对象的系统中,持久层主要关注对象(或者更精确地说应该是存储在那些对象中的数据)的存取.在企业应用程序中持久层通常用关系数据库系统来存储数据,虽然某些情况下其 ...
- table相关的API
void lua_getglobal (lua_State *L, const char *name);获取lua全局变量,将lua的全局变量global name压栈.堆栈+1 void lua_s ...
- UVa11292
Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...
- SSL握手步骤【收藏】
http://www.codeweblog.com/ssl-handshake-process-of-interaction-and/ SSL to send a message in the fol ...
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框... AndBase中AbActivity封 ...
- Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)
1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...