第二个决策算法,没有使用循环数组,而是通过pandas广播的功能实现算法。
9.18对代码进行和更新,支持传入一个数列,用来控制成本型收益型属性。
寻找正理想解的函数使用经典的元素对调三行代码实现。
优化后的代码体现了topsis算法的主要步骤,矩阵导入和标准化都封装在了专门的py文件中。
import pandas as pd#topsis方法实现
import numpy as np
import IFS
import MATRIX_NOR
import myIO
def pis(df,plist):#寻找正理想解
plist=plist
pis = df.max()
nis = df.min()
print(pis)
print(nis)
for i in plist:
temp=pis[i]
pis[i]=nis[i]
nis[i]=temp
return pis,nis
def ranks(df,pis,nis):#排名方法
pistemp = ((df.sub(pis, axis=1))**2).sum(axis=1)
nistemp = ((df.sub(nis, axis=1))**2).sum(axis=1)
return np.sqrt(nistemp)/(np.sqrt(pistemp)+np.sqrt(nistemp))
if __name__ == '__main__':
w = pd.Series([0.00854, 0.008978, 0.241101, 0.274443, 0.243986,
0.049611, 0.099215, 0.008387, 0.06539
], index=[1, 2, 3, 4, 5, 6, 7, 8, 9])
url='D:\study\\test\data\\t2.xlsx'
df =myIO.getdef(url,0)
df =MATRIX_NOR.max(df)
df = df.mul(w, axis=1)
print('规范化矩阵\n',df)
plist = [1,2,3,4]
pis,nis = pis(df,plist)
print('方案收益值为\n ',ranks(df, pis, nis))
数据来源是两篇知网论文,第一篇《基于供应链管理的供应商选择问题初探》
原文结果为
编译结果为
github仓库在https://github.com/rivendelltom/decision-making-study