Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从FilterStore获取多个项目[Python][Simpy]_Python_Simulation_Simpy - Fatal编程技术网

从FilterStore获取多个项目[Python][Simpy]

从FilterStore获取多个项目[Python][Simpy],python,simulation,simpy,Python,Simulation,Simpy,我正在使用Python和进行模拟。在模拟中,作业由资源处理。某些作业需要单个资源,其他作业需要多个资源。我想一次检索(获取)多个资源,因此优先考虑需要较少资源的工作 资源由一个表中的项表示 下面的示例解决方案使用for循环并保留资源。我正在寻找一种解决方案,它不保留资源,而是将资源分配给所有资源都可用的作业。下面的示例已简化,但我正在寻找一种解决方案,它允许我同时生成大量资源,类似于 我遇到了一个创建FilterStore对象的子类的方法,但我不知道该怎么做。我还遇到了一个实例,其中使用了sto

我正在使用Python和进行模拟。在模拟中,作业由资源处理。某些作业需要单个资源,其他作业需要多个资源。我想一次检索(获取)多个资源,因此优先考虑需要较少资源的工作

资源由一个表中的项表示

下面的示例解决方案使用for循环并保留资源。我正在寻找一种解决方案,它不保留资源,而是将资源分配给所有资源都可用的作业。下面的示例已简化,但我正在寻找一种解决方案,它允许我同时生成大量资源,类似于

我遇到了一个创建FilterStore对象的子类的方法,但我不知道该怎么做。我还遇到了一个实例,其中使用了store对象的子类。有没有一种方法可以在不创建子类的情况下实现预期的行为?如果没有,如何为FilterStore创建子类

代码:

输出:

job: 0 requires resources: [2] at time: 0
job: 0 retrieved resources: [2] at time: 0
job: 1 requires resources: [0] at time: 1
job: 1 retrieved resources: [0] at time: 1
job: 2 requires resources: [2, 0] at time: 2
job: 3 requires resources: [2] at time: 3
job: 4 requires resources: [2, 0] at time: 4
job: 0 released resources: [2] completed at time: 4
job: 1 released resources: [0] completed at time: 5
job: 2 retrieved resources: [2, 0] at time: 5
job: 3 retrieved resources: [2] at time: 9
job: 2 released resources: [2, 0] completed at time: 9
job: 3 released resources: [2] completed at time: 13
job: 4 retrieved resources: [2, 0] at time: 13
job: 4 released resources: [2, 0] completed at time: 17
job: 0 requires resources: [2, 0] at time: 0
job: 0 retrieved resources: [2, 0] at time: 0
job: 1 requires resources: [1] at time: 1
job: 1 retrieved resources: [1] at time: 1
job: 2 requires resources: [2, 0] at time: 2
job: 3 requires resources: [2] at time: 3
job: 0 released resources: [2, 0] completed at time: 4
job: 4 requires resources: [2, 0] at time: 4
job: 3 retrieved resources: [2] at time: 4
job: 1 released resources: [1] completed at time: 5
job: 3 released resources: [2] completed at time: 8
job: 2 retrieved resources: [2, 0] at time: 8
job: 2 released resources: [2, 0] completed at time: 12
job: 4 retrieved resources: [2, 0] at time: 12
job: 4 released resources: [2, 0] completed at time: 16
在本例中,这意味着作业3应优先于作业2。在时间4,作业3所需的所有资源都可用。但是,作业2在时间2保留了一个资源(2),并在作业3之前启动

作业顺序:

current sequence: [0, 1, 2, 3, 4]
desired sequence: [0, 1, 3, 2, 4]
current sequence: [0, 1, 2, 3, 4]
desired sequence: [0, 1, 3, 2, 4]
current sequence: [0, 1, 3, 2, 4]
desired sequence: [0, 1, 2, 3, 4]
更新:

下面的代码采用了稍微不同的方法。它可以避开过滤器商店。相反,它使用多个存储,并在字典中使用一个id。该id可以在两个存储中找到正确的资源。为了当时从两个不同的存储中提取两个资源,我使用了以下语句:“yield env.all_of”。然而,顺序并不像预期的那样。资源似乎被保留了下来

Code:

import simpy
import random
import collections

def source(env, jobs):
    count = 0
    for i in jobs:
        env.process(job(env, count, i))
        count += 1
        yield env.timeout(1)

def job(env, count, resources_required):
    resources_used = []
    #resources_required = random.sample(range(0, 5), random.randint(1, 5))
    # the for loop yield (reserves) resources even if not all resources are available
    print('job: {} requires resources: {} at time: {}'.format(count, resources_required, env.now))
    resources_needed = []
    for i in resources_required:
        for j in resources:
            if i == j['id']:
                resources_needed.append(j['store'].get())
    yield env.all_of(resources_needed)
    print('job: {} retrieved resources: {} at time: {}'.format(count, resources_required, env.now))
    yield env.timeout(4)
    for i in resources_needed:
        i.resource.put(i)
    print('job: {} released resources: {} completed at time: {}'.format(count, resources_required, env.now))
    sequence.append(count)

