效果
本教程主要是复现了Flexsim 2022最新的官方文档的样例。废话不多说先上优化前后效果(相同倍速),主要是根据等待时间策略学习出了比较好的处理产品的先后顺序。
Flexsim强化学习优化前
Flexsim强化学习优化后
环境依赖
- Flexsim 2022
- Python 3.0,相关库包括
Gym
Stable-baselines3
模型搭建
Flexsim模型搭建
- 新建模型,拖拉 Source, Queue, Processor, Sink元素。并连接元素。

- 在Toolbox中,添加一个Global Table;在table的properties中,将表格重命名为ChangeoverTimes,并将行数和列数改为5,添加以下元素。

表格代表由工件i换到工件j时所消耗的时间。 - 点击Processor来编辑它的properties,在Setup Time中,从下拉菜单选择From/To Lookup Table。为Table选择ChangeoverTimes/

- 点击Source来编辑它的Properties,在triggers中为On creation 添加要素,选择Data>set Label and color。将值改为duniform(1,5,getstream(current))。随机产生五种产品。

- 这个时候保存模型为 ChangeoverTimesRL.fsm。就可以看到模型随机产生物品。
- 在Toolbox中加入 Statistics > Model Parameter Table.
- 将Parameter1表格重命名为Observations,同理创建一个名为Actions的表格。
- 将Observations的Parameter2重命名为LastItemType; 在这一行的value将值设置为整数,上限值为5.


9. 将Actions表格中的Parameter3命名为ItemType。将value限定为整数,上限5同样对应5种商品。

- 点击Processor,在Properties中,点击Pull,在Pull Strategy的下拉菜单,选择Pull Best Item 选项。
- 在显示出的Label中,选择Custom Value,,并输入
item.Type == Model.parameters["ItemType"].value

保存模型,运行可以看到红色的优先被拉去。
为模型添加强化学习功能。
-
在Toolbox,添加Connectivity > Reinforcement Learning
-
在Observation Space中,选择Discrete, 在Observation的参数中,选择LastItem Type;在 Action Space中,选择Discrete,并选择ItemType.

-
点击Apply,点击Processor,在Setup Time picklist选择Codebutton,可以看到“f_lastlabelval”,之后要用到这个值
-
返回强化学习的属性窗口,在On observation 的trigger添加,并选择Code Snippet。将描述文字从Code Snippet改为Set observation parameter。
-
将下面代码粘贴到field
Model.parameters["LastItemType"].value = getvarnum(Model.find("Processor1"), "f_lastlabelval");

6. 返回3D视图,点击sink,在Labels中,添加一个Number label标签,并命名为LastTime
7. 再添加一个标签命名为Reward,勾选Automatically Reset按钮,并保存
8. 在Triggers中添加On Entry,添加Data>Increment Value选项,在Increment的下拉菜单,选择current.labels[“Reward”],在by中输入 10/(Model.time - current.LastTime)
9. 添加一个Data> Set Label选项,Object 选择Current,Label选为“LastTime”,在Value选择Model.time。这就是我们的奖励计算

10. 返回强化学习的属性,编辑奖励方程,将其命名从 Reward Function 改为 Reward based on throughput。粘贴下面的代码。
double reward = Model.find("Sink1").Reward;
Model.find("Sink1").Reward = 0;
int done = (Model.time > 1000);
return [reward, done];

11. 在On Request Action中,添加Take a Random Action选择
12. 在Decision Events中添加一个新的event ,选择Pull Strategy选项。

保存并运行模型。
Python部分
依次,修改并运行下述代码,分别起到测试接口,训练,测试功能。



红色的部分是要修改的地方。
flexsim_env.py
import gym
import os
import subprocess
import socket
import json
from gym import error, spaces, utils
from gym.utils import seeding
import numpy as np
class 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 = flexsimPath
self.modelPath = modelPath
self.address = address
self.port = port
self.verbose = verbose
self.visible = visible
self.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 state
def step(self, action):
self._take_action(action)
state, reward, done = self._get_observation()
info = {
}
return state, reward, done, info
def render(self, mode='human'):
if mode == 'rgb_array':
return np.array([0,0

最低0.47元/天 解锁文章
2749

被折叠的 条评论
为什么被折叠?



