import gym
from flexsim_env import FlexSimEnv
from stable_baselines3.common.env_checker import check_env
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_envdefmain():print("Initializing FlexSim environment...")# Create a FlexSim OpenAI Gym Environmentenv = FlexSimEnv(flexsimPath ="C:/Program Files/FlexSim 2022/program/flexsim.exe",modelPath ="E:/劉一陽資料/Flexsim/demo/ChangeoverTimesRL.fsm",verbose =False,visible =False)check_env(env)# Check that an environment follows Gym API.# Training a baselines3 PPO model in the environmentmodel = PPO("MlpPolicy", env, verbose=1)print("Training model...")model.learn(total_timesteps=50000)# save the modelprint("Saving model...")model.save("ChangeoverTimesModel")input("Waiting for input to do some test runs...")# Run test episodes using the trained modelfor i inrange(4):env.seed(i)observation = env.reset()env.render()done =Falserewards =[]whilenot done:action, _states = model.predict(observation)observation, reward, done, info = env.step(action)env.render()rewards.append(reward)if done:cumulative_reward =sum(rewards)print("Reward: ", cumulative_reward,"\n")env._release_flexsim()input("Waiting for input to close FlexSim...")env.close()if __name__ =="__main__":main()import json
from stable_baselines3 import PPO
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
import numpy as npclassFlexSimInferenceServer(BaseHTTPRequestHandler):defdo_GET(self):params = parse_qs(urlparse(self.path).query)self._handle_reply(params)defdo_POST(self):content_length =int(self.headers['Content-Length'])body = self.rfile.read(content_length)params = parse_qs(body)self._handle_reply(params)def_handle_reply(self, params):iflen(params):observation =[]ifb'observation'in params.keys():observationBytes = params[b'observation'][0]observation = np.array(json.loads(observationBytes))elif'observation'in params.keys():observationBytes = params['observation'][0]observation = np.array(json.loads(observationBytes))ifisinstance(observation,list):observation = np.array(observation)action, _states = FlexSimInferenceServer.model.predict(observation)self.send_response(200)self.send_header("Content-type","application/json")self.end_headers()self.wfile.write(bytes(json.dumps(action, cls=NumpyEncoder),"utf-8"))returnself.send_response(200)self.send_header("Content-type","text/html")self.end_headers()self.wfile.write(bytes("","utf-8"))classNumpyEncoder(json.JSONEncoder):defdefault(self, obj):ifisinstance(obj, np.integer):returnint(obj)elifisinstance(obj, np.floating):returnfloat(obj)elifisinstance(obj, np.ndarray):return obj.tolist()return json.JSONEncoder.default(self, obj)defmain():print("Loading model...")model = PPO.load("ChangeoverTimesModel.zip")FlexSimInferenceServer.model = model# Create server objectprint("Starting server...")hostName ="localhost"serverPort =8890webServer = HTTPServer((hostName, serverPort), FlexSimInferenceServer)print("Server started http://%s:%s"%(hostName, serverPort))# Start the web servertry:webServer.serve_forever()except KeyboardInterrupt:passwebServer.server_close()print("Server stopped.")if __name__ =="__main__":main()