首页 > 其他分享 >【仿真建模-anylogic】Statechart原理解析

【仿真建模-anylogic】Statechart原理解析

时间:2024-06-15 12:32:28浏览次数:10  
标签:index Statechart 转换 transition 建模 anylogic msg 状态图 owner

Author:赵志乾
Date:2024-06-15
Declaration:All Right Reserved!!!

1. 类图

2. 原理解析

2.1 核心函数

           Statechart的核心函数如下:

函数功能
Statechart(Agent owner, short maxat)构造函数,入参指定状态图owner以及允许的最大激活Transition个数
void start()启动函数,激活状态图并执行Entry Action
void fireEvent(Object msg)将消息加入状态图的消息队列,该消息会被立即消费或经过若干个不耗时的执行步后被消费,否则被丢弃
boolean receiveMessage(Object msg)将消息传递至状态图,要么立即执行,要么被丢弃;
2.2 代码解析

     Anylogic内核做了代码混淆,以下代码为二次加工后的逻辑;

//************************核心字段************************
// 状态图所属的Agent    
private transient Agent owner;
// 当前激活的状态
private T activeState = null;
// 当前激活的转换容器
protected Transition[] activeTransitions;
// 当前激活的转换个数
protected int activeTransitionSize = 0;
// 状态图待处理的消息队列
private LinkedList<Object> msgQueue;
// 备份的当前时间
private double currentTime = Double.NEGATIVE_INFINITY;
	
//************************构造函数*************************
// 指定状态图所属的Agent以及状态图允许同时处于激活状态的最大转换数
public Statechart(Agent owner, short maxConcurrentActived) {
    this.owner = owner;
    this.activeTransitions = new Transition[maxConcurrentActived];
    this.activeTransitionSize = 0;
    this.msgQueue = new LinkedList<>();
}

//***********************状态图启动*************************
// 状态图启动函数在owner的start()函数中调用
public void start() {
    // 校验:已启动的状态图不允许再次调用start()
    if (this.activeState != null) {
        this.g.error(this.getFullName() + jj.hdg);
    }
    // 执行自定义逻辑,之后进入首个状态
    this.owner.executeActionOf(this);
}

//************************事件处理**************************
// 无排队:收到事件消息能处理则处理,否则直接丢弃;
public boolean receiveMessage(Object msg) {
    boolean result = false;
    // 遍历当前激活状态的消息转换,并尝试执行转换
    for(int index = 0; index < this.activeTransitionSize ; ++index) {
       Transition transition = this.activeTransitions[index];
       if (transition instanceof TransitionMessage && ((TransitionMessage)transition).f(msg)) {
            //此处仅仅标记结果为成功,并未结束循环;所以当消息匹配多个激活的转换时,这个几个转换将会各自独立执行
            result = true;
        }
     }

     return result;
}

// 有排队:收到事件消息优先进队列,然后尝试消费一次
public void fireEvent(Object msg) {
    double currentTime = this.getAgent().time();
    if (this.currentTime < currentTime) {
        this.msgQueue.clear();
    }

    this.msgQueue.addLast(msg);
    this.currentTime = currentTime;
    this.tryConsume();
}

//*************************转换的激活与取消激活**************************************
// 激活转换:激活转换时,尝试进行一次消费
void activateTransition(Transition transition) {
    this.activeTransition[this.activeTransitionSize++] = transition;
    this.tryConsume();
}
// 取消激活转换
void deactivateTransition(Transition transition) {
    // 找到取消激活的转换所对应的下标
    int index;
    for(index = 0; index< activeTransitionSize; index++){
        if(this.activeTransitions[index] == transition){
			break;
		}
	}
	// 合法性校验:只有激活状态的转换才允许取消激活
	if(index >= this.activeTransitionSize){
		throw new RuntimeException("INTERNAL ERROR: a statechart transition being deactivated is not active");
	}
	// 将之后的元素逐个向前移动
    for(; index<activeTransitionSize-1; index++){
	    this.activeTransitions[index] = this.activeTransitions[index+1];
	}
    // 修正激活转换个数
	this.activeTransitionSize--;
}

//****************************变更*************************************
public void onChange() {
    // 变更发生时,刷新TransitionRate和TransitionCondition的触发条件
    for(int index = 0; index < this.activeTransitionSize; ++index) {
        Transition transition = this.activeTransitions[var1];
        if (transition instanceof TransitionRate) {
            ((TransitionRate)transition).g();
        } else if (transition instanceof TransitionCondition) {
            ((TransitionCondition)transition).g();
        }
    }
}

