自动化模拟运行的方法

时间:2016-01-11 12:43:20

标签: python json simulation configuration-files ini

我在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文件中的列表中运行。输出存储在数据库中。每个实体都是同一个类的实例,具有不同的输入值。

以上是一种明智的做法吗?如果没有其他方法可以吗?如果是,那么在任何地方我都可以使用这种功能或类似的实现作为起点吗?

我进行了很好的搜索,但是,由于我不熟悉配置文件术语,因此无法找到合适的答案。

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

我实现了JSON文件技术并且它运行良好,所以我想我会分享答案。

创建了一个JSON文件。在可能的情况下,顶级是识别"运行"的关键。 - 基本上是一个独特的输入组合。该值是另一个包含用于设置模拟的所有值的字典,例如复制的数量 - 因为DES需要多个rep。它只是使用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文件的一部分。这意味着当一个类需要访问一个值时,如果只需要查看已经传递的字典,并且所有这些字典在代码运行通过每个运行时自动更新。

答案 1 :(得分:0)

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

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变量都是一个包含所有参数的元组。 我希望这种方法可以帮到你。