【问题标题】:Adding attributes to a generated object?向生成的对象添加属性?
【发布时间】:2021-01-06 06:33:19
【问题描述】:

我已经定义了一个生成系统的泊松到达率的生成器。我希望每个生成的到达(客户)都有一个随机(x,y),它向系统显示到达客户的位置。即我想为每次到达都来自随机位置的系统生成泊松到达率。假设 x 在 50 范围内,y 在 60 范围内。

如何将其添加到以下代码中?

class Arrival(object):

    def __init__(self, stream_defin, referrer):
        self.service = stream_defin["service"]
        self.arrival_rate = stream_defin["rate"]
        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())

    def sim_arrival_generator(self):
            i = 0
            while True:
                interarrival = spstats.expon(scale=1/self.arrival_rate).rvs()
                yield self.env.timeout(interarrival)
                i+=1

【问题讨论】:

  • 剩下的代码在哪里?这里代表什么到来?如果interarrival 是您所说的到达,为什么不直接将其设为字典,将您正在计算的延迟分配给键delay,然后还为键xy 计算两个随机值表示随机位置的字典。
  • 感谢史蒂夫的回复。这是一个很长的代码,我试图在其中模拟公司的到达和服务。有没有更好的方法来模拟泊松到达系统并为每个到达系统的单个到达添加属性? ——
  • 比什么更好?你没有在这里显示任何东西。
  • 如果你想模拟泊松到达系统,每个到达都有一个 (x,y),你会怎么做?
  • 我仍然不确定你想要什么,但让我试试。由于很难将代码放入 cmets,因此我将继续输入答案。如果它不是您要查找的内容,我会继续处理或删除它...

标签: python simulation simpy


【解决方案1】:

您的代码引用了许多您未提供定义的对象和方法。这使得很难确切地知道你在寻找什么。另外,我不确定我什至理解你在概念上想要什么。但是,如果我对您的要求采取最简单的解释,我的建议如下:

我假设这一行当前正在创建一个“到达”,它被interarrival 变量引用:

interarrival = spstats.expon(scale=1/self.arrival_rate).rvs()

该值目前似乎是一个延迟值,因此连续延迟的模式涵盖了泊松分布模式。您希望在代码中的这一点上创建延迟以及由xy 坐标给出的随机位置,而不仅仅是一个时间值,并让它们一起代表一个“到达”。

我的建议是创建一个 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)
    }
}

在答案中进行大量编码工作并不是 S.O.真的是关于,但是你在无聊的时候抓住了我,我讨厌提供我没有实际运行过的代码,所以......

我冒昧地填写了您的代码,以便它能够真正运行并“做某事”,尽管它所做的只是在到达之间延迟并在每次到达时打印它的值。我假设你想看到一个实际的延迟,因为你打电话给self.env.timeout,因为你的发电机永远不会停止产生到达。如果没有延迟或一些耗时的处理,此代码将很快喷出数千个您无法阅读的到达。

我将您的课程从Arrival 重命名为Arrivals,因为其中的代码处理的是到达流,而不是单个到达,而且我想不出一个好方法来改变它而不做更多的改变。我尝试主要添加代码,并尽可能少地更改您提供的代码。考虑到这一切,这就是我想出的:

import scipy.stats as spstats
import random
import json
import time

class 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 += 1

class 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 arrival

def 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
    }
}
...

【讨论】:

  • 非常感谢史蒂夫的帮助,我真的很感激,如果我没有权限这样做,如果我不能放整个代码,我很抱歉。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多