查看: 14|回复: 14

发生器按照百分比产生临时实体的例子

[复制链接]

主题

0

回帖

3566

积分

高级会员

积分
3566
发表于 2012-11-23 16:11:45 | 显示全部楼层 |阅读模式
[i=s] 本帖最后由 adysunshine 于 2012-11-23 16:18 编辑 [/i]

很多人问到如何让发生器按照一定的比例产生不同类型的临时实体,这里用一个80%:20%的例子讲一下实现的过程,工程师提示用到dempirical函数,

在命令库中找到这个函数复制到google翻译,大致的意思就是需要一个表(全局表),这个表的第一列代表各个类型的比例,加在一块的和一定要是100,第二列对应的就是这个比例对应的类型值,比如第一步添加一个全局表](全局表的名字这里设为1)

意思就是发生器可以产生80%类型为1的临时实体,20%类型为2的临时实体
第二步,在发生器的创建触发里面设置临时实体类型,

dempirical("1",1):引号里面代表的是引用全局表1,后面的1是随即数流,用汪总的话说就是选随机数类似于筛骰子,很贴切,通常我们默认为1就可以了。
在设置一下颜色,确定就可以了。
截图:
模型:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

主题

0

回帖

32

积分

新手上路

积分
32
发表于 2012-11-24 16:46:14 | 显示全部楼层
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=7019&ptid=2925]1#[/url] [i]adysunshine[/i] [/b]


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

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

total +=10;
if (randomnum <= total)
{
        nt=1;
}
else
{
        total +=20;
        if (randomnum <= total)
        {
                nt=2;
        }
        else
        {
                total += 30;
                if (randomnum <= total)
                {
                        nt=3;
                }
                else
                {
                        total +=40;
                        if (randomnum <= total)
                        {
                                nt=4;
                        }
                }
        }
}
setitemtype(involved,nt);
colorarray(involved,nt);

} //******* PickOption End *******\\[/code]

主题

0

回帖

544

积分

中级会员

积分
544
发表于 2012-11-29 19:26:33 | 显示全部楼层
[i=s] 本帖最后由 zorsite 于 2012-11-29 20:18 编辑 [/i]

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

主题

0

回帖

544

积分

中级会员

积分
544
发表于 2012-11-29 20:17:33 | 显示全部楼层
[i=s] 本帖最后由 zorsite 于 2012-12-1 17:41 编辑 [/i]

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

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

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

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

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

/***popup:SetTypeAndColor*/

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

/** \nFlowitem: */

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

/** \nItemtype: */

double nt;

/**\n\n*/

.............................................

} //******* PickOption End *******\\ [/code]上面这一段代码写得眼花缭乱,即便知道了注释方法仍然看得很辛苦,也看不太明白。
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;

主题

0

回帖

32

积分

新手上路

积分
32
发表于 2012-11-30 07:39:40 | 显示全部楼层
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=7089&ptid=2925]3#[/url] [i]zorsite[/i] [/b]


谢谢!

主题

0

回帖

544

积分

中级会员

积分
544
发表于 2012-12-1 17:52:18 | 显示全部楼层
如果仅仅是为了满足按照比例随机生成4种临时实体的话,那么下面的代码足矣。[code]treenode item = parnode(1);
double nt;
int randomnum = duniform(1, 100);
if (randomnum <= 10) {nt=1;}
else  
   {if (randomnum <= 30) {nt=2; }
     else
       {if (randomnum <= 60) {nt=3; }
         else
          {if (randomnum <= 100){nt=4; }
}}}
setitemtype(item,nt);
colorarray(item,nt);
[/code]

主题

0

回帖

544

积分

中级会员

积分
544
发表于 2012-12-1 20:07:24 | 显示全部楼层
如果只生成2种类型的临时实体,除了上述两种方法之外,还有另外一个函数可以参考。
比如,第一种类型占80%,第二种类型占20%,则可用下列代码实现:[code]setitemtype(item,bernoulli(80,1,2));[/code]

主题

0

回帖

3566

积分

高级会员

积分
3566
 楼主| 发表于 2012-12-5 08:58:19 | 显示全部楼层
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=7089&ptid=2925]3#[/url] [i]zorsite[/i] [/b]
哈哈 明白了 感谢加老师的解释

主题

0

回帖

57

积分

注册会员

积分
57
发表于 2013-5-30 22:52:34 | 显示全部楼层
:loveliness:真好,刚好解决了我的问题

主题

0

回帖

4万

积分

版主

积分
45331
发表于 2013-5-31 11:51:49 | 显示全部楼层
好贴!要顶!认真学习!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|京ICP备14043114号-2

在本版发帖
关注公众号
QQ客服返回顶部