Topsis模型算法

 

 

 

import numpy as np
print("请输入参评数目:")
n=int(input())
print("请输入指标数目:")
m=int(input())

print('请输入类型矩阵:1:极大型,2:极小型,3:中间型,4:区间型')
kind=input().split(" ")#将输入的字符串按空格分割,形成列表
print('请输入矩阵:')
#numpy.zeros(shape,dtype=float,order='c')
#参数说明:
#shape:数组的形状,一个数字代表一维数组,一个整数元组如(2,3)表示二维数组,必须指定
#dtype:数组的数据类型,默认float
#order:数组在内存中的存储顺序,c为按行存储,f为按列存储。默认为’c‘
A=np.zeros(shape=(n,m))#初始化一个n行m列的全零矩阵A

for i in range(n):
    A[i]=input().split(" ")
    A[i]=list(map(float,A[i]))#将接受到的字符串列表转化为浮点数列表
print("输入矩阵为:\n{}".format(A))

#极小型指标转化为大指标的函数
def minTomax(maxx,x):
    x=list(x)#将输入的指标转化为列表
    ans=[[(maxx-e)] for e in x]
    return np.array(ans)

#中间型指标转化为极大型指标的函数
def midTomax(bestx,x):
    x=list(x)
    h=[abs(e-bestx) for e in x]
    M=max(h)
    if M==0:
        M=1#防止最大差值为0的情况
    ans=[[(1-e/M)] for e in h]
    return np.array(ans)

#区间型指标转化为极大型指标的函数
def regTomax(lowx,highx,x):
    x=list(x)
    M=max(lowx-min(x),max(x)-highx)
    if M==0:
        M=1
    ans=[]
    for i in range(len(x)):
        if x[i]<lowx:
            ans.append([(1-(lowx-x[i])/M)])
        elif x[i]>highx:
            ans.append([(1-(x[i]-highx)/M)])
        else:
            ans.append([1])
    return np.array(ans)
#统一指标类型,将所有指标转化为极大型指标
X=np.zeros(shape=(n,1))
for i in range(m):
    if kind[i]=="1":
        v=np.array(A[:,i])
    elif kind[i]=="2":
        maxA=max(A[:,i])
        v=minTomax(maxA,A[:,i])
    elif kind[i]=="3":
        print("类型三:请输入最优值:")
        bestA=eval(input())
        v=midTomax(bestA,A[:,i])
    elif kind[i]=="4":
        print("类型四:请输入区间【a,b】a:")
        lowA=eval(input())
        print("类型四:请输入区间【a,b】b:")
        highA=eval(input())
        v=regTomax(lowA,highA,A[:,i])
    if i==0:
        X=v.reshape(-1,1)#如果是第一个指标,直接替换
        #reshape
    else:
        X=np.hstack([X,v.reshape((-1,1))])
print("统一指标后矩阵为:\n{}".format(X))

#对统一后的矩阵X进行标准化处理
X=X.astype('float')
for j in range(m):
    X[:,j]=X[:,j]/np.sqrt(sum(X[:,j]**2))
print("标准化矩阵:\n{}".format(X))
#最大值最小值距离的计算
x_max=np.max(X,axis=0)#计算每列的最大值
x_min=np.min(X,axis=0)
d_z=np.sqrt(np.sum(np.square((X-np.tile(x_max,(n,1)))),axis=1))
d_f=np.sqrt(np.sum(np.square((X-np.tile(x_min,(n,1)))),axis=1))
print('每个指标的最大值:',x_max)
print('每个指标的最小值:',x_min)
print("d+向量",d_z)
print("d-向量",d_f)
#计算参评对象的得分排名
s=d_f/(d_z+d_f)
#转化为百分制
score=100*s/sum(s)
for i in range(len(score)):
    print(f"第{i+1}个标准化后的百分之的得分为:{score[i]}")

 

 

猜你喜欢

转载自blog.csdn.net/m0_74807013/article/details/140657926