2016-01-11 2 views
3

Я создал в 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, используя определенные значения в качестве входов для этого конкретного запуска. Выходы сохраняются в базе данных. Каждый из объектов является экземпляром того же класса с разными значениями для входов.

Является ли вышеупомянутый разумным подход? Если нет каких-либо других подходов? Если да, то есть реализация такой функциональности или схожей, где бы я ни могла использовать в качестве отправной точки?

У меня был хороший поиск, но, возможно, поскольку я не знаком с терминологией конфигурационного файла, не смог найти подходящего ответа.

примечание: отредактировано, чтобы лучше представлять тип входных данных, которые будут использоваться.

Большое спасибо.

+0

Какая БД вы используете для хранения ваших входов? Вы можете получить все строки из своей таблицы в виде простого словаря и перебрать его для запуска всех симуляций. –

+0

Я использую SQLite. Пример, который я дал, был довольно прост. Я отредактировал его, чтобы лучше отражать входные данные, которые будут меняться, а также включить пример некоторых входных данных. – Pete

+0

Для этого нет общего решения, написания пользовательских сценариев для перебора наборов входных данных и сопоставления вывода - задача, ориентированная на платформу и модель. – pjs

ответ

1

Я реализовал технику файла JSON, и он работает очень хорошо, поэтому я решил поделиться с вами ответом.

Создан файл JSON. В этом случае верхний уровень - это ключ, который идентифицирует «прогон» - по существу уникальное сочетание входов. Значение - это еще один словарь, содержащий все значения, используемые для настройки симуляции, такие как количество повторений - поскольку DES требует нескольких повторений. Он просто загружается с использованием встроенных функций JSON в Python.

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 они нуждаются. Это означает, что класс должен получить доступ к значению, если требуется только просмотр в словаре, который был передан, и все эти словари обновляются автоматически, когда код проходит через каждый из прогонов.

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 переменной в цикле является кортеж, который содержит все параметры. Надеюсь, этот подход может вам помочь.

Смежные вопросы