我在Python中创建了一个离散事件模拟,它接受了当前保存在数据库表中的一组输入,并生成输出,该输出也存储在数据库(SQLite)中。我已经实现了在给定的输入集中运行多个复制的能力(因为模拟中有一些随机性)。现在,我希望能够使用多组输入运行模拟,而不必在每次运行后手动更改输入。然而,我不知道实现这一目标的最佳途径。
我目前的想法是创建一个脚本,该脚本可以创建一个包含每次运行的输入的JSON文件。例如:
输入数据表(极为简化以供解释):
id name input 1 input 2
1 Entity 1 67 red
2 Entity 2 54 blueJSON示例(再次简化为与上述输入匹配):
{"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进行了调整,在实际情况下,输入中可能有大量的变化,其中每个配置文件中都有一个运行条目。Python程序将使用定义的值作为该特定运行的输入,在JSON文件中运行列表。存储在数据库中的输出。每个实体都是同一个类的实例,具有不同的输入值。
上述做法是否明智?如果没有,还会有什么其他方法呢?如果是的话,是否有这样的功能的实现,或者类似的,任何我已经可以作为起点的地方?
我已经有了一个很好的搜索,但由于我不熟悉配置文件的术语,没有能够找到一个合适的答案。
注意:编辑以更好地表示将要使用的输入数据的类型。
非常感谢。
发布于 2016-01-27 14:37:57
我实现了JSON文件技术,它运行得很好,所以我想我会分享答案。
创建了一个JSON文件。在可能的情况下,顶层是标识"run“的关键--本质上是输入的独特组合。该值是另一个字典,它包含用于设置模拟的所有值,例如复制的数量,因为DES需要多个reps。它只是使用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在我的实际代码中,"Run“是一个类,在该类中定义了其他类,每个类都被传递给它们所需的原始JSON文件的一部分。这意味着当一个类需要访问一个值时,如果只需要在已传递的字典中查找,并且所有这些字典都会在代码在每次运行过程中运行时自动更新。
发布于 2016-01-12 13:37:54
如果您有一个输入表,其中每行引用一次运行的一组输入,则可以执行如下操作。
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变量都是包含所有参数的元组。我希望这种方法能对你有所帮助。
https://stackoverflow.com/questions/34721879
复制相似问题