全球FlexSim系统仿真中文论坛

标题: 发生器按照百分比产生临时实体的例子 [打印本页]

作者: adysunshine    时间: 2012-11-23 16:11
标题: 发生器按照百分比产生临时实体的例子
本帖最后由 adysunshine 于 2012-11-23 16:18 编辑

很多人问到如何让发生器按照一定的比例产生不同类型的临时实体,这里用一个80%:20%的例子讲一下实现的过程,工程师提示用到dempirical函数,
[attach]960[/attach]
在命令库中找到这个函数复制到google翻译,大致的意思就是需要一个表(全局表),这个表的第一列代表各个类型的比例,加在一块的和一定要是100,第二列对应的就是这个比例对应的类型值,比如第一步添加一个全局表](全局表的名字这里设为1)
[attach]958[/attach]
意思就是发生器可以产生80%类型为1的临时实体,20%类型为2的临时实体
第二步,在发生器的创建触发里面设置临时实体类型,
[attach]961[/attach]
dempirical("1",1):引号里面代表的是引用全局表1,后面的1是随即数流,用汪总的话说就是选随机数类似于筛骰子,很贴切,通常我们默认为1就可以了。
在设置一下颜色,确定就可以了。
截图:[attach]959[/attach]
模型:[attach]962[/attach]
作者: 天性518    时间: 2012-11-24 16:46
1# adysunshine


这是在群里面有位叫宋老师写的代码,我存下来了,但是好多看不懂 ,希望看得懂得朋友给与一定的解释,谢谢!
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
  3. int rownumber = parval(2);  //row number of the schedule/sequence table
  4. { //************* PickOption Start *************\\
  5. /***popup:SetTypeAndColor*/
  6. /**设置临时实体类型和颜色*/
  7. /** \nFlowitem: */
  8. treenode involved = /***tag:involved*//**/item/**/;
  9. /** \nItemtype: */
  10. double nt;
  11. /**\n\n*/

  12. int randomnum = trunc(uniform(0.0, 100.0));
  13. double total = 0.0;

  14. total +=10;
  15. if (randomnum <= total)
  16. {
  17.         nt=1;
  18. }
  19. else
  20. {
  21.         total +=20;
  22.         if (randomnum <= total)
  23.         {
  24.                 nt=2;
  25.         }
  26.         else
  27.         {
  28.                 total += 30;
  29.                 if (randomnum <= total)
  30.                 {
  31.                         nt=3;
  32.                 }
  33.                 else
  34.                 {
  35.                         total +=40;
  36.                         if (randomnum <= total)
  37.                         {
  38.                                 nt=4;
  39.                         }
  40.                 }
  41.         }
  42. }
  43. setitemtype(involved,nt);
  44. colorarray(involved,nt);

  45. } //******* PickOption End *******\\
复制代码

作者: zorsite    时间: 2012-11-29 19:26
本帖最后由 zorsite 于 2012-11-29 20:18 编辑

int randomnum = trunc(uniform(0.0, 100.0));
定义整数 randomnum
double total = 0.0;
定义双精度型数total并令total=0
total +=10;
total=total+10,所以程序到这里的时候total已经等于10了。
if (randomnum <= total)
如果randomnum小于等于10,
{
        nt=1;
}
nt=1(即临时实体流的类型为1)
else
{
        total +=20;
如果不是,total=total+20,此时total=30
        if (randomnum <= total)
如果randomnum小于等于30,
        {
                nt=2;
        }
nt=2(即临时实体流的类型为2)
        else
        {
                total += 30;
如果不是,total=total+30,此时total=60
                if (randomnum <= total)
如果randomnum小于等于60,
                {
                        nt=3;
                }
nt=3(即临时实体流的类型为3)
                else
                {
                        total +=40;
如果不是,total=total+40,此时total=100
                        if (randomnum <= total)
如果randomnum小于等于100,
                        {
                                nt=4;
                        }
nt=4(即临时实体流的类型为4)
                }
        }
}
整段代码的核心目的是要设定临时实体流的类型和颜色属性。一共有4种类型,相应的有4种颜色。
而且这4中类型需要满足类型1占10%,类型2占20%,类型3占30%,类型4占40%的比例生成。
其实如果用全局表来做,也就是美女超级版主的方法,是很简单的。但是用全局表给人感觉不专业,或者说,不能给人以“随机”的感觉。让人觉得临时实体的生成是按照固定的表格生成的,而不是随机生成的。于是就有了像宋老师这样的技术达人利用随机函数uniform编写的这段代码。
整段代码的核心为:
如果生成的随机数小于等于10,则生成的临时实体类型属性为1;
如果生成的随机数小于等于30,则生成的临时实体类型属性为2;
如果生成的随机数小于等于60,则生成的临时实体类型属性为3;
如果生成的随机数小于等于100,则生成的临时实体类型属性为4。

作者: zorsite    时间: 2012-11-29 20:17
本帖最后由 zorsite 于 2012-12-1 17:41 编辑

我也不懂编程,里面有好多我也不明白。希望能有高手解释的更明白一些。