env = simpy.Environment()
resources = []
capacity = 1
for i in range(5):
    resource = collections.OrderedDict()
    store = simpy.Store(env, capacity=capacity)
    for j in range(capacity):
        item = {'resource_id': i,
                'item_id': j
                }
        store.put(item)
    resource = {'id': i,
                'store': store
    }

    resources.append(resource)

jobs = [
    [2],
    [0],
    [2, 0],
    [2],
    [2, 0]
]

sequence = []
random.seed(1234567890)
env.process(source(env, jobs))
env.run(until=50)
print('...')
print('current sequence: {}'.format(sequence))
print('desired sequence: [0, 1, 3, 2, 4]')
结果:

job: 0 requires resources: [2] at time: 0
job: 0 retrieved resources: [2] at time: 0
job: 1 requires resources: [0] at time: 1
job: 1 retrieved resources: [0] at time: 1
job: 2 requires resources: [2, 0] at time: 2
job: 3 requires resources: [2] at time: 3
job: 0 released resources: [2] completed at time: 4
job: 4 requires resources: [2, 0] at time: 4
job: 1 released resources: [0] completed at time: 5
job: 2 retrieved resources: [2, 0] at time: 5
job: 2 released resources: [2, 0] completed at time: 9
job: 3 retrieved resources: [2] at time: 9
job: 3 released resources: [2] completed at time: 13
job: 4 retrieved resources: [2, 0] at time: 13
job: 4 released resources: [2, 0] completed at time: 17
作业顺序:

current sequence: [0, 1, 2, 3, 4]
desired sequence: [0, 1, 3, 2, 4]
current sequence: [0, 1, 2, 3, 4]
desired sequence: [0, 1, 3, 2, 4]
current sequence: [0, 1, 3, 2, 4]
desired sequence: [0, 1, 2, 3, 4]
更新2:

下面的代码再次采用了稍微不同的方法。现在,使用PriorityResource代替商店。资源再次包装在dictionary对象中。通过对需要较少资源的作业进行优先级排序,可以获得所需的顺序(使用上面的作业列表)。然而,现在较短的工作总是被优先考虑,这不是我的本意。所有资源都可用的作业应优先于某些资源可用的作业。为了反映这个问题,我改变了下面的工作列表。如果有可能根据“未来”的时间来确定作业的优先级,那么该问题就有可能得到解决,因为此时作业的所有资源都可用。是否可以确定资源何时可用

代码:

输出:

job: 0 requires resources: [2] at time: 0
job: 0 retrieved resources: [2] at time: 0
job: 1 requires resources: [0] at time: 1
job: 1 retrieved resources: [0] at time: 1
job: 2 requires resources: [2, 0] at time: 2
job: 3 requires resources: [2] at time: 3
job: 4 requires resources: [2, 0] at time: 4
job: 0 released resources: [2] completed at time: 4
job: 1 released resources: [0] completed at time: 5
job: 2 retrieved resources: [2, 0] at time: 5
job: 3 retrieved resources: [2] at time: 9
job: 2 released resources: [2, 0] completed at time: 9
job: 3 released resources: [2] completed at time: 13
job: 4 retrieved resources: [2, 0] at time: 13
job: 4 released resources: [2, 0] completed at time: 17
job: 0 requires resources: [2, 0] at time: 0
job: 0 retrieved resources: [2, 0] at time: 0
job: 1 requires resources: [1] at time: 1
job: 1 retrieved resources: [1] at time: 1
job: 2 requires resources: [2, 0] at time: 2
job: 3 requires resources: [2] at time: 3
job: 0 released resources: [2, 0] completed at time: 4
job: 4 requires resources: [2, 0] at time: 4
job: 3 retrieved resources: [2] at time: 4
job: 1 released resources: [1] completed at time: 5
job: 3 released resources: [2] completed at time: 8
job: 2 retrieved resources: [2, 0] at time: 8
job: 2 released resources: [2, 0] completed at time: 12
job: 4 retrieved resources: [2, 0] at time: 12
job: 4 released resources: [2, 0] completed at time: 16
作业顺序:

current sequence: [0, 1, 2, 3, 4]
desired sequence: [0, 1, 3, 2, 4]
current sequence: [0, 1, 2, 3, 4]
desired sequence: [0, 1, 3, 2, 4]
current sequence: [0, 1, 3, 2, 4]
desired sequence: [0, 1, 2, 3, 4]

你是否有优先权?由于有足够的资源,如果您将一个请求1个资源的作业的优先级设置为高于另一个请求2个资源但首先提交的作业的优先级,这将是不公平的。您是否正在实施优先级回填?由于有足够的资源,如果您将请求1个资源的作业的优先级设置为高于请求2个资源但先提交的作业的优先级,则这是不公平的。