- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个仿真模型来模拟具有 3 个柜台的银行。我希望有一个客户队列,如果有任何一个柜台可用,它将为该柜台服务一段时间。每个柜台都是自己的简单资源(我不能做一个容量为 3 的资源),我需要知道哪个柜台为客户服务。我在实现时遇到了问题。
我找到了这篇文章,似乎是关于同样的问题,但仍然不知 Prop 体的实现http://comments.gmane.org/gmane.comp.python.simpy.user/1754
我假设我需要一个 yield simpy.AnyOf(env, list_of_resources) 来请求第一个可用的计数器,但我不知道如何正确设置它,以及如果多个资源同时可用时间,我想要一些方法来检查这个,以便我可以选择哪个柜台更适合客户去。
我正在运行 python 版本 2.7,simpy 版本 3.0.4
编辑添加代码,显示我正在尝试做什么以及它现在如何不起作用。
import simpy
import random
LENGTH_SIM = 200.0
class Customer(object):
def __init__(self, arrive_time, num):
self.arrive_time = arrive_time
self.start_service_time = -1.0
self.finish_service_time = -1.0
self.served_by = -1.0
self.num = num
def print_attributes(self):
format_string = "#%3d Arrive: %6.1f Start Service: %6.1f "\
+ " End Service: %6.1f" + " Served By: %3d"
print format_string %(self.num, self.arrive_time,
self.start_service_time,
self.finish_service_time, self.served_by)
class Counter(object):
def __init__(self, number):
self.number = number
self.name = "Counter " + str(number)
self.start_times = []
self.end_times = []
class Bank(object):
def __init__(self, env, num_counters):
self.counters = [Counter(x+1) for x in range(num_counters)]
self.num_counters = num_counters
self.counters_resources = [simpy.Resource(env, capacity=1)
for x in range(num_counters)]
def generate_customers(env, customers):
count = 1
while 1:
wait_time = random.randint(8, 12)
yield env.timeout(wait_time)
customers.append(Customer(env.now, count))
print "Generated Customer: ", count
count += 1
def select_counter(env, bank):
'''choose a counter for the customer'''
for x in range(len(bank.counters)):
if bank.counters_resources[len(bank.counters) - 1 - x].count == 0:
print "Counter Selected: ", len(bank.counters) - 1 - x
print bank.counters[len(bank.counters) - 1 - x].number
print bank.counters_resources[len(bank.counters) - 1 - x].users
return len(bank.counters) - 1 - x
return -2.0
def gen_service_time():
return random.random() * 20.0 + 21.0
def handle_customer(env, bank, customer, customers, num_process):
'''handles customer'''
print "Process ", num_process, " started at:", env.now
counter = select_counter(env, bank)
print "Process ", num_process, " after counter select:", env.now
if counter != -2.0:
with bank.counters_resources[counter].request() as req:
yield req
print "Process ", num_process, "Time", env.now, "In if"
bank.counters[counter].start_times.append(env.now)
service_time = gen_service_time()
customer.start_service_time = env.now
customer.finish_service_time = env.now + service_time
bank.counters[counter].end_times.append(env.now + service_time)
customer.served_by = counter + 1
yield env.timeout(service_time)
else:
reqs = []
for x in range(len(bank.counters)):
reqs.append(bank.counters_resources[x].request())
counter_used = yield simpy.events.AnyOf(env, reqs)
for x in range(len(reqs)):
if counter_used.keys()[0] != reqs[x]:
print "True"
bank.counters_resources[x].release(reqs[x])
print "Process ", num_process, "Time", env.now, "In else"
bank.counters[0].start_times.append(env.now)
service_time = gen_service_time()
customer.start_service_time = env.now
customer.finish_service_time = env.now + service_time
bank.counters[0].end_times.append(env.now + service_time)
customer.served_by = 1
yield env.timeout(service_time)
for x in range(len(reqs)):
## if counter_used.keys()[0] == reqs[x]:
if 1:
bank.counters_resources[x].release(reqs[x])
def run_bank(env, bank, customers):
while 1:
min_time = -1.0
min_customer = -1.0
for x in xrange(len(customers)):
if customers[x].arrive_time < min_time or min_time == -1.0:
if customers[x].arrive_time > env.now:
min_time = customers[x].arrive_time
min_customer = x
else:
continue
if min_time == -1.0:
yield env.timeout(LENGTH_SIM - env.now)
yield env.timeout(min_time - env.now)
print "Calling Process: ", min_customer, "At time:", env.now
env.process(handle_customer(env,bank,customers[min_customer],customers,
min_customer + 1))
def run_sim():
env = simpy.Environment()
customers = []
env.process(generate_customers(env, customers))
env.run(until=LENGTH_SIM)
env2 = simpy.Environment()
bank = Bank(env2, 3)
env2.process(run_bank(env2, bank, customers))
env2.run(until = LENGTH_SIM)
for x in range(len(customers)):
customers[x].print_attributes()
if __name__ == '__main__':
run_sim()
最佳答案
如果你真的不能使用容量为 3 的普通 Resource,也许 Store 可以帮助你。 Store 存储您可以请求的计数器对象。每个计数器都有自己的身份,例如,可以跟踪其使用次数。客户完成后,必须将柜台放回商店:
import simpy
class Counter:
usages = 0
def customer(env, counters):
counter = yield counters.get()
yield env.timeout(1)
counter.usages += 1
yield counters.put(counter)
env = simpy.Environment()
counters = simpy.Store(env, capacity=3)
counters.items = [Counter() for i in range(counters.capacity)]
for i in range(10):
env.process(customer(env, counters))
env.run()
for counter in counters.items:
print(counter.usages)
关于python - 在 simpy python 中请求第一个可用资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25046946/
我简化了我正在尝试建模的问题的一个版本,我使用 Simpy 来描述旅行者沿路径的移动。 路径由 Node() 对象的集合表示,其中每个节点都包含一个 Simpy.Resource。每个节点都通过 co
我开始学习SimPy DES框架。我想实现一个模拟,其中请求在不同时间到达服务器。有不同类型的请求,每一种请求都会向服务器加载特定的内存/CPU 负载。例如,某些请求通常使用 10% 的 CPU 和
在模拟中,我希望能够在调用另一个释放资源的函数之前在一个函数中请求资源。当我使用下面所示的方法时,它不起作用并且出现错误。提前致谢。 (在函数 1 中): req = resource.request
我已经在线搜索了许多与 TypeError 相关的答案,并多次扫描了我的代码,但我似乎看不到我缺少的第三个参数是什么。我正在使用 Python 2.7 和 Simpy 3 我的代码如下: im
我想加快 SimPy 模拟速度(如果可能的话),但我不确定插入计时器的最佳方法,甚至看看什么花费了很长时间。 有办法做到这一点吗? 最佳答案 我建议使用runsnakerun (或者我猜是py3x中的
我正在尝试中断一组简单的嵌套进程。从下面的代码看来,只有第一层进程被中断事件中断,并且我似乎无法找到一种方法从外部进程外部引用另一个进程中定义的进程以中断它们。下面是一个最小的可重现示例: impor
我需要帮助在 SimPy 中模拟火车系统(如地铁系统),问题是我的“模拟”老师要我使用 Python + SimPy 而我不知道如何使用它,经过一周阅读 SimPy 我设法理解了银行的例子,这很容易,
我想创建一个带有回调的计时器,该回调可以使用 SimPy 中断或重置。如果中断,我不想执行回调,如果重置,我希望计时器以与 env.now 相同的延迟重新启动。最初,这似乎是一件简单的事情,只需使用
我是 Simpy 的新手,我在弄清楚如何为具有复杂依赖关系的进程调度程序建模时遇到了麻烦。 我的问题的高级摘要: 我有一个仓库,通过入口接收装有元素的箱子。这些箱子被放入队列中等待处理。 每个箱子都有
我目前正在尝试使用 SimPy 为服务计数器建模,但在使用 Yield 来保存资源时遇到了困难。在 Counter.arrive() 函数下,如果存在“yield req”行,则整个函数将跳过执行(至
我正在尝试创建一个类实例的副本,我可以在不影响该类的原始实例的情况下模拟它。我尝试过使用 copy.copy,但遇到了这个问题: system.simulate(until=100) print(sy
假设我有 3 项任务: def task1(): if check_if_theres_work_to_do(): #just checking takes 2us do_w
我想模拟两个过程: (1) 一个简单的实时消息广播器(确定性的)和 (2) 另一个进程从外部实时接收数据(从 Redis 数据库),然后将自己的消息与 (1) 广播的最后一条消息的值进行比较 我一直在
我已经为此搜索了其他问题/答案并实现了所有内容,但我仍然无法访问该对象的值。这是我正在使用的代码: function apply_voucher(voucher) { var dates =
我正在使用 python 2.6 + Simpy 进行关于地铁系统的模拟。这是我的代码: import sys import random from math import* from math im
我正在尝试模拟一种情况,即我们有 5 台机器出现 1 -> 3 -> 1 的情况。即中间的3个并行运行,以减少它们所花费的有效时间。 我可以通过创建一个值为 3 的 SimPy 资源来轻松模拟这一点,
我正在使用 Python(主要是 SimPy 包,但它与我认为的问题无关),对一些系统进行建模并运行模拟。为此,我需要生成服从分布的随机数。到目前为止,我通过导入随机数(例如来自随机导入 *)并使用
我想创建一个仿真模型来模拟具有 3 个柜台的银行。我希望有一个客户队列,如果有任何一个柜台可用,它将为该柜台服务一段时间。每个柜台都是自己的简单资源(我不能做一个容量为 3 的资源),我需要知道哪个柜
我正在尝试使用 Simpy 对围绕城市网格移动的汽车的某些行为进行建模。但是,我在概念上无法理解何时使用类似 的东西 yield self.env.timeout(delay) 或 yield env
我在构建模拟时遇到了问题,我不确定如何解决这些问题。本次模拟的思路如下: 系统中一共有10台机器。当模拟开始时,其中 6 台机器将开始工作,而其他 4 台机器将作为备件保留在库存中。 要求系统中任意时
我是一名优秀的程序员,十分优秀!