最近又阅读了一下说明文档,对于代码的开头部分有了更进一步的认识。
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
复制代码
几乎在编辑每一个实体的代码时,都能够看到上述两行(或一行,或更多行)“标题”代码。
首先要明确,这也是变量声明和定义语句。类似于宋老师代码中的
  1. int randomnum = trunc(uniform(0.0, 100.0));
  2. double total = 0.0;
复制代码
宋老师定义的两个变量,一个是整数变量randomnum,另一个是双精度数变量total,在定义变量的同时,变量后边的=赋予了变量的值。randomnum的值是0~100的一个随机整数,total的值是0。

而标题代码定义的是两个树节点(treenod)变量。
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
复制代码
其中current变量永远指向当前实体——ownerobject(c)。比如在本例中,此段代码出现在发生器实体的创建触发中,那么current就指的事当前发生器。

item变量则永远指向当前临时实体——parnode(1)。比如在本例中,正被发生器创建出的,并且正在执行创建触发中的代码的这个临时实体。
  1. int rownumber = parval(2);  //row number of the schedule/sequence table
复制代码
定义一个整数变量rownumber,至于这个变量为什么= parval(2),又代表了什么含义,目前不太清楚。
后面的//row number of the schedule/sequence table则是注释部分。//表示整行注释。
另一种注释是多行注释。需要/*标识出注释的开始位置并且使用*/标识注释的结束。
Flexsim 的模板代码机制使用注释指定模板文本。模板文本(可以在模板下拉菜单中修改的文本)被分为固定的黑色文本和可编辑的蓝色文本。
要指定固定黑色文本,需要使用多行注释但是需要在第一个斜杠的后面多增加一个星号。通过添加一个额外的星号,通知Flexsim 模板代码解释器这是固定黑色文本的一部分,当用户查看模板文本时,它应该显示。

使用蓝色可编辑文本,用户输入可以作为部分实际代码。要设置蓝色文本,应用/**/包围住可修改部分,如下:
double value=/**/10/**/;
10被/**/包围,即显示为蓝色并且可被修改。
Flexsim 脚本剖析器仅看到double value=10。
\n 标签指定在固定黑色模板文本中的新行。
  1. { //************* PickOption Start *************\\

  2. /***popup:SetTypeAndColor*/

  3. /**设置临时实体类型和颜色*/

  4. /** \nFlowitem: */

  5. treenode involved = /***tag:involved*//**/item/**/;

  6. /** \nItemtype: */

  7. double nt;

  8. /**\n\n*/

  9. .............................................

  10. } //******* PickOption End *******\\
复制代码
上面这一段代码写得眼花缭乱,即便知道了注释方法仍然看得很辛苦,也看不太明白。
1.为什么//************* PickOption Start *************\\在大括号内而//******* PickOption End *******\\在大括号外?
2. /***表示什么意思?
3. popup又代表什么含义?
4. /***tag:involved*/是一个标签提示吗?
5. treenode involved = /**/item/**/,难道item还可以被修改?修改为其他临时实体?有什么作用?如果不可修改,则没有必要重新定义一个树节点变量,因为involved = item。
6.这段代码实际有用部分只有两行:
treenode involved = /**/item/**/;
double nt;
如果考虑到involved = item的话,实际上上面整段文字只有一段有实际意义,就是定义了整数型变量nt:double nt;
作者: 天性518    时间: 2012-11-30 07:39
3# zorsite


谢谢!
作者: zorsite    时间: 2012-12-1 17:52
如果仅仅是为了满足按照比例随机生成4种临时实体的话,那么下面的代码足矣。
  1. treenode item = parnode(1);
  2. double nt;
  3. int randomnum = duniform(1, 100);
  4. if (randomnum <= 10) {nt=1;}
  5. else  
  6.    {if (randomnum <= 30) {nt=2; }
  7.      else
  8.        {if (randomnum <= 60) {nt=3; }
  9.          else
  10.           {if (randomnum <= 100){nt=4; }
  11. }}}
  12. setitemtype(item,nt);
  13. colorarray(item,nt);
复制代码

作者: zorsite    时间: 2012-12-1 20:07
如果只生成2种类型的临时实体,除了上述两种方法之外,还有另外一个函数可以参考。
比如,第一种类型占80%,第二种类型占20%,则可用下列代码实现:
  1. setitemtype(item,bernoulli(80,1,2));
复制代码

作者: adysunshine    时间: 2012-12-5 08:58
3# zorsite
哈哈 明白了 感谢加老师的解释
作者: 慕笙    时间: 2013-5-30 22:52
真好,刚好解决了我的问题
作者: 慧娴亚伦    时间: 2013-5-31 11:51
好贴!要顶!认真学习!
作者: yearbaby    时间: 2013-6-25 13:53
收藏了
作者: 浪子    时间: 2013-8-24 16:49
在用户手册上看到另外一种按百分比产生的方法[attach]1546[/attach]
作者: 钢笔    时间: 2013-8-31 08:43
虽然后面代码那些没看懂 不过前面那些真是太好了
作者: 大摸鱼    时间: 2013-12-9 20:36
收藏啦
作者: sandra_neu    时间: 2015-1-13 13:39
十分感谢




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3