赞
踩
建模步骤
建立层次结构模型
目标:选择合适的旅游地
从上至下,依次为目标层、准则层、方案层。(有没有觉得这个图很漂亮?中途安利一个在线绘图网站【点我】)
构造成对比较矩阵
标度 | 含义 |
---|---|
1 | 同样重要 |
3 | 稍微重要 |
5 | 明显重要 |
7 | 强烈重要 |
9 | 极端重要 |
2,4,6,8 | 判断中值 |
倒数 | 反过来比较 |
根据已建立的模型,通过查找资料,并对大量数据进行分析,得到如下成对比较矩阵。(数据来源于参考文献)
1)C层:以
Z
{Z}
Z为目标,你认为
C
i
比
C
j
{Ci比Cj}
Ci比Cj重要多少?
C
Z
=
C
5
×
C
5
=
[
1
1
2
4
3
3
2
1
7
5
5
1
4
1
7
1
1
2
1
3
1
3
1
5
2
1
1
1
3
1
5
3
1
1
]
C_{Z}=C_{5} \times C_{5}=
2)P层:以
C
1
{C_{1}}
C1为目标,你认为
P
i
比
P
j
{Pi比Pj}
Pi比Pj重要多少?
P
A
1
=
P
3
×
P
3
=
[
1
2
5
1
2
1
2
1
5
1
2
1
]
P_{A1}=P_{3} \times P_{3} =
同理,分别以
A
2
−
5
{A_{2-5}}
A2−5为目标,你认为
B
i
比
B
j
{Bi比Bj}
Bi比Bj重要多少?
P
A
2
=
[
1
1
3
1
8
3
1
1
3
8
3
1
]
P
A
3
=
[
1
1
3
1
1
3
1
3
1
3
1
]
P
A
4
=
[
1
3
4
1
3
1
1
1
4
1
1
]
P
A
5
=
[
1
1
1
4
1
1
1
4
4
4
1
]
P_{A2}=
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
RI | 0 | 0 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 | 1.49 | 1.51 |
注:按照相同方法计算 B 1 − 5 {B_{1-5}} B1−5权重向量和对应特征值,并分析一致性。
根据上理,分别求出
B
对
Z
{B对Z}
B对Z权重即可
(不知不觉写了好多推导过程,虽然都是参考别人的,但还是耗费太多时间,后面我尽量减少过程,直接建模)
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 输入成对比较矩阵(list),输出一致性比率和权重向量,输入list为单行形式 如:[[1,2,5], [1/2,1,2], [1/5,1/2,1]] 提示:对特征向量的不同求解方法将会得到不同权重向量 """ import numpy as np # 随机一致性指标 RI_dict = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49, 11: 1.51} def get_w(array): """ 1.列向量归一化 2.求每行元素之和归一化得到权重向量w 3.根据特征值定义求w对应的特征值即为最大特征值 λ """ row = array.shape[0] # 计算出阶数 a_axis_0_sum = array.sum(axis=0) # 1.列元素和 向量 b = array / a_axis_0_sum # 1.列向量归一化 b_axis_1_sum = b.sum(axis=1) # 2.每一行元素之和 w = b_axis_1_sum / row # 2.归一化处理(获得权重向量向量)提示:经过1的归一化后,矩阵所有元素之和为矩阵阶数,因此除以阶数 AW = (w * array).sum(axis=1) # 行和 max_max = sum(AW / (row * w)) # 获得对应的特征值,即最大特征值 CI = (max_max - row) / (row - 1) CR = CI / RI_dict[row] if CR < 0.1: print("一致性比率为:{0}".format(round(CR, 3))) print('满足一致性') return w else: print("一致性比率为:{0}".format(round(CR, 3))) print('不满足一致性,请进行修改') def main(array): if type(array) is np.ndarray: return get_w(array) else: print('请输入numpy对象') if __name__ == '__main__': matrix = np.array(eval(input("输入成对比较矩阵:"))) print("权重向量:{0}".format(main(matrix)))
突然发现2019年亚太杯(APMCM)第B题三问可以用这个模型。本文不讨论APMCM,因为他的数据太多,太耗费时间,有兴趣的可以百度看看。如果有时间我再用这个模型复现一下那道题。/flag1
本文讨论的题目:对4家企业进行投资评估(来自参考视频)
产值u1 | 投资成本u2 | 销售额u3 | 国家收益比重u4 | 环境污染程度u5 | |
---|---|---|---|---|---|
x 1 {x_{1}} x1 | 8350 | 5300 | 6135 | 0.82 | 0.17 |
x 2 {x_{2}} x2 | 7455 | 4952 | 6527 | 0.65 | 0.13 |
x 3 {x_{3}} x3 | 11000 | 8001 | 9008 | 0.59 | 0.15 |
x 4 {x_{4}} x4 | 9624 | 5000 | 8892 | 0.74 | 0.28 |
现对数据进行归一化处理。
不同数据,不同归一算法。
效
益
型
:
r
i
j
=
a
i
j
m
a
x
(
a
i
j
)
或
r
i
j
=
a
i
j
−
m
i
n
(
a
i
j
)
m
a
x
(
a
i
j
)
−
m
i
n
(
a
i
j
)
效益型: r_{ij}= \frac{a_{ij}}{max(a_{ij})} 或 r_{ij}= \frac{a_{ij}-min(a_{ij})}{max(a_{ij})-min(a_{ij})}
效益型:rij=max(aij)aij或rij=max(aij)−min(aij)aij−min(aij)
成 本 型 : r i j = m i n ( a i j ) a i j 或 r i j = m a x ( a i j ) − a i j m a x ( a i j ) − m i n ( a i j ) 成本型: r_{ij}= \frac{min(a_{ij})}{a_{ij}} 或 r_{ij}= \frac{max(a_{ij})-a_{ij}}{max(a_{ij})-min(a_{ij})} 成本型:rij=aijmin(aij)或rij=max(aij)−min(aij)max(aij)−aij
固 定 型 : r i j = 1 − a i j − α j m a x ( ∣ a i j − α j ∣ ) ( α j 为 固 定 标 准 ) 固定型: r_{ij}= 1- \frac{a_{ij} - \alpha_{j}}{max(|a_{ij}-\alpha_{j}|)}(\alpha_{j} 为固定标准) 固定型:rij=1−max(∣aij−αj∣)aij−αj(αj为固定标准)
偏 离 型 : r i j = ∣ a i j − β j ∣ − m i n ( ∣ a i j − β j ∣ ) m a x ( ∣ a i j − β j ∣ ) − m i n ( ∣ a i j − β j ∣ ) 偏离型: r_{ij}= |a_{ij}-\beta_{j}| -\frac{min(|a_{ij}-\beta_{j}|)}{max(|a_{ij}-\beta_{j}|)-min(|a_{ij}-\beta_{j}|)} 偏离型:rij=∣aij−βj∣−max(∣aij−βj∣)−min(∣aij−βj∣)min(∣aij−βj∣)
区
间
型
:
r
i
j
=
{
1
−
m
a
x
(
q
1
j
−
a
i
j
,
a
i
j
−
q
2
j
)
m
a
x
[
q
1
j
−
m
i
n
(
a
i
j
)
,
m
a
x
(
a
i
j
)
−
q
2
j
]
,
a
i
j
∉
[
q
1
j
,
q
2
j
]
1
,
a
i
j
∈
[
q
1
j
,
q
2
j
]
区间型: r_{ij}= \left\{
偏
离
区
间
型
:
r
i
j
=
{
m
a
x
(
q
1
j
−
a
i
j
,
a
i
j
−
q
2
j
)
m
a
x
[
q
1
j
−
m
i
n
(
a
i
j
)
,
m
a
x
(
a
i
j
)
−
q
2
j
]
,
a
i
j
∉
[
q
1
j
,
q
2
j
]
1
,
a
i
j
∈
[
q
1
j
,
q
2
j
]
偏离区间型: r_{ij}= \left\{
易知,投资成本u2和污染程度u5为成本型,其余为效益型,得到归一后数据
产值u1 | 投资成本u2 | 销售额u3 | 国家收益比重u4 | 环境污染程度u5 | |
---|---|---|---|---|---|
x 1 {x_{1}} x1 | 0.7455 | 0.9394 | 0.6811 | 1.0000 | 0.7647 |
x 2 {x_{2}} x2 | 0.6777 | 1.0000 | 0.7246 | 0.7926 | 1.0000 |
x 3 {x_{3}} x3 | 1.0000 | 0.6189 | 1.0000 | 0.7195 | 0.8667 |
x 4 {x_{4}} x4 | 0.8749 | 0.9904 | 0.9871 | 0.9024 | 0.4643 |
多属性决策主要源码和①层次分析法一样,关于归一化方法还要具体情况具体分析,很难设计出通用源码。因此Python源码可参考1.2, 下面提供一些Latex公式源码
$$ 效益型: r_{ij}= \frac{a_{ij}}{max(a_{ij})} 或 r_{ij}= \frac{a_{ij}-min(a_{ij})}{max(a_{ij})-min(a_{ij})} $$ $$ 成本型: r_{ij}= \frac{min(a_{ij})}{a_{ij}} 或 r_{ij}= \frac{max(a_{ij})-a_{ij}}{max(a_{ij})-min(a_{ij})} $$ $$ 固定型: r_{ij}= 1- \frac{a_{ij} - \alpha_{j}}{max(|a_{ij}-\alpha_{j}|)}(\alpha_{j} 为固定标准) $$ $$ 偏离型: r_{ij}= |a_{ij}-\beta_{j}| -\frac{min(|a_{ij}-\beta_{j}|)}{max(|a_{ij}-\beta_{j}|)-min(|a_{ij}-\beta_{j}|)} $$ $$ 区间型: r_{ij}= \left\{\begin{matrix} 1 - {\Large\frac{max(q_{1}^{j}-a_{ij}, a_{ij}-q_{2}^{j})}{max\left [q_{1}^{j}-min(a_{ij}), max(a_{ij})-q_{2}^{j} \right ]}} ,a_{ij}\notin [q_{1}^{j}, q_{2}^{j}]\\ 1 ,a_{ij}\in [q_{1}^{j}, q_{2}^{j}] \end{matrix}\right. $$ $$ 偏离区间型: r_{ij}= \left\{\begin{matrix} {\Large\frac{max(q_{1}^{j}-a_{ij}, a_{ij}-q_{2}^{j})}{max\left [q_{1}^{j}-min(a_{ij}), max(a_{ij})-q_{2}^{j} \right ]}} ,a_{ij}\notin [q_{1}^{j}, q_{2}^{j}]\\ 1 ,a_{ij}\in [q_{1}^{j}, q_{2}^{j}] \end{matrix}\right. $$
""" 修改最下面的带权邻接矩阵 输出0→n最短路径长度和步骤 """ import numpy as np Inf = np.Inf # 无穷大 P = 1 # P标记 Q = 0 # Q标记 def dijkstra(matrix): m = np.array(matrix) # 转化为矩阵 n = m.shape[0] # 获取矩阵阶数 book = np.zeros(n) # 记录P标记和Q标记 book[0] = P # 初始点标记P route = np.zeros_like(book) # 记录路径 # 循环(阶数-1)次 for x in range(n - 1): min_m = Inf # 距离初始点距离最小值 for j in range(n): if book[j] == 0 and m[0][j] < min_m: min_m = m[0][j] # 记录最近值 u = j # 记录最近点 book[u] = P # 将该点标记P for v in range(n): if m[u][v] < Inf: if m[0][v] > m[0][u] + m[u][v]: # 如果(0→v)的距离大于(0→u→v),则松弛v m[0][v] = m[0][u] + m[u][v] route[x] = u # 记录路径 print("0到n的最短路径长度为:", m[0]) # 输出最短路径长路 print("0到n的最短路径为:", route) # 输出路径 """ 带权邻接矩阵 """ k = [[0, 2, 8, 1, Inf, Inf, Inf, Inf, Inf, Inf, Inf], [2, 0, 6, Inf, 1, Inf, Inf, Inf, Inf, Inf, Inf], [8, 6, 0, 7, 5, 1, 2, Inf, Inf, Inf, Inf], [1, Inf, 7, 0, Inf, Inf, 9, Inf, Inf, Inf, Inf], [Inf, 1, 5, Inf, 0, 3, Inf, 2, 9, Inf, Inf], [Inf, Inf, 1, Inf, 3, 0, 4, Inf, 6, Inf, Inf], [Inf, Inf, 2, 9, Inf, 4, 0, Inf, 3, 1, Inf], [Inf, Inf, Inf, Inf, 2, Inf, Inf, 0, 7, Inf, 9], [Inf, Inf, Inf, Inf, 9, 6, 3, 7, 0, 1, 2], [Inf, Inf, Inf, Inf, Inf, Inf, 1, Inf, 1, 0, 4], [Inf, Inf, Inf, Inf, Inf, Inf, Inf, 9, 2, 4, 0]] dijkstra(k)
正在更新中……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。