python35行代码直接解决topsis模型
摘要(直接上代码结果)
代码部分:(解决关于河流的最优问题)
import numpy as np
x = np.array([[4.69,6.59,51,11.94],[2.03,7.86,19,6.46],[9.11,6.31,46,8.91],[8.61,7.05,46,26.43],[7.13,6.5,50,23.57],[2.39,6.77,38,24.62],[7.69,6.79,38,6.01],[9.3,6.81,27,31.57],[5.45,7.62,5,18.46],[6.19,7.27,17,7.51],[7.93,7.53,9,6.52],[4.4,7.28,17,25.3],[7.46,8.24,23,14.42],[2.01,5.55,47,26.31],[2.04,6.4,23,17.91],[7.73,6.14,52,15.72],[6.35,7.58,25,29.46],[8.29,8.41,39,12.02],[3.54,7.27,54,3.16],[7.44,6.26,8,28.41]])
(n,m)=x.shape;
print('共有%d(n)个评价对象,'%n,'%d(m)个评价指标'%m)
count=int(input("你有几项需要正向化处理:"));
t=[]
for i in range(count):
judge = int(input("请输入需要正向化的类型(1:极小型;2:中间型;3:区间型):"))
if judge == 1: # 处理极小型
position = int(input("请输入它所在的列:")) - 1
b = max(x[:, position])
x[:, position] = np.tile(b, 20) - x[:, position]
if judge == 2: # 处理中间型
position = int(input("请输入它所在的列:")) - 1
best = int(input("请输入最佳值:"))
x[:, position] = 1 - abs(x[:, position] - np.tile(best, 20)) / np.tile(best, 20)
if judge == 3: # 处理区间型
position = int(input("请输入它所在的列:")) - 1
left = int(input("请输入左区间值:"))
rigjt=int(input("请输入右区间值:"))
for i in range(n):
if left<=x[:, position][i]<=rigjt:
t.append(1)
if x[:, position][i] > rigjt:
b= max(x[:, position])-rigjt
t.append(1-(x[:, position][i]-rigjt)/b)
if x[:, position][i] < left:
b = left-max(x[:, position])
t.append(1 - (left-x[:, position][i]) / b)
x[:, position]=t
x=x**2
c=np.tile(x.sum(axis=0), [20,1])
Z=(x/c)**0.5
D1=(np.sum((np.tile(Z.min(axis=0), [20,1])-Z)**2,axis=1))**0.5
D2=(np.sum((np.tile(Z.max(axis=0), [20,1])-Z)**2,axis=1))**0.5
S=D1/(D1+D2)
M=S
M=M.tolist();
index1=M.index(max(M))+1;index2=M.index(min(M))+1
print('最佳河流是第%d条'%index1,'得分为%s'%max(M),'(未归一化)')
print('最差河流是第%d条'%index2,'得分为%s'%min(M),'(未归一化)')
T=np.sum(S)
sort=S/T
sort=sort.tolist();
index1=sort.index(max(sort))+1;index2=sort.index(min(sort))+1
print('得分表:%s'%sort)
print('最佳河流是第%d条'%index1,'得分为%s'%max(sort),'(归一化)')
print('最差河流是第%d条'%index2,'得分为%s'%min(sort),'(归一化)')
结果:
共有20(n)个评价对象, 4(m)个评价指标
你有几项需要正向化处理:3
请输入需要正向化的类型(1:极小型;2:中间型;3:区间型):1
请输入它所在的列:3
请输入需要正向化的类型(1:极小型;2:中间型;3:区间型):2
请输入它所在的列:2
请输入最佳值:7
请输入需要正向化的类型(1:极小型;2:中间型;3:区间型):3
请输入它所在的列:4
请输入左区间值:10
请输入右区间值:20
最佳河流是第11条 得分为0.8776072101106555 (未归一化)
最差河流是第14条 得分为0.21005168925905793 (未归一化)
得分表:[0.03745607712277839, 0.05638439140175191, 0.04911516102421658, 0.03791332986470618, 0.03631217198936668, 0.03198217183587749, 0.05500730028119533, 0.04490280997470958, 0.07192839817447075, 0.07025169076130178, 0.08333012125064657, 0.052687376398011174, 0.06524290400033522, 0.01994472303008249, 0.05149157146676416, 0.042416543545980574, 0.04306115865636171, 0.05177432369632416, 0.0408262995015081, 0.057971476023611156]
最佳河流是第11条 得分为0.08333012125064657 (归一化)
最差河流是第14条 得分为0.01994472303008249 (归一化)
topsis 模型 属于综合评价模型,原模型不考虑指权重影响解决各种不同指标下各个评价问题的最优解问题,对公司遇到综合决策问题时候,以及客户如何根据指标选择方案尤为重要。
原型:
topsis原理简单,核心就是优劣解距离,什么是优劣解距离:
上图我们不难看出,当我们这样计算的时候,如果得分越靠近优,则它的得分就会越优,反之得分就会越差,这就是优劣解距离大的核心思想。
(看不懂联系博主哦~)