发帖
 找回密码
 立即注册
搜索
1 0 0

临时实体排列顺序代码解析

技术交流2 1 1 2016-5-24 10:48:08
[i=s] 本帖最后由 zorsite 于 2016-5-24 10:59 编辑 [/i]

此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。[code]/**按标签值降序排列临时实体*/
treenode item = param(1);
treenode current = ownerobject(c);
int port = param(2);

int Ascending = 1;
int Descending = 2;
int order = Descending;

double currentlabel = getlabel(item, "remaintime");
int maxrank = 1;
//假设新进入的(当前临时实体)默认排在队列的第一位。
//接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
for (int i = 1; i <= content(current); i++) {
        treenode cmpareitem = rank(current, i);
        double comparelabel = getlabel(cmpareitem, "remaintime");
        if (order == Ascending)
              {  if (comparelabel > currentlabel)        break;}
        //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值
         //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
         //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
        else if (comparelabel < currentlabel)  break;
        //如果是降序排列,只需要改变比较的方向,其他原理相同。
        maxrank++;
}
setrank(item,min(maxrank, content(current)));
[/code]注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
──── 0人觉得很赞 ────
2016-5-24 16:30:59
这个是典型的冒泡排序,属于常见的排序算法。
感谢加老师分享。
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验:)
您需要登录后才可以回帖 立即登录
高级模式
返回
技术交流2
热门问答
查看更多
1
Flexsim初级建模工程师水平标准
Flexsim初级建模工程师水平标准
62
234
2
无意中找到的资料,非常适合于初学者
无意中找到的资料,非常适合于初学者
47
229
3
厂区生产线布局优化案例!新做的!
厂区生产线布局优化案例!新做的!
43
224
4
流水作业线的仿真
流水作业线的仿真
36
83
5
flexsim中文教程,pdf文档已整理-重新整理
flexsim中文教程,pdf文档已整理-重新整理
36
114
博主榜
+ 5