flexsim--第二周
生活随笔
收集整理的這篇文章主要介紹了
flexsim--第二周
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本周說明及總結(jié):
本周我繼續(xù)學(xué)習(xí)了Flexsim的相關(guān)基礎(chǔ)操作,同時,我本周主要探索了Flexsim與MySQL的互通,以及Flexsim在強化學(xué)習(xí)和調(diào)度策略優(yōu)化上的內(nèi)容。
主要目的是探索一下Flexsim在編程方面的自由度以及可以與我們目前的系統(tǒng)交互的程度。
目前明確的信息有:
目前的學(xué)習(xí)和研究方向:
Flexsim與Python連接樣例:
import gym import os import subprocess import socket import json from gym import error, spaces, utils from gym.utils import seeding import numpy as npclass FlexSimEnv(gym.Env):metadata = {'render.modes': ['human', 'rgb_array', 'ansi']}def __init__(self, flexsimPath, modelPath, address='localhost', port=5005, verbose=False, visible=False):self.flexsimPath = flexsimPathself.modelPath = modelPathself.address = addressself.port = portself.verbose = verboseself.visible = visibleself.lastObservation = ""self._launch_flexsim()self.action_space = self._get_action_space()self.observation_space = self._get_observation_space()def reset(self):self._reset_flexsim()state, reward, done = self._get_observation()return statedef step(self, action):self._take_action(action)state, reward, done = self._get_observation()info = {}return state, reward, done, infodef render(self, mode='human'):if mode == 'rgb_array':return np.array([0,0,0])elif mode == 'human':print(self.lastObservation)elif mode == 'ansi':return self.lastObservationelse:super(FlexSimEnv, self).render(mode=mode)def close(self):self._close_flexsim()def seed(self, seed=None):self.seedNum = seedreturn self.seedNumdef _launch_flexsim(self):if self.verbose:print("Launching " + self.flexsimPath + " " + self.modelPath)args = [self.flexsimPath, self.modelPath, "-training", self.address + ':' + str(self.port)]if self.visible == False:args.append("-maintenance")args.append("nogui")self.flexsimProcess = subprocess.Popen(args)self._socket_init(self.address, self.port)def _close_flexsim(self):self.flexsimProcess.kill()def _release_flexsim(self):if self.verbose:print("Sending StopWaiting message")self._socket_send(b"StopWaiting?")def _get_action_space(self):self._socket_send(b"ActionSpace?")if self.verbose:print("Waiting for ActionSpace message")actionSpaceBytes = self._socket_recv()return self._convert_to_gym_space(actionSpaceBytes)def _get_observation_space(self):self._socket_send(b"ObservationSpace?")if self.verbose:print("Waiting for ObservationSpace message")observationSpaceBytes = self._socket_recv()return self._convert_to_gym_space(observationSpaceBytes)def _reset_flexsim(self):if self.verbose:print("Sending Reset message")resetString = "Reset?"if hasattr(self, "seedNum"):resetString = "Reset:" + str(self.seedNum) + "?"self._socket_send(resetString.encode())def _get_observation(self):if self.verbose:print("Waiting for Observation message")observationBytes = self._socket_recv()self.lastObservation = observationBytes.decode('utf-8')state, reward, done = self._convert_to_observation(observationBytes)return state, reward, donedef _take_action(self, action):actionStr = json.dumps(action, cls=NumpyEncoder)if self.verbose:print("Sending Action message: " + actionStr)actionMessage = "TakeAction:" + actionStr + "?"self._socket_send(actionMessage.encode())def _socket_init(self, host, port):if self.verbose:print("Waiting for FlexSim to connect to socket on " + self.address + ":" + str(self.port))self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.serversocket.bind((host, port))self.serversocket.listen();(self.clientsocket, self.socketaddress) = self.serversocket.accept()if self.verbose:print("Socket connected")if self.verbose:print("Waiting for READY message")message = self._socket_recv()if self.verbose:print(message.decode('utf-8'))if message != b"READY":raise RuntimeError("Did not receive READY! message")def _socket_send(self, msg):totalsent = 0while totalsent < len(msg):sent = self.clientsocket.send(msg[totalsent:])if sent == 0:raise RuntimeError("Socket connection broken")totalsent = totalsent + sentdef _socket_recv(self):chunks = []while 1:chunk = self.clientsocket.recv(2048)if chunk == b'':raise RuntimeError("Socket connection broken")if chunk[-1] == ord('!'):chunks.append(chunk[:-1])break;else:chunks.append(chunk)return b''.join(chunks)def _convert_to_gym_space(self, spaceBytes):paramsStartIndex = spaceBytes.index(ord('('))paramsEndIndex = spaceBytes.index(ord(')'), paramsStartIndex)type = spaceBytes[:paramsStartIndex]params = json.loads(spaceBytes[paramsStartIndex+1:paramsEndIndex])if type == b'Discrete':return gym.spaces.Discrete(params)elif type == b'Box':return gym.spaces.Box(np.array(params[0]), np.array(params[1]))elif type == b'MultiDiscrete':return gym.spaces.MultiDiscrete(params)elif type == b'MultiBinary':return gym.spaces.MultiBinary(params)raise RuntimeError("Could not parse gym space string")def _convert_to_observation(self, spaceBytes):observation = json.loads(spaceBytes)state = observation["state"]if isinstance(state, list):state = np.array(observation["state"])reward = observation["reward"]done = (observation["done"] == 1)return state, reward, doneclass NumpyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.integer):return int(obj)elif isinstance(obj, np.floating):return float(obj)elif isinstance(obj, np.ndarray):return obj.tolist()return json.JSONEncoder.default(self, obj)def main():env = FlexSimEnv(flexsimPath = "C:/Program Files/FlexSim 2022/program/flexsim.exe",modelPath = "E:/Flexsim/demo/ChangeoverTimesRL.fsm",verbose = True,visible = True)for i in range(2):env.seed(i)observation = env.reset()env.render()done = Falserewards = []while not done:action = env.action_space.sample()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()Flexsim與MySQL數(shù)據(jù)庫連接
?可以通過查詢語句對數(shù)據(jù)進行過濾,將其配置到flexsim的全局表中,以備后續(xù)的處理。
- ?flexsim本身內(nèi)部支持查詢和過濾,但仍然建議在導(dǎo)入數(shù)據(jù)源時進行過濾,因為數(shù)據(jù)庫引擎的查詢過濾速度比flexsim內(nèi)部快得多
示例:
Database.Connection con=Database.Connection("DBConnector1");//“DBConnector1”是Database Connectors 上連接的名字。 con.connect();//連接 Table table=Model.find("Source1>variables/schedule");//獲取發(fā)生器Schedule的表結(jié)構(gòu)。 Database.ResultSet set1=con.query("SELECT * FROM new_table");//new_table 是在SQL數(shù)據(jù)庫里創(chuàng)建的一個Table的名字。int rowCount=1; while(set1.fetchNext())//自動調(diào)到數(shù)據(jù)庫下一行數(shù)據(jù)(如果沒有下一行就跳出) {if(table.numRows<rowCount){table.addRow();}for(int i=1;i<=set1.numFields;i++)//numFields是數(shù)據(jù)庫中Table的字段數(shù)。{Variant val = set1[i];table[rowCount][i]=val;}rowCount++; } con.disconnect();//斷開連接部分觸發(fā)和任務(wù)調(diào)度樣例
//進入觸發(fā) if (port == 2) { int de=item.B_ID;Table thelist = getvarnode(current, "componentlist");treenode thesum = getvarnode(current, "targetcomponentsum");// thesum.value = 0;for(int index = 1; index <= thelist.numRows; index++) {thelist[index][1] = item.B_ID;//inc(thesum, item.B_ID);} } //離開觸發(fā) item.labels.assert("B_ID").value = item.first.B_ID; item.labels.assert("ID").value = item.first.ID; //把產(chǎn)品上的標(biāo)識賦值給下面的托盤。 treenode BF=Model.find("BasicFR1");//就是之前拉入的BasicFR,這邊需要注意名字要一樣,或者改成你model中BF的名字; int Queue_num=token.Q_01.subnodes.length;//再次獲取緩存區(qū)中產(chǎn)品的數(shù)量值,確定for循環(huán)的次數(shù)。 Array save_item=Model.find("BasicFR1").save_item;//獲取BF上的Array數(shù)組(以下簡稱BF); Array Save=up(token.Pallet).save;//獲取Tote存放的Queue上的Array數(shù)組(以下簡稱Qu); for(int i=1;i<=Queue_num;i++) {treenode item=token.Q_01.subnodes[i];string item_id=item.ID;for(int j=1;j<=Save.length;j++){string order_id=Save[j];if(item_id==order_id)//如果緩存區(qū)中有產(chǎn)品屬于當(dāng)前訂單組成部分,則把Qu中該產(chǎn)品編號從數(shù)組中剔除出去,并在BF中添加被剔除的產(chǎn)品編號{Save.splice(j,1);save_item.append([order_id]);break;}} } int array_num=save_item.length; if(array_num == 4)//獲取BF數(shù)組長度,如果長度==4,說明目前產(chǎn)品已滿足訂單需求;如果長度==0,說明目前產(chǎn)品不屬于該訂單; {BF.panduan = 1; } else if(array_num ==0) {BF.panduan = 3; } else {BF.panduan = 2; }總結(jié)
以上是生活随笔為你收集整理的flexsim--第二周的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kendall tau distance
- 下一篇: 教你去除开机root字样(酷派大神F2、