向生成的对象添加属性?
Adding attributes to a generated object?
我已经定义了一个生成系统的泊松到达率的生成器。我希望每个生成的到达(客户)都有一个随机的(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
变量引用:
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)
}
}
在答案中做一堆编码工作不是 S.O。真的是,但是你在无聊的时候抓住了我,我讨厌提供我实际上没有的代码 运行,所以...
我很随意地填写了你的代码,这样它实际上 运行 并“做某事”,尽管它所做的只是在到达之间延迟并打印每次到达的值通过。我假设你想看到一个实际的延迟,因为你调用 self.env.timeout
并且你的生成器永远不会停止生成到达。如果没有延迟或一些耗时的处理,这段代码会迅速喷出成千上万你无法阅读的到达信息。
我将你的 class 从 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
}
}
...
我已经定义了一个生成系统的泊松到达率的生成器。我希望每个生成的到达(客户)都有一个随机的(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
变量引用:
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)
}
}
在答案中做一堆编码工作不是 S.O。真的是,但是你在无聊的时候抓住了我,我讨厌提供我实际上没有的代码 运行,所以...
我很随意地填写了你的代码,这样它实际上 运行 并“做某事”,尽管它所做的只是在到达之间延迟并打印每次到达的值通过。我假设你想看到一个实际的延迟,因为你调用 self.env.timeout
并且你的生成器永远不会停止生成到达。如果没有延迟或一些耗时的处理,这段代码会迅速喷出成千上万你无法阅读的到达信息。
我将你的 class 从 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
}
}
...