我试图模拟一个制造工厂,其中鼓首先连接到一台有5个插槽的机器(建模为商店,因为每个插槽具有不同的属性),然后进入第二台有两个插槽的机器(建模为资源,因为插槽之间没有差异)
代码如下:
class Facility(object):
"""
Each facility has a single classifier which splits a given RMI drum into multiple PFI drums
based at a rate on their sizes and the site
"""
def __init__(self, env, site):
self.env = env
self.site = "Shenzhen"
self.name = "Facility"
self.rate_hr = 3420 #lb/hr
## general inventory data
self.num_pfi_drums = 6
self.pfi_directory = dict.fromkeys(range(1,self.num_pfi_drums+1),0)
self.num_pfi_machines = 2
## pfi drum capacity data
self.pfi_capacity = 9500
## setting up machines of the facility
self.classifiers = simpy.Store(env, capacity=5)
self.pfi_machines = simpy.Resource(env, self.num_pfi_machines)
## availableSlot event, must initially be successful
self.availableSlot = env.event()
self.availableSlot.succeed()
def getSizeSplits(self, num_jb, color):
## reads data from csv file
## does a bit of formatting
size_rates = [6.84,16.53,7.41,10.83,15.39]
return size_rates
def issueDrum(self):
## wait for available slot
yield self.availableSlot
self.availableSlot = self.env.event()
## parse directory to get ``drumNumber`` for the next free drum
freeDrum = None;
for k, v in self.pfi_directory.items():
if(v==0):
freeDrum = k
break
if (freeDrum != None):
self.pfi_directory[freeDrum] = 1
return freeDrum
def fillClassification(self, time):
yield env.timeout(time)
def prefinish(self, drumNumber):
yield env.timeout(10000)
def run(self, num_jb, color):
## get the size rates
size_rates = np.array(self.getSizeSplits(num_jb, color))
## calculate size times
size_times = self.pfi_capacity/size_rates
size_times = np.ceil(size_times)
for i in range(5):
self.classifiers.put({'id': 'S'+str(i+1), 'rate': size_rates[i]})
while (True):
freeDrum = yield self.env.process(self.issueDrum())
env.process(pfi_drum(env=self.env,
drumNumber=freeDrum,
facility=self))
类初始值设定项进行了一些设置。函数只返回一个python列表。issueDrum()
函数的任务是确保分类器机器中有一个空闲插槽,然后从未使用的目录返回一个鼓。{
在run()
函数中,我屈服于issueDrum()
,然后将pfi_drum()
作为进程调用。以下是pfi_drum()
过程:
def pfi_drum(env, drumNumber, facility):
"""
The PFI_drum process (each drum has a ``drumNumber`` carrying jellybeans of a certain ``size``)
arrives at the prefinish_machines (``pf``) and requests flavoring.
It then starts the flavoring process, waits for its turn, and gets flavored.
"""
## requesting a classifier slot
clf = yield facility.classifiers.get()
print('PFI_Drum %d was attached to the classifier to get goods of Size %s at %.2f.' % (drumNumber, clf['id'], env.now))
## check the available classifier slots
remainingSlots = len(facility.classifiers.items)
if (remainingSlots>0):
facility.availableSlot.succeed()
## getting filled
time = facility.pfi_capacity/float(clf['rate'])
yield env.process(facility.fillClassification(time))
## disengaging from classifier
yield facility.classifiers.put(clf)
print('PFI_Drum %d disengaged from classifier at time %.2f.' % (drumNumber, env.now))
facility.availableSlot.succeed()
## requesting a prefinish machine
with facility.pfi_machines.request() as request:
yield request
print('PFI_Drum %d enters prefinish operation at %.2f.' % (drumNumber, env.now))
facility.pfi_directory[drumNumber] = 0
yield env.process(facility.prefinish(drumNumber))
我的问题是,在某一点上,我的鼓被放入预精加工过程的队列中(这是非常缓慢的)。因此,如果资源同时使用了两个插槽,则它们将在队列中保留很长时间。但是,第一台机器不应继续运行,因为如果它脱离一个滚筒,则没有其他滚筒代替它
因此,我想学习如何暂停一个进程,更具体地说是一个超时,以便分类器在意识到根据目录没有空闲鼓时停止。这意味着没有鼓应该脱离。然后,我想在鼓再次可用时恢复分类器
目前没有回答
相关问题 更多 >
编程相关推荐