Ресурс 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))

Но это не работает, и я не могу найти лучший способ взглянуть на уступки одному из вариантов.

Что было бы лучшим способом смоделировать этот сценарий. Для полноты вот что я ищу:

  1. Заказать любую из 3 машин
  2. Запросить конкретную машину
  3. У каждой машины отслеживать свою историю
  4. У каждой машины характеристики будут разные. т.е. на фолах быстрее но работает поначалу быстрее
  5. Обнаружение и планирование очистки на основе производительности или индикатора

Это то, что я пока имею в своей последней версии, пытаясь смоделировать каждый из них как отдельный ресурс.

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()
Другие вопросы по тегам