mathmodel

数学建模学习笔记

层次分析法

评价两方面:1.评价指标 2.指标权重

核心:比较

超大杯 = 1.5大杯 超大杯 = 2.0中杯

x/y 超大杯 大杯 中杯
超大杯 1 1.5 2
大杯 1/1.5 1 1.5
中杯 1/2 1/1.5 1

注意:这是估计出来的数据需要用求解检验

求解步骤

1.确认目标层、准则层、方案层

2.处理数据、消除量纲

​ 把每一列都相加,再除回去,写成权值表格

3.层次分析法定权重

​ 对两个元素相比较,按照 1~9 的重要性来构建表格

​ 计算一致性比例CR 公式:CR = CL / RL CR = 0 :一致性矩阵 CR < 0,1 满足一致性 CR > 0.1 不满足一致性

​ CL = (max1 -n) / (n - 1) RL = (max2 - n) / (n - 1)

​ max1 = 矩阵的特征值

​ max2 与矩阵的秩相关

n 1 2 3 4 5 6 7 8 9
RL 0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45

​ 计算权重:算数平均法、几何平均法、特征值法

​ 常用特征值法,也可以三种方法求平均值

例子:

x/y 性能跑分 拍照像素 电池续航 充电速度
性能跑分 1 5 3 2
拍照像素 1/5 1 1/2 1/3
电池续航 1/3 2 1 1/2
充电速度 1/2 3 2 1

特征值 λ2 ≈ 4.015 CL:0.0050 RL:0.9 CR:0.0056

算术平均法

​ 对每列进行归一化,再按行求平均值

几何平均法

​ 对每一行求和,然后开n次方根,归一化

特征值法

​ 用特征值的特征向量然后归一化

4.求出最后评价值

​ 将归一化的数据对应与权重相乘,最后全部相加得出评价值

代码

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
def SuanShu(excel,sums) :
sum = 0
for i in range(len(excel[0])):
sum = 0
for j in range(len(excel)):
sum += excel[j][i]
sums[i] = sum

for i in range(len(excel[0])):
for j in range(len(excel[i])):
excel[j][i] = excel[j][i] / sums[i]

for i in range(len(excel[0])):
sum = 0
for j in range(len(excel[i])):
sum += excel[i][j]
sums[i] = sum / len(excel[i])

def CengCi(excel,sums) :
sum = 1
for i in range(len(excel[0])):
sum = 1
for j in range(len(excel[i])):
sum *= excel[i][j]
sums[i] = sum ** (1 / len(excel[i]))
print(sums)
sum = 0
for i in range(len(sums)):
sum += sums[i]
for i in range(len(sums)):
sums[i] = sums[i] / sum

def TeZheng(excel,sums) :
te_list = input("请输入特征值的特征向量:").split()
te_list = list(map(float,te_list))
sum = 0
for i in range(len(te_list)):
sum += te_list[i]
for i in range(len(te_list)):
te_list[i] = te_list[i] / sum
sums[i] =te_list[i]

def QuanZheng(sums1,sums2,sums3,sums) :

for i in range(len(sums1)):
sums.append((sums1[i] + sums2[i] + sums3[i]) / 3)

def GuiYiHua(excel,n1) :
sums = [0] * len(excel[0])
for i in range(len(excel[0])):
sum = 0
for j in range(n1):
sum += excel[j][i]
sums[i] = sum

for i in range(len(excel[0])):
for j in range(n1):
if sums[i] != 0:
excel[j][i] = excel[j][i] / sums[i]

n = 0
max1 = 0

n = int(input("n:"))
RL_list = [0,0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]

max1 = float(input("max1:"))
CL = (max1 - n)/(n - 1)
RL = RL_list[n]
CR = (CL / RL)
if CR == 0 :
print(f"这是一致矩阵 CL:{CL} RL:{RL} CR:{CR}")
elif CR < 0.1:
print(f"满足一致性检验 CL:{CL} RL:{RL} CR:{CR}")
excel = []
for i in range(n):
row = map(float,list(input(f"请输入第{i+1}行:").split()))
excel.append(list(row))

excel1 = []

sums1 = [0] * len(excel[0])
sums2 = [0] * len(excel[0])
sums3 = [0] * len(excel[0])
sums = []
SuanShu(excel,sums1)
CengCi(excel,sums2)
TeZheng(excel,sums3)
QuanZheng(sums1,sums2,sums3,sums)
print(f"权重1为:{sums1}")
print(f"权重2为:{sums2}")
print(f"权重3为:{sums3}")
print(f"权重为:{sums}")
n1 = int(input("n1:"))
for i in range(n1):
row1 = map(float,list(input(f"请输入第{i+1}行数据:").split()))

excel1.append(list(row1))
GuiYiHua(excel1,n1)
print(excel1)
PingJia = []
for i in range(n1):
sum = 0
for j in range(n):
sum = sum + (excel1[i][j] * sums[j])
PingJia.append(sum)
print(f"PingJia:{PingJia}")
else:
print(f"不满足一致性检验 CL:{CL} RL:{RL} CR:{CR}")

模糊综合评价

Topis法

从现有的评价体系上构建出最优最劣目标,计算每个方案与目标的距离