慕标5832272
您的代码引用了许多您没有提供定义的对象和方法。这使得你很难准确地知道你在寻找什么。另外,我不确定我是否理解你在概念上想要什么。但如果我对你的要求采取最简单的解释,我的建议是:我假设这条线当前正在创建一个“到达”,它由interarrival变量引用:interarrival = spstats.expon(scale=1/self.arrival_rate).rvs()该值当前似乎是延迟值,使得连续延迟的模式覆盖泊松分布模式。此时,您希望在代码中创建延迟以及由x和y坐标给出的随机位置,而不仅仅是时间值,并将它们一起表示“到达”。我建议创建一个 Python 字典对象来表示每次到达。您可以这样做:interarrival = { 'delay': spstats.expon(scale=1 / self.arrival_rate).rvs(), 'position': { 'x': random.randint(self.min_x, self.max_x), 'y': random.randint(self.min_y, self.max_y) }}我采取了很多自由措施并填写了您的代码,以便它实际上可以运行并“做某事”,尽管它所做的只是在到达之间延迟并打印每个到达的值。我假设您希望看到实际的延迟,因为您的呼叫self.env.timeout和 因为您的发电机永远不会停止生成到达。如果没有延迟或一些耗时的处理,此代码将很快产生数千个您无法读取的到达信息。我将您的类从 重命名Arrival为Arrivals,因为其中的代码处理到达流,而不是单个到达,并且我想不出在不进行更多更改的情况下更改它的好方法。我尝试主要添加代码,并尽可能少地更改您提供的代码。考虑到这一切,我得出以下结论:import scipy.stats as spstatsimport randomimport jsonimport timeclass Arrivals(object): def __init__(self, stream_defin, referrer): self.service = stream_defin["service"] self.arrival_rate = stream_defin["rate"] self.min_x, self.max_x = stream_defin["min_x"], stream_defin["max_x"] self.min_y, self.max_y = stream_defin["min_y"], stream_defin["max_y"] self.referrer = referrer def sim_init(self, env, sim_stats): self.sim_stats = sim_stats self.env = env self.env.process(self.sim_arrival_generator()) return self def sim_arrival_generator(self): i = 0 while True: interarrival = { 'index': i, 'delay': spstats.expon(scale=1 / self.arrival_rate).rvs(), 'position': { 'x': random.randint(self.min_x, self.max_x), 'y': random.randint(self.min_y, self.max_y) } } yield self.env.timeout(interarrival) i += 1class Env(): def process(self, arrivals): for arrival in arrivals: # Do whatever needs to be done with each arrival print('Processing arrival: ') print(json.dumps(arrival, indent=4)) def timeout(self, arrival): # Delay the arrival by its delay time before delivering for processing print("Delaying %2.2f seconds..." % (arrival['delay'])) time.sleep(arrival['delay']) return arrivaldef main(): stream_defin = { 'service': 'service', 'rate': 0.5, 'min_x': 5, 'max_x': 50, 'min_y': 10, 'max_y': 60 } stats = [] # a place to collect results, I assume Arrivals(stream_defin, 'referrer').sim_init(Env(), stats)main()这个东西会永远运行,所以当你想停止它时,你必须按 CTRL-C 退出它。iterations添加配置值来限制迭代次数很容易。process()您可以将其添加到生成器本身,或者在达到指定的迭代计数时中断该方法。示例结果(如上所述,输出中存在实际延迟):Delaying 5.39 seconds...Processing arrival: { "index": 0, "delay": 5.394974068076859, "position": { "x": 34, "y": 29 }}Delaying 1.51 seconds...Processing arrival: { "index": 1, "delay": 1.5095025601339542, "position": { "x": 24, "y": 24 }}Delaying 1.48 seconds...Processing arrival: { "index": 2, "delay": 1.4840036046166114, "position": { "x": 28, "y": 57 }}Delaying 4.09 seconds...Processing arrival: { "index": 3, "delay": 4.08649062133332, "position": { "x": 37, "y": 14 }}...