我正在尝试模拟客户去银行。我想要打印队列的平均长度,以及请求开始时间的每个值对和[time of request or release, length of queue]对
我知道simpy3中没有监视器类,所以我尝试使用下面的示例here,我留下了要转换的文件中的相关代码,并尝试转换它。simpy2和python2
from SimPy.Simulation import *
import random as rnd
interarrival_time = 10.0
service_time = 8.0
class CustomerGenerator( Process ):
def produce( self, b ):
while True:
c = Customer( b )
c.start( c.doit() )
yield hold, self, rnd.expovariate(1.0/interarrival_time)
class Customer( Process ):
def __init__( self, resource ):
Process.__init__( self )
self.bank = resource
def doit( self ):
yield request, self, self.bank
yield hold, self, self.bank.servicetime()
yield release, self, self.bank
class Bank( Resource ):
def servicetime( self ):
return rnd.expovariate(1.0/service_time)
initialize()
bank = Bank( capacity=1, monitored=True, monitorType=Monitor )
src = CustomerGenerator()
activate( src, src.produce( bank ) )
simulate( until=100)
print bank.waitMon.mean()
print
for evt in bank.waitMon:
print evt[0], evt[1]simpy3和python3
from simpy import *
import random as rnd
interarrival_time = 10.0
service_time = 8.0
def produce( env, b ):
while True:
customer(env,b)
yield env.timeout(rnd.expovariate(1.0/interarrival_time))
def customer(env,bank):
yield bank.request()
yield env.timeout(bank.servicetime())
bank.release()
class MonitoredResource(Resource):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.data = []
self.num_requests = 0
def mean(self):
try:
mean = 0
for el in self.data:
mean += el[1]
mean /= self.num_requests
return mean
except ZeroDivisionError:
pass
def request(self, *args, **kwargs):
self.data.append((self._env.now, len(self.queue)))
self.num_requests += 1
return super().request(*args, **kwargs)
def release(self, *args, **kwargs):
self.data.append((self._env.now, len(self.queue)))
return super().release(*args, **kwargs)
class Bank(MonitoredResource):
def servicetime( self ):
return rnd.expovariate(1.0/service_time)
env = Environment()
bank = Bank(env,capacity=1)
src = env.process(produce(env,bank))
env.run( until=100)
print(bank.mean())
print()
for evt in bank.data:
print(evt[0], evt[1])如何才能使我的SimPy3模拟器的输出类似于SimPy2模拟器,而不是只打印一个?
发布于 2017-02-26 10:01:31
似乎我只需要告诉release()哪个request()正在被释放,以获得所需的输出。并将客户作为一个进程来运行。
from simpy import *
import random as rnd
interarrival_time = 10.0
service_time = 8.0
def produce( env, bank ):
print("generating")
while True:
env.process(customer(env,bank))
t = rnd.expovariate(1.0/interarrival_time)
yield env.timeout(t)
def customer(env,bank):
req = bank.request()
yield req
yield env.timeout(bank.servicetime())
bank.release(req)
class MonitoredResource(Resource):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.data = []
self.num_requests = 0
def mean(self):
if(self.num_requests > 0):
mean = 0
for el in self.data:
mean += el[1]
mean /= self.num_requests
return mean
def request(self, *args, **kwargs):
self.data.append((self._env.now, len(self.queue)))
self.num_requests += 1
return super().request(*args, **kwargs)
def release(self, *args, **kwargs):
self.data.append((self._env.now, len(self.queue)))
return super().release(*args, **kwargs)
class Bank(MonitoredResource):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def servicetime( self ):
return rnd.expovariate(1.0/service_time)
env = Environment()
bank = Bank(env,capacity=1)
#bank = Bank( capacity=1, monitored=True, monitorType=Monitor )
src = env.process(produce(env,bank))
env.run(until=100)
print(bank.mean())
print()
for evt in bank.data:
print(evt[0], evt[1])https://stackoverflow.com/questions/42463342
复制相似问题