【发布时间】:2021-03-19 02:58:43
【问题描述】:
output printing the len of arrival and service times我正在尝试使用 simpy 实现具有指数间到达和指数服务时间的 M/M/1 马尔可夫过程。代码运行良好,但我没有得到预期的结果。代码运行后到达时间的列表项数也小于服务时间的列表项数。
# make a markovian queue
# make a server as a resource
# make customers at random times
# record the customer arrival time
# customer gets the resource
# record when the customer got the resource
# serve the customers for a random time using resource
# save this random time as service time
# customer yields the resource and next is served
import statistics
import simpy
import random
arrival_time = []
service_time = []
mean_service = 2.0
mean_arrival = 1.0
num_servers = 1
class Markovian(object):
def __init__(self, env, num_servers):
self.env = env
self.servers = simpy.Resource(env, num_servers)
#self.action = env.process(self.run())
def server(self,packet ):
#timeout after random service time
t = random.expovariate(1.0/mean_service)
#service_time.append(t)
yield self.env.timeout(t)
def getting_service(env, packet, markovian):
# new packet arrives in the system
arrival_time = env.now
with markovian.servers.request() as req:
yield req
yield env.process(markovian.server(packet))
service_time.append(env.now - arrival_time)
def run_markovian(env,num_servers):
markovian = Markovian(env,num_servers)
packet = 0
#generate new packets
while True:
t = random.expovariate(1.0/mean_arrival)
arrival_time.append(t)
yield env.timeout(t)
packet +=1
env.process(Markovian.getting_service(env,packet,markovian))
def get_average_service_time(service_time):
average_service_time = statistics.mean(service_time)
return average_service_time
def main():
random.seed(42)
env= simpy.Environment()
env.process(Markovian.run_markovian(env,num_servers))
env.run(until = 50)
print(Markovian.get_average_service_time(service_time))
print (arrival_time)
print (service_time)
if __name__ == "__main__":
main()
【问题讨论】:
-
“我没有得到预期的结果。”以什么方式?例如,如果您期望获得理论稳态均值(请参阅homepages.cae.wisc.edu/~ie642/content/Techniques/Warmup/… 以获取解释),那么您的期望很可能偏离了。
-
您需要 Simpy 吗?我问是因为single server queue can be simulated very easily with just a loop。
-
不需要 Simpy。但我想好好学习如何使用它,因为我可以将它用于 M/M/K 服务器以及可以打开和关闭客户的服务器。此外,我没有得到预期的结果,正如您从这个屏幕截图中看到的那样,到达时间的长度大于服务时间的长度。
-
您是否尝试通过搜索“simpy m/m/1 示例”将您的实现与在线提供的众多实现之一进行比较?
标签: queue simulation simpy markov-models