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]}")