基于python的Topsis(优劣解距离)算法的实现(附代码及举例说明)
TOPSIS 法是一種用于組內(nèi)綜合評價十分常見的算法,能充分利用原始數(shù)據(jù)的信息,其結(jié)果能精確地反映各評價方案之間的差距。例如當(dāng)我們在面對離散性、隨機(jī)性較高的原始數(shù)據(jù)時,為了通過對這些數(shù)據(jù)進(jìn)行分析從而得到最優(yōu)解,不妨可以試試這種算法。下面我將以2021數(shù)學(xué)建模比賽中c題數(shù)據(jù)及問題為例進(jìn)行演示說明。
題目如下---------------------------------------------------------------------------------------------------------------------
某建筑和裝飾板材的生產(chǎn)企業(yè)所用原材料主要是木質(zhì)纖維和其他植物素纖維材料, 總體可分為 A,B,C 三種類型。該企業(yè)每年按 48 周安排生產(chǎn),需要提前制定 24 周的原 材料訂購和轉(zhuǎn)運(yùn)計劃,即根據(jù)產(chǎn)能要求確定需要訂購的原材料供應(yīng)商(稱為“供應(yīng)商”)和相應(yīng)每周的原材料訂購數(shù)量(稱為“訂貨量”),確定第三方物流公司(稱為“轉(zhuǎn)運(yùn) 商”)并委托其將供應(yīng)商每周的原材料供貨數(shù)量(稱為“供貨量”)轉(zhuǎn)運(yùn)到企業(yè)倉庫。
該企業(yè)每周的產(chǎn)能為 2.82 萬立方米,每立方米產(chǎn)品需消耗 A 類原材料 0.6 立方米, 或 B 類原材料 0.66 立方米,或 C 類原材料 0.72 立方米。由于原材料的特殊性,供應(yīng)商 不能保證嚴(yán)格按訂貨量供貨,實(shí)際供貨量可能多于或少于訂貨量。為了保證正常生產(chǎn)的 需要,該企業(yè)要盡可能保持不少于滿足兩周生產(chǎn)需求的原材料庫存量,為此該企業(yè)對供 應(yīng)商實(shí)際提供的原材料總是全部收購。 在實(shí)際轉(zhuǎn)運(yùn)過程中,原材料會有一定的損耗(損耗量占供貨量的百分比稱為“損耗率”),轉(zhuǎn)運(yùn)商實(shí)際運(yùn)送到企業(yè)倉庫的原材料數(shù)量稱為“接收量”。每家轉(zhuǎn)運(yùn)商的運(yùn)輸 能力為 6000 立方米/周。通常情況下,一家供應(yīng)商每周供應(yīng)的原材料盡量由一家轉(zhuǎn)運(yùn)商 運(yùn)輸。 原材料的采購成本直接影響到企業(yè)的生產(chǎn)效益,實(shí)際中 A 類和 B 類原材料的采購單 價分別比 C 類原材料高 20%和 10%。三類原材料運(yùn)輸和儲存的單位費(fèi)用相同。 附件 1 給出了該企業(yè)近 5 年 402 家原材料供應(yīng)商的訂貨量和供貨量數(shù)據(jù)。附件 2 給 出了 8 家轉(zhuǎn)運(yùn)商的運(yùn)輸損耗率數(shù)據(jù)。請你們團(tuán)隊(duì)結(jié)合實(shí)際情況,對相關(guān)數(shù)據(jù)進(jìn)行深入分 析,研究下列問題:
1.根據(jù)附件 1,對 402 家供應(yīng)商的供貨特征進(jìn)行量化分析,建立反映保障企業(yè)生產(chǎn) 重要性的數(shù)學(xué)模型,在此基礎(chǔ)上確定 50 家最重要的供應(yīng)商,并在論文中列表給出結(jié)果。
2.參考問題 1,該企業(yè)應(yīng)至少選擇多少家供應(yīng)商供應(yīng)原材料才可能滿足生產(chǎn)的需求? 針對這些供應(yīng)商,為該企業(yè)制定未來 24 周每周最經(jīng)濟(jì)的原材料訂購方案,并據(jù)此制定 損耗最少的轉(zhuǎn)運(yùn)方案。試對訂購方案和轉(zhuǎn)運(yùn)方案的實(shí)施效果進(jìn)行分析。
3.該企業(yè)為了壓縮生產(chǎn)成本,現(xiàn)計劃盡量多地采購 A 類和盡量少地采購 C 類原材 料,以減少轉(zhuǎn)運(yùn)及倉儲的成本,同時希望轉(zhuǎn)運(yùn)商的轉(zhuǎn)運(yùn)損耗率盡量少。請制定新的訂購 方案及轉(zhuǎn)運(yùn)方案,并分析方案的實(shí)施效果。
4.該企業(yè)通過技術(shù)改造已具備了提高產(chǎn)能的潛力。根據(jù)現(xiàn)有原材料的供應(yīng)商和轉(zhuǎn)運(yùn) 商的實(shí)際情況,確定該企業(yè)每周的產(chǎn)能可以提高多少,并給出未來 24 周的訂購和轉(zhuǎn)運(yùn)方案。
附件一:企業(yè)對402家供應(yīng)商過去240周的訂單量和供應(yīng)商的供應(yīng)量
附件二:8家轉(zhuǎn)運(yùn)商過去240周的轉(zhuǎn)運(yùn)損耗率
附件A:填寫未來24周的訂購方案(分三張表對應(yīng)三道題)
附件B:未來24周的的轉(zhuǎn)運(yùn)方案(分三張表對應(yīng)三道題)
————————————————
版權(quán)聲明:本文為CSDN博主「閃現(xiàn)插秧」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_59024303/article/details/120318032
我將借助該算法的是解決問題1----確定 50 家最重要的供應(yīng)商,根據(jù)算法對420家供應(yīng)商進(jìn)行評分篩選出評分靠前50家作為問題1的解決成果。代碼如下
import numpy as np import xlrd import pandas as pd# 從excel文件中讀取數(shù)據(jù) def read(file):wb = xlrd.open_workbook(filename=file) # 打開文件sheet = wb.sheet_by_index(0) # 通過索引獲取表格rows = sheet.nrows # 獲取行數(shù)all_content = [] # 存放讀取的數(shù)據(jù)for j in range(1, 4): # 取第1~第3列對的數(shù)據(jù)temp = []for i in range(1, rows):cell = sheet.cell_value(i, j) # 獲取數(shù)據(jù)temp.append(cell)all_content.append(temp) # 按列添加到結(jié)果集中temp = []return np.array(all_content)# 極小型指標(biāo) -> 極大型指標(biāo) def dataDirection_1(datas):return np.max(datas) - datas # 套公式# 中間型指標(biāo) -> 極大型指標(biāo) def dataDirection_2(datas, x_best):temp_datas = datas - x_bestM = np.max(abs(temp_datas))answer_datas = 1 - abs(datas - x_best) / M # 套公式return answer_datas# 正向化矩陣標(biāo)準(zhǔn)化 def temp2(datas):K = np.power(np.sum(pow(datas, 2), axis=1), 0.5)for i in range(0, K.size):for j in range(0, datas[i].size):datas[i, j] = datas[i, j] / K[i] # 套用矩陣標(biāo)準(zhǔn)化的公式return datas# 計算得分并歸一化 def temp3(answer2):list_max = np.array([np.max(answer2[0, :]), np.max(answer2[1, :]), np.max(answer2[2, :])]) # 獲取每一列的最大值list_min = np.array([np.min(answer2[0, :]), np.min(answer2[1, :]), np.min(answer2[2, :])]) # 獲取每一列的最小值max_list = [] # 存放第i個評價對象與最大值的距離min_list = [] # 存放第i個評價對象與最小值的距離answer_list = [] # 存放評價對象的未歸一化得分for k in range(0, np.size(answer2, axis=1)): # 遍歷每一列數(shù)據(jù)max_sum = 0min_sum = 0for q in range(0, 3): # 有三個指標(biāo)max_sum += np.power(answer2[q, k] - list_max[q], 2) # 按每一列計算Di+min_sum += np.power(answer2[q, k] - list_min[q], 2) # 按每一列計算Di-max_list.append(pow(max_sum, 0.5))min_list.append(pow(min_sum, 0.5))answer_list.append(min_list[k] / (min_list[k] + max_list[k])) # 套用計算得分的公式 Si = (Di-) / ((Di+) +(Di-))max_sum = 0min_sum = 0answer = np.array(answer_list) # 得分歸一化return (answer / np.sum(answer))def main():file = 'C:/Users/JayDen/Desktop/topsis算法各屬性數(shù)值及得分.xls'answer1 = read(file) # 讀取文件answer2 = []for i in range(0, 3): # 按照不同的列,根據(jù)不同的指標(biāo)轉(zhuǎn)換為極大型指標(biāo),因?yàn)橹挥兴牧衋nswer = Noneif (i == 0): # 本來就是極大型指標(biāo),不用轉(zhuǎn)換answer = answer1[0]elif (i == 1): # 中間型指標(biāo)answer = dataDirection_2(answer1[1], 1)elif (i == 2): # 極小型指標(biāo)answer = dataDirection_1(answer1[2])answer2.append(answer)answer2 = np.array(answer2) # 將list轉(zhuǎn)換為numpy數(shù)組answer3 = temp2(answer2) # 數(shù)組正向化answer4 = temp3(answer3) # 標(biāo)準(zhǔn)化處理去鋼data = pd.DataFrame(answer4) # 計算得分# 將得分輸出到excel表格中writer = pd.ExcelWriter('C:/Users/JayDen/Desktop/得分.xls') # 寫入Excel文件data.to_excel(writer, 'Sheet1', float_format='%.5f') # ‘page_1’是寫入excel的sheet名writer.save()writer.close() main()得分部分供應(yīng)商數(shù)據(jù)如下
?
?
總結(jié)
以上是生活随笔為你收集整理的基于python的Topsis(优劣解距离)算法的实现(附代码及举例说明)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 液晶面板价格持续上涨,中国面板企业迎来赶
- 下一篇: WPF学习开发客户端软件-任务助手(已上