gpt4 book ai didi

python - Simpy:分配新资源时同时释放资源

转载 作者:行者123 更新时间:2023-12-01 08:54:24 25 4
gpt4 key购买 nike

我简化了我正在尝试建模的问题的一个版本,我使用 Simpy 来描述旅行者沿路径的移动。

路径由 Node() 对象的集合表示,其中每个节点都包含一个 Simpy.Resource。每个节点都通过 connected_to 属性连接到路径中的下一个节点。在示例代码中,我创建了一个包含 10 个节点的列表,其中列表中的每个节点都连接到列表中的前一个节点。

当旅行者(由Occupier()对象表示)被实例化时,它被分配节点的资源。然后,旅行者沿着节点移动,仅在下一个节点可用时才迈出一步。我的目标是让旅行者同时被分配其目的地节点释放其先前所在的节点。

import simpy


class Node(object):
def __init__(self, env):
self.env = env
self.resource = simpy.Resource(self.env)
self.up_connection = None
self.travel_delay = 5


class Occupier(object):
def __init__(self, env):
self.env = env
self.location = None
self.destination = None
self.requests = []

def travel(self, instantiation_loc):
self.requests.append(instantiation_loc.resource.request())
yield(self.requests[-1])

self.location = instantiation_loc
self.destination = instantiation_loc.up_connection
yield self.env.timeout(self.location.travel_delay)
node_occupancy(nodes)

while self.destination.up_connection != None:
self.requests.append(self.destination.resource.request())
yield self.requests[-1]

self.location.resource.release(self.requests[0])
self.requests.pop(0)
self.location = self.destination
self.destination = self.location.up_connection

yield self.env.timeout(self.location.travel_delay)
node_occupancy(nodes)


def node_occupancy(nodes):
print([node.resource.count for node in nodes])


env = simpy.Environment()

nodes = [Node(env) for i in range(10)]
for i in range(len(nodes) - 1):
nodes[i].up_connection = nodes[i + 1]

env.process(Occupier(env).travel(nodes[0]))

env.run()

如果我与一名旅行者一起运行上述代码,它似乎工作正常,给出以下输出:

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

但是,如果实例化第二个旅行者,您可以看到在某些时间点,一个旅行者占用了两个资源,而它本应只占用一个资源:

env.process(Occupier(env).travel(nodes[3]))
env.process(Occupier(env).travel(nodes[0]))

对应的输出:

[1, 0, 0, 1, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 1, 1, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 1, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 1, 1, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 1, 1, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 1, 1, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 1, 1, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0]

对于我的模拟来说,重要的是旅行者只占用一种资源,因为节点的属性会根据此频繁修改。

有什么方法可以防止旅行者从不占用多个资源的这种行为吗?即当旅行者被分配新资源时,资源被同时释放

最佳答案

事实上,您的模型运行正确。

尝试向函数node_ocupacy添加当前执行时间和一些标记来识别模拟的当前阶段:

def node_occupancy(nodes, node, case):
print(env.now, node, case, [node.resource.count for node in nodes])

另外,我做了一些更改只是为了看到更好的模拟日志:

def travel(self, instantiation_loc, loc):
self.requests.append(instantiation_loc.resource.request())
yield(self.requests[-1])

self.location = instantiation_loc
self.destination = instantiation_loc.up_connection
yield self.env.timeout(self.location.travel_delay)
node_occupancy(nodes, loc, 1)

while self.destination.up_connection != None:
self.requests.append(self.destination.resource.request())
node_occupancy(nodes, loc, 2)

yield self.requests[-1]
node_occupancy(nodes, loc, 3)
self.location.resource.release(self.requests[0])
node_occupancy(nodes, loc, 4)
self.requests.pop(0)
self.location = self.destination
self.destination = self.location.up_connection

yield self.env.timeout(self.location.travel_delay)
node_occupancy(nodes, loc, 5)

现在,使用当前节点的标记运行模拟:

env.process(Occupier(env).travel(nodes[3], 3))
env.process(Occupier(env).travel(nodes[0], 0))

查看结果,您会注意到事件(请求/释放)同时发生,并且同时资源时间占用始终= 0(即:阶段“3”和“4”之间的时间,对于相同的实体将始终为 0):

5 3 1 [1, 0, 0, 1, 0, 0, 0, 0, 0, 0]
5 3 2 [1, 0, 0, 1, 1, 0, 0, 0, 0, 0]
5 0 1 [1, 0, 0, 1, 1, 0, 0, 0, 0, 0]
5 0 2 [1, 1, 0, 1, 1, 0, 0, 0, 0, 0]
5 3 3 [1, 1, 0, 1, 1, 0, 0, 0, 0, 0]
5 3 4 [1, 1, 0, 0, 1, 0, 0, 0, 0, 0]
5 0 3 [1, 1, 0, 0, 1, 0, 0, 0, 0, 0]
5 0 4 [0, 1, 0, 0, 1, 0, 0, 0, 0, 0]

关于python - Simpy:分配新资源时同时释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52874679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com