AnyLogic模型错误新手指南 – AnyLogic仿真软件 您所在的位置:网站首页 运行时错是什么意思 AnyLogic模型错误新手指南 – AnyLogic仿真软件

AnyLogic模型错误新手指南 – AnyLogic仿真软件

2024-07-10 07:10| 来源: 网络整理| 查看: 265

每个人都会犯错,因为这是学习过程的一部分。然而,如果您很难理解如何以及在哪里修复AnyLogic中的错误,我们将提供帮助。当出现错误时,这篇文章可以作为您参考的指南。

这篇文章基于最近的一次网络研讨会,重点介绍了使用应用广泛的创新模型构建工具AnyLogic和范式推荐策略,这些工具和策略可供所有用户使用。

但是,AnyLogic的调试模式(允许您暂停和恢复程序、检查变量和计算表达式)不包括在内,它仅在AnyLogic专业版中可用,主要用于代码密集型模型。

以下是这篇文章的内容:

模型导航 编译时错误 无法解析 该方法不适用 类型不匹配 句法错误 无法访问的代码 该方法未定义 状态图特定错误 运行时错误 智能体不能离开端口 智能体无法离开 不能强制转换 空指针异常 索引越界异常 模型导航

如果您是AnyLogic初学者,那么在进一步操作之前,应该先熟悉界面中的一些基本元素。

AnyLogic界面元素(点击放大)

在顶部,有一个菜单和一个工具栏。从左到右,共有四个部分:

工程视图——所有打开的模型所在的位置。作为一个初学者,您可能希望一次打开一个模型以避免混淆。 面板视图——包含AnyLogic库元素、演示元素和其他用于模型构建的工具。 图形编辑器或画布——在这个空间中,您可以从面板中拖拽元素,以创建模型的逻辑和模型的物理表示。 属性视图——您可以在其中查看模型所选元素的属性。

在工程部分,模型的元素被分类为不同的类别,因此您可以轻松地浏览它们。要在图形编辑器中打开智能体,请双击它。它将作为一个新选项卡出现在那里,并在工程视图中以粗体突出显示,这样您就可以始终知道自己在模型中的位置。

在底部,您将看到一个状态栏和两个窗口——控制台和问题。这两个元素将成为本文的重点,因为它们可以帮助您处理错误消息。

搜索模型元素

假设您不是想在画布上找到智能体,而是想找到属于该智能体的特定元素。当您第一次双击该元素时,您将打开相应的智能体。第二次双击时,搜索到的智能体元素将高亮显示。

搜索模型元素

另一种搜索元素的方法是通过搜索按钮(Windows为Ctrl+F,Mac为Command+F)。

通过搜索按钮搜索模型元素

这些是在处理错误和这些有问题的元素时,在模型中查找所需元素的方法。

编译时错误

它们在代码生成和编译过程中找到,并在运行模型之前出现。此类错误显示在问题视图中。

问题视图中的错误

在模型构建过程中,始终可以按构建模型(或F7)查找工程中所有模型中的错误。如果有的话,模型图标附近会出现一个红色的小X。

在AnyLogic中打开屏幕底部的问题部分,查看检测到的所有错误。要筛选它们,请使用依模型过滤问题(单击它,工程中的模型)或依选择过滤问题。

问题视图中的过滤器

让我们来看看网络研讨会示例模型中出现的编译问题。

编译时错误1:“[NAME]无法解析…(…为变量/…或不是字段)”([NAME] cannot be resolved… (…to a variable/…or is not a field))

此消息可能意味着:

您引用的名称有问题,这就是AnyLogic无法处理它的原因。这通常是由于拼写错误或在未重构的情况下重命名对象造成的。 您没有指定对象类型。

以下是处理此错误的一些场景。

名称解析:引用元素的名称错误 修复元素的错误名称(点击放大)

该错误表明所引用的群名称有问题。建模者的意图是Source模块提及的智能体群应该命名为Customers。因此,在这里,您可以删除mypopulation,然后从下拉菜单中选择建议的群名称——Customers。

