Ресурс SimPy 3, где каждый имеет разные характеристики
Я пытаюсь смоделировать ситуацию, когда у нас есть 5 машин, которые встречаются в ситуации 1 -> 3 -> 1. то есть 3 в середине работают параллельно, чтобы уменьшить эффективное время, которое они занимают.
Я могу легко смоделировать это, создав ресурс SimPy со значением три, как это:
simpy.Resource(env, capacity=3)
Однако в моей ситуации каждый из трех ресурсов работает немного по-разному, и иногда я хочу иметь возможность использовать любой из них (когда я работаю) или забронировать конкретный (когда я хочу убрать). По сути, три машины медленно загрязняются с разной скоростью и работают медленнее, я хочу иметь возможность имитировать их, а также позволять производить чистку, когда человек становится слишком грязным.
Я попробовал несколько способов имитации этого, но каждый раз сталкивался с проблемами и проблемами.
Во-первых, когда он забронировал ресурс, он также забронировал один из трех глобальных флагов (A,B,C) и сам флаг, чтобы указать, какую машину он использует. Это работает, но это не чисто и делает действительно трудным понять, что происходит с огромными, если заявления везде.
Второй - смоделировать его как три отдельных ресурса, а затем попытаться подождать и запросить одну из трех машин с чем-то вроде:
reqA = A.res.request()
reqB = B.res.request()
reqC = C.res.request()
unitnumber = yield reqA | reqB | reqC
yield env.process(batch_op(env, name, machineA, machineB, machineC, unitnumber))
Но это не работает, и я не могу найти лучший способ взглянуть на уступки одному из вариантов.
Что было бы лучшим способом смоделировать этот сценарий. Для полноты вот что я ищу:
- Заказать любую из 3 машин
- Запросить конкретную машину
- У каждой машины отслеживать свою историю
- У каждой машины характеристики будут разные. т.е. на фолах быстрее но работает поначалу быстрее
- Обнаружение и планирование очистки на основе производительности или индикатора
Это то, что я пока имею в своей последней версии, пытаясь смоделировать каждый из них как отдельный ресурс.
class Machine(object):
def __init__(self, env, cycletime, cleantime, k1foul, k2foul):
self.env = env
self.res = simpy.Resource(env, 1)
self.cycletime = cycletime
self.cleantime = cleantime
self.k1foul = k1foul
self.k2foul = k2foul
self.batchessinceclean = 0
def operate(self):
self.cycletime = self.cycletime + self.k2foul * np.log(self.k1foul * self.batchessinceclean + 1)
self.batchessinceclean += 1
yield self.env.timeout(self.cycletime)
def clean(self):
print('%s begin cleaning at %s' % (self.env.now))
self.batchessinceclean = 0
yield env.timeout(self.cleantime)
print('%s finished cleaning at %s' % (self.env.now))
1 ответ
Вы должны попробовать (Фильтр) Магазин:
import simpy
def user(machine):
m = yield machine.get()
print(m)
yield machine.put(m)
m = yield machine.get(lambda m: m['id'] == 1)
print(m)
yield machine.put(m)
m = yield machine.get(lambda m: m['health'] > 98)
print(m)
yield machine.put(m)
env = simpy.Environment()
machine = simpy.FilterStore(env, 3)
machine.put({'id': 0, 'health': 100})
machine.put({'id': 1, 'health': 95})
machine.put({'id': 2, 'health': 97.2})
env.process(user(machine))
env.run()