1 回答

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
? ? }
}
...
添加回答
舉報