2021年C题
第一问题目:
根据附件 1,对 402 家供应商的供货特征进行量化分析,建立反映保障企业生产 重要性的数学模型,在此基础上确定 50 家最重要的供应商,并在论文中列表给出结果。
基于题目的数据选择:
①材料规模:规模,每一个公司的所有数据加到一起,取平均值(/240)
②供应率:(反映供应的水平高低,也就是完成供应的次数除以总共订购的次数):当供应量是订购量的 90%到110% 认为是合适的供应,完成了供应。
供应率=(合适的供应次数)/订购量不等于0的总次数。
③供应的次数:在订购的情况下,合适供应的总次数。
④最大供货量:
⑤供货的稳定性:供货量/订购量 为供货比例 1-供货比例 求和除以供货次数。
⑥供应比例的方差,(供应比例为:供应量/订购量)
数据处理:
one首先是确定使用最大or 最小
也有中间型,一般不用。
方差使用的是使用最大值减去最小值的方法:(使用该方法这个数据的权数很小~~)
data_var=np.max(data_var)-data_var
two读取数据:
直接看代码吧:(对应书中232页 13.3.5)
import openpyxl
def hanshu(c,a,b):#参数: ①表格,②左上角索引,多加一行,往左。,③右下角 最后返回一个列表。
re_list=[]
for row_of_cell_objects in c[a:b]:
tem_list = []
tem_rate=0.0
for cell_obj in row_of_cell_objects:
if cell_obj.value=='A':
tem_rate=rate[0]
continue
if cell_obj.value == 'B':
tem_rate = rate[1]
continue
if cell_obj.value == 'C':
tem_rate = rate[2]
continue
tem_list.append(cell_obj.value*tem_rate)
re_list.append(tem_list)
return re_list
three模一化,归一化,标准化:
模一化:
模一化之后还要归一化,不晓得为啥,否则权算不出来。
如果最后使用TOPSIS法,最好用模一化。
def modularization(D):#传入一个np矩阵,列是一个性质要模一化
r=D
D_T = np.transpose(D)
temp = pow(np.dot(D_T, D), 1 / 2) # 相加开根号
for i in range(D.shape[1]):
r[:, i] = D[:, i] / temp[i, i]
return r
data=modularization(data)
print('模一化:',data.shape)
data = data / np.sum(data, axis=0)
print('归一化:',data.shape)
标准化:
也就是
#标准化:
data -= np.mean(data, axis=0)
data /= np.std(data, axis=0)
print(data)
信息熵法:
看代码:
说明其中对于是0的数字进行1e-7处理:
def data_shang(D):
tem=D
for _ in range(D.shape[0]):
for __ in range(D.shape[1]):
if D[_][__]==0:
tem[_][__]=1e-7
D=tem
for _ in range(D.shape[0]):
for __ in range(D.shape[1]):
if D[_][__]<0:
print('dbguiaw')
e=-1.0/np.log(D.shape[0])*sum(D*np.log(D))#计算信息熵
print('e',e)
f=1-e
w=f/sum(f)#计算权重
return w
TOPSIS法:
代码如下:
有一个计算范数的函数,和一个计算距离的方程:
v=data*w_ans
print('topsis的v',v.shape)
max_tem=np.max(v,axis=0)
min_tem=np.min(v,axis=0)
print('max:',max_tem)
print('min:,',min_tem)
def dist(a, b):#计算范数的函数
return np.linalg.norm(a - b, ord=2)
re_ans=[]
for __ in range(data.shape[0]):#共402个结果,数字越大,结果越好。
tem_num=0.0
tem_num=dist(data[__],min_tem)/(dist(data[__],min_tem)+dist(data[__],max_tem))
re_ans.append(tem_num)
结果的使用Excel输出:
代码:
list_1=list(range(1,403))
list=[]
list.append(list_1)
list.append(re_ans)
re_ans=np.asarray(list)
re_ans=re_ans.transpose()
#得到一个矩阵,两列,第一列为序号,第二列为数字
your_array=re_ans
filename =xlwt.Workbook() #创建工作簿
sheet1 = filename.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheet
[h,l]=re_ans.shape
#h为行数,l为列数
for i in range (h):
sheet1.write(i,0,'S'+str(i+1))#序号前+'S'
for j in range (1,l):
sheet1.write(i,j,your_array[i,j])
filename.save('最终结果.xls')
OK。万事大吉~~~~