为了账号安全,请及时绑定邮箱和手机立即绑定

向生成的对象添加属性?

向生成的对象添加属性?

ibeautiful 2023-08-22 17:18:15
我定义了一个生成器,它生成系统的泊松到达率。我希望每个生成的到达(客户)都有一个随机的(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
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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


我假设这条线当前正在创建一个“到达”,它由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 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

    }

}

...


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信