1 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的代碼引用了許多您沒有提供定義的對(duì)象和方法。這使得你很難準(zhǔn)確地知道你在尋找什么。另外,我不確定我是否理解你在概念上想要什么。但如果我對(duì)你的要求采取最簡(jiǎn)單的解釋,我的建議是:
我假設(shè)這條線當(dāng)前正在創(chuàng)建一個(gè)“到達(dá)”,它由interarrival變量引用:
interarrival = spstats.expon(scale=1/self.arrival_rate).rvs()
該值當(dāng)前似乎是延遲值,使得連續(xù)延遲的模式覆蓋泊松分布模式。此時(shí),您希望在代碼中創(chuàng)建延遲以及由x和y坐標(biāo)給出的隨機(jī)位置,而不僅僅是時(shí)間值,并將它們一起表示“到達(dá)”。
我建議創(chuàng)建一個(gè) Python 字典對(duì)象來表示每次到達(dá)。您可以這樣做:
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)
? ? }
}
我采取了很多自由措施并填寫了您的代碼,以便它實(shí)際上可以運(yùn)行并“做某事”,盡管它所做的只是在到達(dá)之間延遲并打印每個(gè)到達(dá)的值。我假設(shè)您希望看到實(shí)際的延遲,因?yàn)槟暮艚衧elf.env.timeout和 因?yàn)槟陌l(fā)電機(jī)永遠(yuǎn)不會(huì)停止生成到達(dá)。如果沒有延遲或一些耗時(shí)的處理,此代碼將很快產(chǎn)生數(shù)千個(gè)您無法讀取的到達(dá)信息。
我將您的類從 重命名Arrival為Arrivals,因?yàn)槠渲械拇a處理到達(dá)流,而不是單個(gè)到達(dá),并且我想不出在不進(jìn)行更多更改的情況下更改它的好方法。我嘗試主要添加代碼,并盡可能少地更改您提供的代碼??紤]到這一切,我得出以下結(jié)論:
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()
這個(gè)東西會(huì)永遠(yuǎn)運(yùn)行,所以當(dāng)你想停止它時(shí),你必須按 CTRL-C 退出它。iterations添加配置值來限制迭代次數(shù)很容易。process()您可以將其添加到生成器本身,或者在達(dá)到指定的迭代計(jì)數(shù)時(shí)中斷該方法。
示例結(jié)果(如上所述,輸出中存在實(shí)際延遲):
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
? ? }
}
...
添加回答
舉報(bào)