日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

flexsim--第二周

發(fā)布時(shí)間:2024/1/1 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flexsim--第二周 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本周說明及總結(jié):

本周我繼續(xù)學(xué)習(xí)了Flexsim的相關(guān)基礎(chǔ)操作,同時(shí),我本周主要探索了Flexsim與MySQL的互通,以及Flexsim在強(qiáng)化學(xué)習(xí)和調(diào)度策略優(yōu)化上的內(nèi)容。

主要目的是探索一下Flexsim在編程方面的自由度以及可以與我們目前的系統(tǒng)交互的程度。

目前明確的信息有:

  • Flexsim支持與MySQL的互通,支持SQL語句,內(nèi)部可以進(jìn)行查詢和過濾,具備一定的實(shí)時(shí)通信能力,但是可靠性、通信效率還需要進(jìn)一步驗(yàn)證
  • Flexsim支持編程式的任務(wù)調(diào)度,靈活性尚可。
  • Flexsim 2019支持深度學(xué)習(xí)和強(qiáng)化學(xué)習(xí),目前2019沒有找到非試用版的資源,所以這個(gè)功能目前無法體驗(yàn),但是根據(jù)其他博文和官網(wǎng)的說明,flexsim強(qiáng)化學(xué)習(xí)和部分?jǐn)?shù)據(jù)分析的實(shí)現(xiàn)方式是python,可以通過自訓(xùn)練模型,自行編程的方式進(jìn)行優(yōu)化和定制,示例見正文。
  • 目前的學(xué)習(xí)和研究方向:

  • Flexsim可以實(shí)現(xiàn)的調(diào)度算法和策略優(yōu)化,以及其對python的支持
  • Flexsim與MySQL通信的可靠性、查詢的效率
  • 進(jìn)一步對C++相關(guān)語言和flexsim的任務(wù)調(diào)度模塊進(jìn)行熟悉,爭取下周實(shí)現(xiàn)一個(gè)模塊。
  • 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ù)進(jìn)行過濾,將其配置到flexsim的全局表中,以備后續(xù)的處理。

    • ?flexsim本身內(nèi)部支持查詢和過濾,但仍然建議在導(dǎo)入數(shù)據(jù)源時(shí)進(jìn)行過濾,因?yàn)閿?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)建的一個(gè)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)度樣例

    //進(jìn)入觸發(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。