亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

向生成的對象添加屬性?

向生成的對象添加屬性?

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 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號