Python數據分析之鎖具裝箱問題
問題重述
某廠生產一種彈子鎖,其槽數高度可以用1到6中取5個來表示。其限制條件是:至少在5個中有3個不同的數;相鄰槽的高度相差不能為5。在實際試驗中,發現若二鎖對應5個槽的高度中有4個相同,另一個差1則可能互開,否則,不可能互開。如果60個鎖具裝一箱,求一批鎖的多少及裝箱數,並要求提出一種方案,使團體顧客減少或不再抱怨,並對於所提出的方案,求出其最大無互開的箱數,並衡量原來隨機裝箱時,顧客抱怨互開的程度。
問題分析
- 鎖具個數首先把鎖具及裝箱問題抽象成數學概念,以5個數字的一個符合條件的組合或組成一個列表數據結構來代表一個相應的鎖具,例如[1,2,3,4,5]代表一個鎖具。利用排除法的思想,通過Python語言,把問題分為所有可能的組合A6^5,存儲到列表結構中;再通過集合的概念,剔除列表中相同槽高,只保留一個,如果個數小於3,則不符合要求,進行剔除;最後,剔除減去相鄰差為5的列表。
- 裝箱方案設計
歸類法:把一批鎖具分成兩類或按其指數之和分為8~27共20類,其中組合,[1,1,1,2,3]為最小,其數字和為8;[6,6,6,5,4]為最大,其數字和為27;所以共有(27-8+1)=20個數組來表示,在裝箱時可依:
d9→d11→…→d27→d 8→d10→d12→… →d27或d8→d10→…→d26→d9→ …→d26二者類似,其中di表示5槽數字和為i的所有組合。
事實上,對於一數組來說,其各位數之和相同,所以其本身顯然不可能有互開現象。對於其它情況可用下法來鑒別:利用Python中的Numpy第三方庫進行列表向量化運算,兩個列表相減,再進行求和,絕對值為1則二者可能互開;否則不可能互開,記數字和為i的數組di,另一組數據為d_i^,則有以下結論:d_i^∩d_((i+1))≠?d_i^∩d_((i))=?d_i^∩d_((i+j))=?可知:
d_26^∩d_27≠?d_8^∩d_27≠?而對數字和全為偶或全為奇的數組間一定不互開,所以以上設計符合要求。 - 顧客抱怨定量度量對於原來隨機裝箱時,求其顧客的不滿意程度。定量表示時,我們認為可用下列量來表示:
A:一定量中出現的互開鎖具數;
B:一定量中可能互開的概率;C:用計算機模擬模擬隨機裝箱過程,隨機抽點進行計算。建模與求解
建模與求解
1.鎖具個數
利用排除法的思想,通過Python語言,逐步剔除不符合要求的鎖具,可得有5880個鎖具,每60個一箱,可裝98箱,代碼如下:
lists = [1,2,3,4,5,6]nlist_alls = []nfor list_1 in lists:n for list_2 in lists:n for list_3 in lists:n for list_4 in lists:n for list_5 in lists:n list_alls.append([list_1,list_2,list_3,list_4,list_5])nprint(len(list_alls))nlist_deletes_1 = []nfor list_all in list_alls:n counts = list(set(list_all))n if len(counts) <= 2:n passn else:n list_deletes_1.append(list_all)nprint(len(list_deletes_1))nlist_deletes_2 = []nfor list_all_1 in list_deletes_1:n if abs(list_all_1[0] - list_all_1[1]) == 5:n passn elif abs(list_all_1[1] - list_all_1[2]) == 5:n passn elif abs(list_all_1[2] - list_all_1[3]) == 5:n passn elif abs(list_all_1[3] - list_all_1[4]) == 5:n passn else:n list_deletes_2.append(list_all_1)nprint(len(list_deletes_2))n
2.裝箱方案設計
首先證明d9→d11→…→d27→d 8→d10→d12→… →d27無互開現象。設其中某列表為[a,b,c,d,e](a+b+c+d+e=i為奇數),則(a±1)bcde,a(b±1)cde,ab(c±1)de,abc(d±1)e,abcd(e±1),當篩選其含相鄰差為5或有位為0的不合條件項外,則可知
a+b+c+d+e±1=i(±1)
則其為偶數,與d9→d27中任一元素(組合)都不可能相同,對於d8→d10→…→d26類似。
由此可證明49箱為最大無互開箱數,也就是奇偶分箱方案。
3.顧客抱怨定量度量
利用Python計算所有可能互開對為22778,平均互開係數α=0.001317,對於一箱互開個數約2.33,二箱互開個數約9.42,代碼如下:
import randomni = 0nxiangjian_list = []nhukai_counts = []nlist_randoms = random.sample(list_deletes_2,60)nfor list_randoms_1 in list_randoms:ni = i+1nfor list_randoms_2 in list_randoms[i:]:n list_1 = [list_randoms_1[0] - list_randoms_2[0],list_randoms_1[1] - list_randoms_2[1],list_randoms_1[2] - list_randoms_2[2],list_randoms_1[3] - list_randoms_2[3],list_randoms_1[4] - list_randoms_2[4]]n xiangjian_list.append(list_1)nfor list_2 in xiangjian_list:nif (list_2.count(0) == 4):nif (list_2.count(1) == 1 | list_2.count(1) == 1):n hukai_counts.append(a)nprint(len(hukai_counts))n
作者:羅羅攀 Python愛好者社區專欄作者,請勿轉載,謝謝。
簡書主頁:羅羅攀 - 簡書博客專欄:羅羅攀的博客配套視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享 公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。
推薦閱讀: