首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SimPy2到SimPy3的转换

从SimPy2到SimPy3的转换
EN

Stack Overflow用户
提问于 2017-02-26 08:30:10
回答 1查看 164关注 0票数 1

我正在尝试模拟客户去银行。我想要打印队列的平均长度,以及请求开始时间的每个值对和[time of request or release, length of queue]

我知道simpy3中没有监视器类,所以我尝试使用下面的示例here,我留下了要转换的文件中的相关代码,并尝试转换它。simpy2和python2

代码语言:javascript
复制
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

代码语言:javascript
复制
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模拟器,而不是只打印一个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-26 10:01:31

似乎我只需要告诉release()哪个request()正在被释放,以获得所需的输出。并将客户作为一个进程来运行。

代码语言:javascript
复制
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])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42463342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档