现在,如果您再次按构建模型(或F7),您将看到您已经解决了错误。您可以通过Error demo – name resolution 示例[ZIP]亲自尝试。

名称解析:拼写错误 修复AnyLogic模型中的拼写错误(点击放大)

拼写错误是最难抓住的事情之一。有时,乍一看,似乎没有拼写错误,所以有一个技巧可以帮助你纠正错误。

建模人员的意图是将智能体在流程图中花费的时间添加到直方图中。但是,Anylogic会针对代码中的错误名称报错。

您可以做的是保留您确信的名称部分,然后调用代码完成(Ctrl+Space或Option+Space),并从建议选项中选择正确的选项。

代码完成操作

现在,如果您再次按构建模型(或F7),您将看到错误已经解决。您可以通过Error demo – name resolution 示例[ZIP]亲自尝试。

名称解析:它不会显示在代码完成中

您跟随一个错误,它表示命名错误,所以您调用代码完成,但它没有给您正确的选项。如果您需要的元素在画布上可见,但没有显示在代码完成中,请检查它是否标记为忽略。

元素没有显示在代码完成中的原因(点击放大)

取消选中忽略选项,然后按构建模型(或F7)查看错误是否已解决。您可以通过Error demo – name resolution 示例[ZIP]亲自尝试。

名称字段解析:参数名称错误

该错误表示任务优先级 :priority_value的名称不正确。由于这指的是一个智能体,而该智能体是Customer,因此您应该在Customer智能体的元素中查找解决方案。

修复错误的参数名称(点击放大)

事实证明,有一个名为priority_level的参数,这就是您想要的。更改任务优先级参数中的名称,然后按构建模型(或F7)查看错误是否消失。您可以通过Error demo – name field resolution示例[ZIP]亲自尝试。

名称字段解析:未指定对象类型

单元指出了一个名为employeePool的资源单元。如果您在Employee智能体中查找一个名为skill_rating的元素,您会在那里看到它,所以问题不在于前面示例中的命名。

错误在发现错误的Seize模块中,应指定您所提及的单元(智能体)的类型。首先,您需要转换一个特定的单元:(Employee)unit。然后,您需要让AnyLogic知道skill_rating属于整个对象((Employee)unit).skill_rating。

指定对象类型

您可以通过Error demo – name field resolution示例[ZIP]亲自尝试一下。

编译时错误2:“类型[OJECT_type]中的方法[FUNCTION(ARG)]不适用于参数[(ARG)]” (The method [FUNCTION(ARG)] in the type [OBJECT_TYPE] is not applicable for the arguments [(ARG)])

当传递给方法或函数的参数与预期值不匹配时,就会发生这样的错误。

参数类型错误(点击放大)

用户所做的是将参数类型设置为double,但在Delay模块中,他们只传递了一个值。因此,添加第二个值可以解决问题。

添加第二个值以解决问题(点击放大)

您可以通过Error demo – name field resolution示例[ZIP]自己尝试一下。

编译时错误3:“类型不匹配:无法从[Type_A]转换为[Type_B]” (Type mismatch: cannot convert from [TYPE_A] to [TYPE_B])

如果模型中的变量类型不正确,则会出现此错误。

模型中类型不正确的变量(点击放大)

在示例模型中,问题出现在SelectOutput模块的Condition中。Customer智能体中的某个元素出现问题。您会发现,类型设置为Double,而SelectOutput模块的Condition字段要求它为Boolean。把Double换成Booleam,问题就解决了。

您可以用Error demo – type mismatch 示例[ZIP]亲自尝试。

编译时错误4:“语法错误,[MESSAGE]” (Syntax error, [MESSAGE])

这些信息非常简单明了。让我们看看最常见的信息是什么,以及如何解决它们。