//*************************尝试消费************************************
private void tryConsume() {
    //清除历史消息
    if (this.getAgent().time() > this.currentTime) {
        this.msgQueue.clear();
        return;
    }
    //尝试消费消息
    int index = 0;
    for(Iterator iterator = this.msgQueue.iterator(); iterator.hasNext(); ++index) {
        Object msg = iterator.next();
        if (this.receiveMessage(msg)) {
            break;
         }
     }
     //消费成功
     if (index < this.msgQueue.size()) {
         //移除成功消费消息及其之前的消息
         for(int cycle = 0; cycle <= index; ++cycle) {
            this.msgQueue.removeFirst();
         }
     }
}
 

3. 应用场景

          Statechart主要用于对事件驱动或时间驱动的行为进行建模,其包含状态和转换两种核心元素;转换可由消息、超时、速率、条件等触发,从而导致状态发生流转;

          实际使用中有两种方式向状态图发送消息:fireEvent和receiveMessage,两者的区别在于消息是否会被加入队列进行排队;可根据实际应用场景进行选择;

          

标签:index,Statechart,转换,transition,建模,anylogic,msg,状态图,owner
From: https://blog.csdn.net/zhaoyaxuan001/article/details/139693667

相关文章

  • B站UP主【动态系统的建模与分析】2_电路系统建模_基尔霍夫定律题目解析
    视频链接选定回路,下面开始求解由图分析所以求导代入得分析过程:式①化简得与,即与的关系式③结合上式结果,化简得与的关系式②化简得的积分与的关系式④代入上式得最终结果......
  • PreScan快速入门到精通: 仿真实验环境建模
    PreScan的实验是在某种环境中进行的。PreScan环境的基本元素有以下几种:底层(2D)自然元素道路斑点 Skyboxes可以在Experiment->GeneralSettings->3DWorld底层(2D)目的:最重要的是,底层的作用是完成实验的场景。提供它们是为了有一个简单的方法来快速建立一个2D世界。例如,......
  • 数据仓库之维度建模
    维度建模是数据仓库设计中的一种方法,旨在优化数据查询和分析过程。它通过将数据划分为事实表和维度表,使复杂的数据查询变得更加高效和直观。以下是关于数据仓库维度建模的详细介绍:1.维度建模的概念维度建模(DimensionalModeling)是一种数据建模方法,用于设计数据仓库中的数据......
  • 数据仓库中的7种建模方法及示例
    数据仓库中的7种建模方法及示例原创(https://mp.weixin.qq.com/s/4Nnhih4ccLxs5hguQMZRHA)晓晓数据驱动智能2024-06-0907:19陕西图片试象一下,你是一家繁忙餐厅的分析工程师。每天,顾客都会预订、下订单并完成付款。所有这些数据都会流入餐厅的交易数据库,记录每次互动的详细信......
  • 100天精通风控建模(原理+Python实现)——第28天:风控建模中逻辑回归是什么?主要应用在
    在当今风险多变的环境下,风控建模已经成为金融机构、企业等组织的核心工作之一。在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中逻辑回归是什么,主要应用在哪些方面。并提供风控建模原理和Python实现文章清单。  之前已经阐述了1......
  • 基于matlab的动力学有限元期刊文章(关节接触界面的随机建模和更新)---论文复现
      stochasticmodellingandupdatingofajointcontactinterface是发表在mechanicalsystemsandsignalprocessing上的一篇较高质量文章。笔者成功复现该文章,效果优异,配备原文,方便学习使用,适合该方向的学习者。  接头和机械连接中接触界面的动态性能对装配结构的......
  • Block Transformer:通过全局到局部的语言建模加速LLM推理
    在基于transformer的自回归语言模型(LMs)中,生成令牌的成本很高,这是因为自注意力机制需要关注所有之前的令牌,通常通过在自回归解码过程中缓存所有令牌的键值(KV)状态来解决这个问题。但是,加载所有先前令牌的KV状态以计算自注意力分数则占据了LMs的推理的大部分成本。在这篇论文中,作者......
  • 数学建模 —— 图与网络(7)
    目录一、图的基本概念与数据结构1.1基本概念1.1.1图1.1.2完全、非完全图1.1.3二分图、完全二分图1.1.4.度、奇定点、偶顶点1.1.5Hamilton图1.1.6赋权图1.2图与网络的数据jie'gou1.2.1邻接矩阵表示法1.2.2稀疏矩阵表示法二、最短路问题2.1两个指定顶点......
  • ChatGPT-4o在临床医学日常工作、数据分析与可视化、机器学习建模中的技术
    2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5,将人工智能的发展推向了一个新的高度。2023年11月7日,OpenAI首届开发者大会被称为“科技界的春晚”,吸引了全球广大用户的关注,GPT商店更是显现了OpenAI旨在构建AI生态......
  • 流程内嵌iframe建模页面并实现数据交互
     效果图: 1、准备工作:下载并设置layui  2、 创建对应建模-要拿到建模新建页面URL-要给对应权限 3、 流程页面创建对应按钮触发事件(你可以用其它方式)$("#oTable0").find("tbody").find("tr:eq(1)").find("td:eq(6)").prepend("<buttonid='s......