在仿真一个实际系统的时候,往往希望得出系统绩效最优时的系统配置;或者希望得出系统绩效相对较好的几种方案的系统配置,通过比较和权衡,选择其中的一种配置进行实际的实施。比如前面的生产线,给定一个利润目标函数=产出量×价格-设备成本-人力成本,它同产出率成正比,同设备数量和人员数量成反比,在特定约束条件下,目标函数越大越好。为了得出目标函数的最大值,可以通过逐步的改变系统中设备和人员数量,然后仿真运行,比较每次仿真运行的利润目标函数。如果每种设备(共有四种)的数量可以是1台或2台,人员数量可以是1或2人,则系统的配置方案就有2×2×2×2×2=32种,在进行方案比较时,就需要改动并运行模型32次,效率较低。
为了解决这一问题,Lanner公司通过使用最新的优化技术研究成果以及启发式算法,开发了一种独特的优化算法模块OPTIMIZER,通过使用该模块,设定了目标函数以及模型元素可能选择值,就可以连续的、按照特定算法快速有效的搜索出模型的最优解决方案。
下面将通过一个优化实例来深入了解OPTIMIZER的作用及其操作方法。
有一家组装电脑的小型公司,通过促销广告来吸引订单,根据客户订单来决定生产、检测、发运。其WITNESS仿真模型如图1所示,模型下载。
图1 优化示例模型的可视化界面
该系统的处理流程如下:
l 客户响应广告,提出订单Request;
l 每个订单请求Request需要员工组A(StaffA)或员工组B中的一名员工使用电脑或纸质记事簿记录下来,电脑和记事簿的数量可能是2到3个;究竟是需要员工A还是员工B进行记录。
l 在必要时候,需要同客户就订单问题进行电话沟通,这儿有3或4部电话,由员工组A或员工组B进行联系;
l 电脑由工程师(Engineer)进行组装(Build);
l 电脑由工程师或员工组B进行检测(Test);检测时间需要45或50分钟,90%的电脑通过检测,10%的电脑需要重新组装;
对该系统涉及到的变量及其意义和取值列于表1,系统通过这些组合来得出获得最优目标函数值的变量取值。
表1 优化变量列表
变量名称 |
说明 |
变量可能取值 |
变量取值数 |
累积组合 |
Logdist.value |
记录订单所需的时间值,取决于电脑记录还是记录簿记录 |
10 or 15 |
2 |
2 |
Testcyc.value |
检测时间,取决于检测者 |
50 or 45 |
2 |
4 |
Choice1.value |
选择员工进行订单记录 |
0,1,or 2 |
3 |
12 |
Choice2.value |
选择员工或工程师进行检测操作 |
0 or 1 |
2 |
24 |
StaffA.quantity |
A类员工的数量 |
3到5个 |
3 |
72 |
StaffB.quantity |
B类员工的数量 |
3到7个 |
5 |
360 |
Engineer.quantity |
工程师数量 |
2到4个 |
3 |
1080 |
Act001.quantity |
订单记录站点数量 |
2 or 3 |
2 |
2160 |
Act002.quantity |
回访电话机数量 |
3 or 4 |
2 |
4320 |
Act003.quantity |
检测站点数量 |
3到7个 |
5 |
21600 |
l 订单到达:1台/10分钟;
l 订单记录时间:取决于记事簿记录还是电脑记录,记录时间服从均值为Logdist,标准差为Logdist/10的正态分布;记事簿记录时,Logdist=15;电脑记录时,Logdist=10;对应设置于Act001的加工时间:NORMAL (LogDist,LogDist / 10.0,100 + N);
l 订单确认时间:服从最小值为10,最大值为40的均匀随机分布;对应设置于Act001的加工时间:UNIFORM (10.0,40.0,200 + N);
l 组装时间:服从最小值为10,最大值为20的均匀随机分布;对应设置于Act001的加工时间:UNIFORM (20.0,40.0,400 + N)
l 检测时间:取决于检测机器的类型,或50分钟,或45分钟;对应设置于Act001的加工时间:TestCyc。
根据变量choice1的值的不同,选择StaffA或StaffB。如果choice1=0,则仅有StaffA可以进行订单记录处理;如果choice1=1,则既可以StaffA也可以是StaffB进行订单记录;如果choice1=2,则仅有StaffB可以进行订单记录处理。对应设置Act001的Labor Rule规则如下:
IF Choice1 = 0
StaffA#1
ELSEIF Choice1 = 1
StaffA#1 OR StaffB#1
ELSE
! Choice 1 = 2
StaffB#1
ENDIF
既可以StaffA也可以是StaffB进行订单确认处理。对应设置Act002的Labor Rule规则如下:
StaffA#1 OR StaffB#1
组装工作仅有Engineer可以处理。对应设置Act003的Labor Rule规则如下:
Engineer#1
根据变量choice2的值的不同,选择Engineer或StaffB。如果choice2=0,选择B类员工进行检测;如果choice2=1,既可以Engineer也可以是StaffB进行检测。对应设置Act004的Labor Rule规则如下:
IF Choice2 = 0
StaffB#1
ELSE
! Choice2 = 1
StaffB#1 OR Engineer#1
ENDIF
进行优化模块的运行,必须设定目标函数,系统根据目标函数值的比较进行算法搜索计算。本例中的目标函数计算总的收益减去生产成本所得的净利润。
RCount = 0.0 ! 变量初始化
RCount = NSHIP (Request) * 100.0 ! 计算收益,每台电脑价格为100
RCount = RCount - NQTY (Engineer) * 80.0 - NQTY (StaffA) * 60.0 - NQTY (StaffB) * 60.0 !收益减去员工的工资,工程师每天工资80,员工工资每天60!
IF LogDist = 15
LogCost = 1.0 !记事簿记录,每次需要成本为1.0
ELSE
LogCost = 50.0 ! 电脑记录,每次需要成本为50.0
ENDIF
IF TestCyc = 50
TestCost = 50.0 !使用A类检测设备,检测一台电脑的成本
ELSE
TestCost = 60.0 !使用B类检测设备,检测一台电脑的成本
ENDIF
RCount = RCount - NQTY (Act001) * LogCost - NQTY (Act003) * TestCost
!收益减去记录的成本和检测的成本,得到净收益!
RETURN Rcount !返回净收益值
5.2.1 NSHIP(part_name)
功能:返回被送出系统SHIPPED的某种零部件元素的数量。
参数:part_name,名型,需要统计的part元素的名称。
示例:BILLABLE = NSHIP(CARTON)
在这个例子中,NSHIP函数计算出被发送出系统的CARTON零部件的数量,然后将值赋给变量BILLABLE。
5.2.2 NQTY(element_name)
功能:返回模型系统中,特定元素的数量。
参数:element_name,名型,需要统计的元素的名称。
示例:TOTAL_DRILLS = NQTY(DRILL)
在这个例子中,NQTY函数统计出模型系统中元素DRILL的数量,然后将值赋给变量TOTAL_DRILLS。
注:该函数不能够用来统计模型中的part元素的数量;为了统计模型中part元素的数量,使用NWIP函数来统计模型中某种part元素的在制品数量。
从变量表上可以看出,本模型的配置方案一共有21600种,采用手工方式,逐个方案进行设计和运行,显然不太现实。而使用优化模块就能够很方便的得出优化方案。
l 打开WITNESS;
l 打开WITNESS安装路径下的optimizer文件夹下的Bprbase.mod; 或者下载文件中的Bprbase.mod文件;
l 点击菜单model/optimize…,将弹出Model Optimization 4.0设置窗口;
l 在Model Optimization 4.0设置窗口中进行设置;
l 优化运行;
l 结果分析。
Model Optimization 4.0设置窗口如图2所示,窗口上有两个设置页框:Scenario和Tracking。
6.2.1 Tracking页框
允许设置最优结果的显示范围,例如显示前100个最优方案数据,还是显示前10个最优方案数据,只要在Show Best Results下面的文本框中填入100或者10即可。
6.2.2 Scenario页框
包括变量Variables、目标函数Objective Function、结果池Answer Pool、运行控制Run Control、算法Algorithm、对话按钮六个区域。
图2 Model Optimization 4.0设置窗口
l 变量Variables区域显示当前优化方案的变量列表,通过相关按钮可以进行变量的添加Add、修改Change、删除Delete、约束条件Constraints等设置。按钮作用如表2所示。
表2 优化对话框上按钮的作用表
按钮名称 |
按钮功能 |
Add |
显示添加变量对话框,可以添加一个新的变量 |
Change |
显示改变变量对话框,可以改变当前所选变量的相关设置 |
Delete |
删除当前所选变量 |
Delete All |
提示、删除当前列表中的所有变量 |
Constraints |
显示优化约束对话框,可以制定当前设定的变量之间的相互约束关系 |
Re-evaluate |
计算和显示在制定的约束条件下的方案组合数 |
l 目标函数Objective Function区域包括一个下拉列表框,显示当前模型的可用目标函数列表,在这里选择需要优化的目标函数;还包括一个最优结果best result is区域,选择目标函数是越大越好Maximum,还是越小越好Minimum。
l 结果池Answer Pool区域显示当前优化方案的可用结果,也就是优化运行所保存的最优结果数。选择Clear按钮清空结果池,选择Test按钮结果池中的数据是否与当前的模型一致。
l 运行控制Run Control区域的Warmup文本框指定仿真模型运行稳定所需要的时间,Run文本框指定每种方案的仿真时间等。
l 算法Algorithm区域用来设定所选的算法程序(共有六种)以及设置setting按钮和优化Optimize按钮。
l 在优化器对话框中选取目标函数objfun,同时选定Maximum,即优化搜索朝着该函数值可能增大的方向;
l 设定表9.1中的优化变量的可能取值情况添加入优化器对话框,如图9.2所示;
l 优化仿真一天时间该公司的利润情况,设定运行时间为1440分钟;
l 优化算法采用Adaptive Thermostatistical SA模拟退火算法。
l 可以通过Model Optimization 4.0设置窗口的Open…按钮打开随书光盘models目录下的BPRBase.opt,来获得参考。
在经过上一步的优化设置之后,就可以进行优化的运行了。点击“Optimize…”按钮,激活“Run Optimization”对话框,点击该对话框上的“Run”按钮,开始运行优化。
在运行过程中,系统提供了当前输入变量的值“Input Variables”、目标函数的结果的图形“Objective Graph”、变量和函数的对应表“Result Table”的动态显示。
通过仿真运行得到最优的五种方案如表3所示。
表3 仿真运行最优的五种方案
ObjFun |
LogDist .Value |
TestCyc .Value |
choice1 .Value |
choice2 .Value |
StaffA .Quantity |
StaffB .Quantity |
Engineer .Quantity |
Act001 .Quantity |
Act002 .Quantity |
Act003 .Quantity |
11758 |
15 |
45 |
0 |
0 |
4 |
6 |
4 |
2 |
3 |
7 |
11680 |
10 |
50 |
1 |
0 |
4 |
6 |
4 |
3 |
4 |
7 |
11668 |
15 |
50 |
1 |
0 |
4 |
7 |
4 |
2 |
3 |
7 |
11668 |
15 |
50 |
1 |
0 |
4 |
7 |
4 |
2 |
4 |
7 |
11667 |
15 |
50 |
1 |
0 |
4 |
7 |
4 |
3 |
3 |
7 |
完成65次优化搜索之后,形成的目标函数曲线如图3所示。
图3 完成65次搜索,所形成的目标函数的图形
可以看出,只要经过64次Adaptive Thermostatistical SA搜索,WITNESS就得到了最优的结果11758元/每天。
根据这五种最优方案,以及企业的实际情况,可以辅助企业进行系统配置方案的决策。