【问题标题】:Method to automate simulation runs自动化模拟运行的方法
【发布时间】:2016-04-15 18:46:31
【问题描述】:

我在 Python 中创建了一个离散事件模拟,它接受一组当前保存在数据库表中的输入,并产生也存储在数据库 (SQLite) 中的输出。我已经实现了使用给定的一组输入运行多个复制的能力(因为模拟中有一些随机性)。我现在希望能够使用多组输入运行模拟,而不必在每次运行后手动更改输入。但是我不确定实现这一目标的最佳方法。

我目前的想法是有一个脚本可以创建一个 JSON 文件,其中包含每次运行的输入。例如:

输入数据表(为解释而极度简化):

id name     input 1 input 2
1  Entity 1   67      red
2  Entity 2   54      blue

JSON 示例(再次简化以匹配上述输入):

{"simulation inputs":[      
    {"run 1":
        "replications": 100,
        "entity 1": "name of entity"
             {
              "input 1": 67,
              "input 2": "red"   
              }
        "entity 2": "a different entity of same class with different values"
             {
              "input 1": 54,
              "input 2": "blue"   
              }

    },
    {"run 2":
        "replications": 100,
        "entity 1": "name of entity"
             {
              "input 1": 69,
              "input 2": "red"   
              }
        "entity 2": "a different entity of same class with different values"
             {
              "input 1": 54,
              "input 2": "blue"   
              }
    },
    {"run 3":
        "replications": 100,
        "entity 1": "name of entity"
             {
              "input 1": 71,
              "input 2": "red"   
              }
        "entity 2": "a different entity of same class with different values"
             {
              "input 1": 54,
              "input 2": "blue"   
              }
    },
]}

根据上面的示例,其中包含三个运行的信息,其中每个运行调整一个输入 - 实体 1 的输入 1。在实际情况下,输入可能会有大量变化1 在配置文件中为每个运行条目。 Python 程序将使用定义的值作为特定运行的输入来遍历 JSON 文件中的列表。输出存储在数据库中。每个实体都是具有不同输入值的同一类的实例。

以上是明智的做法吗?如果没有,还有什么其他方法?如果是,是否有此类功能或类似功能的实现,我可以在任何地方用作起点?

我已经进行了很好的搜索,但可能由于我不熟悉配置文件术语,未能找到合适的答案。

注意:经过编辑以更好地表示将使用的输入数据的类型。

非常感谢。

【问题讨论】:

  • 您使用哪个数据库来存储您的输入?您可以从表中获取所有行作为简单字典并对其进行迭代以运行所有模拟。
  • 我正在使用 SQLite。我举的例子很简单。我对其进行了编辑,以更好地反映将变化的输入数据,并包含一些输入数据的示例。
  • 没有通用的解决方案,编写自定义脚本来修改输入集并整理输出是特定于平台和模型的任务。

标签: python json simulation configuration-files ini


【解决方案1】:

我实现了 JSON 文件技术,效果很好,所以我想我会分享答案。

创建一个 JSON 文件。在可能的情况下,顶层是标识“运行”的键 - 本质上是输入的唯一组合。该值是另一个字典,其中包含用于设置模拟的所有值,例如复制次数 - 因为 DES 需要多个代表。它只是使用 Python 中内置的 JSON 功能加载。

with open(file_name) as data_file:
input_data = json.load(data_file)  # dict of the whole file

所以在这个阶段我们有 input_data ,它只是整个文件的字典。通过提取顶级键并循环遍历每个键,您可以将每个运行输入顺序传递到模拟中。对于每次运行,您只传递需要传递的输入集,而不是整个字典。

list_of_runs = sorted(list(input_data.keys()), key=int) 
for run in list_of_runs:

replications = input_data[run]['replications']

reps = 0

下一个循环每次使用相同的输入集运行模拟定义的次数。

for reps in range(replications):

    current_run = initialize.Run(input_data[run])
    '''some other code here'''

    env.run(until=end)

    reps += 1

在我的实际代码中,“运行”是一个类,在该类中定义了其他类,每个类都传递了它们需要的原始 JSON 文件的部分。这意味着当一个类需要访问一个值时,如果只需要查看已传递的字典,并且所有这些字典都会在代码运行每次运行时自动更新。

【讨论】:

    【解决方案2】:

    如果您有一个输入表,其中每一行都引用一组用于单次运行的输入,您可以执行以下操作。

    import sqlite3
    
    db_path = "C:/.../mydatabase.db"
    connection = sqlite3.connect(db_path)
    cursor = connection.cursor()
    
    #get parameters from table
    for row in cursor.execute('SELECT * FROM input_table'):
        param1 = row[0]
        param2 = row[1]
        ...
        go_for_simulation(param1, param2,...)
    

    循环中的每个row 变量都是一个包含所有参数的元组。 我希望这种方法可以帮助你。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多