“)”字符出现语法错误,请删除此字符。这意味着有一个额外的字符,你需要删除它。 语法错误,插入“)”以完成表达式。表达式中缺少字符。表达式是变量、运算符和函数的组合,计算结果为一个变量。示例:2*(3+4)将是语句int result=2*(3+4)中的一个表达式;。 语法错误,插入“;”以完成语句。语句中缺少一个字符。在Java中,语句是一个完整的执行单元。它可以执行一个操作或更改一个状态。示例:int年龄=25;。 语法错误,请插入“}“以完成BlockStatements。语句模块中缺少一个字符。语句模块是大括号{}中的一组语句。 编译时错误5:“无法访问的代码” (Unreachable code)

如果您看到此错误,则代码位于终止语法之后,例如分号“;”之后。

编译时错误6:“[FUNCTION_NAME]方法未定义类型[OJECT_type]” (The method [FUNCTION_NAME] is undefined for the type [OBJECT_TYPE])

这个错误也很简单。发生这种情况的原因可能是您调用的函数对于某个对象类型不存在。它通常是由打字错误引起的。

编译时错误7:特定于状态图的编译错误

在状态图中必须遵循某些逻辑规则。在这方面,您可以看到的最常见错误可能是:

悬空的状态图进入。进入点没有连接到任何东西,但如果从面板添加状态,错误就会消失。 悬空的状态图进入 分支状态没有向外的变迁。您只需要添加一个从分支指向另一个元素的新转换。 分支状态没有向外的变迁 运行时错误

这些都发生在模型执行过程中,并且与Java相关或符合逻辑。控制台中详细介绍了此类错误。

运行时错误1:“智能体无法离开端口[NAME],它没有连接” (Agent cannot leave port [NAME], it has no connections)

此仿真逻辑错误与离散事件流程图有关。

智能体无法离开端口

在这种情况下,您会收到消息“Agent cannot leave port root.shortDelay.out”,因此您需要添加一个Delay或Sink模块。您可以在Error demo – no port connections 示例[ZIP]中亲自尝试。

运行时错误2:“智能体无法在时间[TIMESTAMP]/date[DATESTAMP]离开端口[NAME]” (An agent was not able to leave the port [NAME] at time [TIMESTAMP]/ date [DATESTAMP])

这是另一个与仿真逻辑和流程图相关的错误。当达到下一个模块的容量时,它通常是由Source 模块引起的。

由于容量限制,智能体无法离开端口

您可以手动增加容量或使用Pull协议。您可以在 Error demo – leave port示例[ZIP]中亲自尝试。

运行时错误3:“[TYPE_A]无法强制转换为[TYPE_B]” ([TYPE_A] cannot be cast to [TYPE_B])

当您试图将智能体强制转换为与其实际运行时类型不兼容的智能体类型时,会触发Java代码错误。

假设模型中有两种智能体类型:EmployeePrimary和EmployeeBackup。对于这些,您在Main中有两个资源池。

但是,当您运行该模型时,它会尝试将EmployeeBackup转换为EmployeePrimary,这会导致错误。这里的解决方案是让模型检查单元的实际类。将条件添加到Seize模块中的单元评分参数中。

修复不正确的类型转换

您可以在 Error demo – incorrect casting 示例[ZIP]中亲自尝试。

运行时错误4:“NullPointerException”

当您尝试直接对null值执行操作时,它会被触发(“null”是一个Java关键字,表示缺少值)。

请参阅Error demo – null pointer示例[ZIP]。

运行时错误5:“IndexOutOfBoundsException”

当您试图根据集的大小访问无效索引处的集(例如,数组或列表)时,就会发生这种情况。正确的索引不应低于0或高于集的大小。

修复无效索引错误(点击放大)

您可以在 Error demo – index out of bounds示例[ZIP]中尝试索引。

结论

在这里,我们介绍了当您开始在AnyLogic中构建模型时可能会看到的一些最常见的编译时和运行时错误。有了这篇文章中的建议,您可以尝试自己处理更复杂的问题。也可以在AnyLogic帮助:疑难解答中搜索答案和提示。

订阅我们的月度资讯,我们会将最新的博客文章直接发送到您的收件箱。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有