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