Message 1 of 5
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
[ FlexSim 22.2.1 ]
Hi,
I am controlling FlexSim from a python script (via FlexSimPy) for optimization, which works well when running it in serial. I.e.., I can change the parameters, random seed (via parameters table), run, and get the performance measure.
However, I need to run FlexSim in parallel (i.e., run multiple experiments simultaneously - as the Experimenter does). How can I do this?
Thank you very much.
Following is my python scrip to optimize a FlexSim Model (in at serial way). I already use traditional parallelization libraries to parallelize the FlexSim execution, but it falls.
###Import libraries###
import sys
import pandas as pd
import openpyxl
import os
import numpy as np
from EGO_NEW_rev01 import EGO_New
from AMSO_Rev01 import AMSO
from scipy.stats import norm
from scipy.optimize import minimize
from math import exp
import matplotlib.pyplot as plt
from matplotlib import colors
from smt.sampling_methods import LHS
from smt.applications import EGO
from smt.applications.mixed_integer import MixedIntegerSurrogateModel
import warnings
warnings.filterwarnings("ignore")
from smt.applications.mixed_integer import (
FLOAT,
ORD,
INT,
ENUM,
MixedIntegerSamplingMethod,
cast_to_mixed_integer, unfold_with_enum_mask
)
#Import FlexSimPy Module
sys.path.insert(0, path1)
import FlexSimPy as fp
#Import parameters from Excel
solution_space = pd.read_excel("Dashboard.xlsx",sheet_name="Painel",usecols="B:E",keep_default_na=False,header=11)
general_parameters = pd.read_excel("Dashboard.xlsx",sheet_name="Painel",usecols="G:H",keep_default_na=False,header=11)
files_path = pd.read_excel("Dashboard.xlsx",sheet_name="Painel",usecols="j:k",keep_default_na=False,header=11)
general_parameters=general_parameters.set_index('Parameters')
files_path=files_path.set_index('Description')
#cleaning data
remove = solution_space.loc[(solution_space['Variables']=='')]
solution_space = solution_space.drop(remove.index)
#General Parameters
path1 = files_path.loc['FlexSimPy']['Path']
path2 = files_path.loc['FlexSim.exe']['Path']
replications = general_parameters.loc['Replications']['Value']
Response_variable=general_parameters.loc['Response Variable']['Value']
Stop_time= general_parameters.loc['Stop Time']['Value']
criterion=general_parameters.loc['EGO Criteria']['Value'] #'EI' or 'SBO' or 'LCB'
DOE_given = general_parameters.loc['DOE Given']['Value']
model_name= general_parameters.loc['Model Name']['Value']
ndoe = general_parameters.loc['Inicial Points']['Value']
n_iter = general_parameters.loc['Iterations']['Value']
Direction = general_parameters.loc['Direction']['Value']
#Variables Information
xlimits=solution_space[['Min','Max']].to_numpy()
xtypes = solution_space['Type'].tolist()
variaveis = solution_space['Variables'].tolist()
#The optimization direction
if Direction == "Max":
factor = -1
else:
factor = 1
print("start")
#Lauch FlexSim
scriptPath = os.path.dirname(os.path.realpath(__file__))
programDir = path2
controller = fp.launch(evaluationLicense=False,showGUI=False,programDir=programDir)
controller.open(scriptPath+"\\"+model_name)
def fun(x):
n,dim = np.atleast_2d(x).shape
y=[]
w=[]
for i in range(n):
xi = x[i,:]
for r in range(replications):
w.append(simulate(xi, r, controller, variaveis, Stop_time, Response_variable))
y.append(np.mean(w))
print(np.atleast_2d(y).T)
return np.atleast_2d(y).T
def simulate(x,r,controller,variaveis,Stop_time,Response_variable):
seed=r+1
print(x)
#mudar seed
instancia = controller
instancia.setParameter("Replication",seed)
for j in range(dim):
valor = int(x)
nome = variaveis
instancia.setParameter(nome,valor)
instancia.reset()
instancia.runToTime(Stop_time)
result = instancia.getPerformanceMeasure(Response_variable)
print(result*factor)
return result*factor
#number of points in the initial DOE
dim=len(variaveis)
#Create a inicial DOE (required in optimization algorithm)
path = scriptPath + "\\DOE.xlsx"
if DOE_given == 'False':
sampling = MixedIntegerSamplingMethod(xtypes, xlimits, LHS, criterion="ese")
xdoe = sampling(ndoe)
X = pd.DataFrame(xdoe)
ydoe=fun(xdoe)
Y = pd.DataFrame(ydoe)
with pd.ExcelWriter(path,mode="a", if_sheet_exists="replace",engine="openpyxl") as writer:
X.to_excel(writer, sheet_name="X",index=False)
Y.to_excel(writer, sheet_name="Y",index=False)
else:
X = pd.read_excel(path,sheet_name="X")
Y= pd.read_excel(path,sheet_name="Y")
xdoe= X.to_numpy()
ydoe = Y.to_numpy()
print("X: ",xdoe," Y: ",ydoe)
#Optimization call
ego = AMSO(n_iter=n_iter, criterion=criterion, xdoe=xdoe,ydoe=ydoe, xlimits=xlimits,xtypes=xtypes)
x_opt, y_opt, ind_best, x_data, y_data, R_square, pred, std = ego.optimize(fun=fun)
y_opt=y_opt*factor
print('Xopt for Model ', x_opt, y_opt, ' obtained using EGO criterion = ', criterion )
controller.close(scriptPath+"\\ABDI_1.fsm")
with pd.ExcelWriter(path, mode="a", if_sheet_exists="replace",engine="openpyxl") as writer:
pd.DataFrame(x_data).to_excel(writer, sheet_name="x_data",index=False)
pd.DataFrame(y_data).to_excel(writer, sheet_name="y_data",index=False)
pd.DataFrame(R_square).to_excel(writer, sheet_name="R2",index=False)
pd.DataFrame(pred).to_excel(writer, sheet_name="pred",index=False)
pd.DataFrame(std).to_excel(writer, sheet_name="std",index=False)
pd.DataFrame(x_opt).to_excel(writer, sheet_name="Result1",index=False,startcol=1,startrow=1)
pd.DataFrame(y_opt).to_excel(writer, sheet_name="Result2",index=False,startcol=1,startrow=3)
Solved! Go to Solution.
