Flexsim 强化学习

效果

本教程主要是复现了Flexsim 2022最新的官方文档的样例。废话不多说先上优化前后效果(相同倍速),主要是根据等待时间策略学习出了比较好的处理产品的先后顺序。

Flexsim强化学习优化前


Flexsim强化学习优化后

环境依赖

  1. Flexsim 2022
  2. Python 3.0,相关库包括
    Gym
    Stable-baselines3

模型搭建

Flexsim模型搭建

  1. 新建模型,拖拉 Source, Queue, Processor, Sink元素。并连接元素。在这里插入图片描述
  2. 在Toolbox中,添加一个Global Table;在table的properties中,将表格重命名为ChangeoverTimes,并将行数和列数改为5,添加以下元素。
    在这里插入图片描述
    表格代表由工件i换到工件j时所消耗的时间。
  3. 点击Processor来编辑它的properties,在Setup Time中,从下拉菜单选择From/To Lookup Table。为Table选择ChangeoverTimes/
    在这里插入图片描述
  4. 点击Source来编辑它的Properties,在triggers中为On creation 添加要素,选择Data>set Label and color。将值改为duniform(1,5,getstream(current))。随机产生五种产品。
    在这里插入图片描述
  5. 这个时候保存模型为 ChangeoverTimesRL.fsm。就可以看到模型随机产生物品。
  6. 在Toolbox中加入 Statistics > Model Parameter Table.
  7. 将Parameter1表格重命名为Observations,同理创建一个名为Actions的表格。
  8. 将Observations的Parameter2重命名为LastItemType; 在这一行的value将值设置为整数,上限值为5.

在这里插入图片描述
在这里插入图片描述
9. 将Actions表格中的Parameter3命名为ItemType。将value限定为整数,上限5同样对应5种商品。
在这里插入图片描述

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

在这里插入图片描述
保存模型,运行可以看到红色的优先被拉去。

为模型添加强化学习功能。

  1. 在Toolbox,添加Connectivity > Reinforcement Learning

  2. 在Observation Space中,选择Discrete, 在Observation的参数中,选择LastItem Type;在 Action Space中,选择Discrete,并选择ItemType.
    在这里插入图片描述

  3. 点击Apply,点击Processor,在Setup Time picklist选择Codebutton,可以看到“f_lastlabelval”,之后要用到这个值

  4. 返回强化学习的属性窗口,在On observation 的trigger添加,并选择Code Snippet。将描述文字从Code Snippet改为Set observation parameter。

  5. 将下面代码粘贴到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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值