在設(shè)施規(guī)劃中搏恤,求解從至表從而得到最優(yōu)的廠房排序是必不可少的一環(huán)
故利用python寫了一段求解從至表的程序违寿。對于不同的廠房數(shù)量與不同的零件加工程序,只需要修改對應(yīng)內(nèi)容即可熟空,此程序通用性比較強陨界。
這是本程序?qū)?yīng)案例的相關(guān)數(shù)據(jù)
本案例對應(yīng)的從至表.jpg
帶入到程序求解
代碼如下:
#計算從至表
import numpy as np
import pandas as pd
#————————————————————————————修改的內(nèi)容————————————————————————————————#
#原材料庫A 鑄造車間B 熱處理車間C 機加工車間D 精密車間E 標準件半成品庫F
#倉庫組成的序列
obj=pd.Series(['A','B','C','D','E','F'],index=[1,2,3,4,5,6])
#print(obj)
#零件組成的字典。零件名:權(quán)重痛阻,[加工順序]
parts={'s1':[9,['A','D','C','F']],
's2':[90,['A','B','D','E','F']],
's3':[3,['A','B','D','F']],
's4':[3,['A','D','E','F']],
's5':[27,['A','D','E','F']],
's6':[700,['A','B','D','E','F']],
's7':[60,['A','D','C','E','F']],
's8':[56,['A','D','E','F']],
's9':[32,['A','D','F']],
's10':[1,['A','D','C','E','F']],
's11':[120,['A','C','D','C','E','F']],
's12':[60,['A','C','D','C','E','F']],
's13':[80,['A','D','C','F']]
}
#—————————————————————————場地數(shù)組的全排列——————————————————————————————#
m=len(obj) #加工場地的個數(shù)
obj_sort=[i for i in range(1, m+1)] #需要排列的列表
def AllRange(listx,p,q): #遞歸生成全排列列表sorts
if p == q:
all_sorts.append(list(listx))
else:
for i in range(p,q):
listx[i],listx[p]=listx[p],listx[i]
AllRange(listx,p+1,q)
listx[i],listx[p]=listx[p],listx[i]
all_sorts=[] #所有全排列可能的列表
AllRange(obj_sort,0,len(obj_sort))
#—————————————————————————計算流量最小時的排列——————————————————————————#
min_flow=100000000 #最小流量,根據(jù)情況設(shè)置一個比較大的值
best_sort=[] #最小流量下的排序
#計算一個零件在某排序下的流量
def one_part_folw(info,now_range):
p_flow=0 #不加權(quán)重的流量
n=len(info[1])
for i in range(n-1): #工序A對應(yīng)的數(shù)字1腮敌,在新排序中的先后位置
index_f=obj[obj.values==info[1][i]].index #工序?qū)?yīng)的標簽
index_l=obj[obj.values==info[1][i+1]].index
f=now_range.index(index_f)
l=now_range.index(index_l)
if f > l:
p_flow += (f-l)*2
else:
p_flow += (l-f)
total_flow=p_flow*info[0]
return total_flow
#找出所有序列流量最小值及對應(yīng)序列
for all_sort in all_sorts[:]:
now_flow=0 #本次排列的流量
for part in parts.values():
part_flow=one_part_folw(part,all_sort) #每個零件的流量
now_flow += part_flow
if now_flow <= min_flow:
min_flow=now_flow
best_sort=all_sort[:]
#—————————————————————————————輸出結(jié)果——————————————————————————————————#
print('min flow:')
print(min_flow)
print('best sort:')
for i in range(m):
print(obj[best_sort[i]])
可以求得最優(yōu)廠房排序為
最優(yōu)排序及流量.PNG
ps:本程序迭代了所有廠房排序可能情況阱当,從中求出最優(yōu)解。為了提高程序的通用性糜工,加之用python書寫弊添,所以運行速度稍微慢了些。
有不足之處捌木,還請見諒油坝。