繁体   English   中英

如何在Anylogic的一个流程图中处理不同的材料?

[英]How can I handle different materials in one flowchart in Anylogic?

对于我的流程图,我通过不同的来源生成了三种不同的代理。 现在,我想在流程图的不同块中以不同的方式处理它们。 例如,我希望代理具有不同的延迟时间。 由于我是AnyLogic的新手,并且对Java不太了解,因此在理解如何处理模型中的代理程序方面遇到了问题。

我给代理提供了一个带有名称的字符串参数,并尝试使用带有if-else语句的函数来区分代理在延迟中的情况。 下图总结了我的方法(希望我做对了):

该函数中的代码是:

if (agent.TypeComponent == "blade" || agent.TypeComponent == "narcelle")
return uniform(3.5, 6);
else return uniform(1, 3);

我收到错误报告(从德语翻译):

无法将代理求解为变量。

Main类型的delayPrepFeeder()方法不适用于参数(Agent)

谢谢您的光临。

简短的答案:您只能让一种座席类型在流程图中流动并正确使用。 因此,要么仅使用一个源,要么确保所有源都创建相同的代理类型,例如。 组件 有关以下各个方面的更多详细信息。


流程图代理类型定义

每个流程图块都有一个已定义的代理类型,该块期望该类型:

流程图代理类型定义

您仍然可以通过流程图发送与此定义的代理类型不匹配的代理,但是您将无法访问其任何变量,参数和功能! 如果仍然尝试访问非定义类型的字段,则会出现此错误: MyField cannot be resolved or is not a field 为什么? 因为当您通过agent.访问流动代理时agent. 那么您正在使用的Java类型将是已定义的Agent类型,或者换句话说,您的Agent已被强制转换为已定义的类型,无论之前的实际类型是什么。

源代理类型

确保在“源”中将“ 新代理”和“ 代理类型”设置为特定的代理类型:

源代理类型定义

新建代理”设置定义了所创建的流动对象的实际类型。 代理类型在所有流程图块中都可用,它定义为可以处理流动对象的类型(或在Java speek中:访问agent时将其转换为哪种类型)。

功能输入参数

delayPrepFeeder()函数中,检查是否已定义输入参数并将其定义为正确的类型。 这样做(当然使用您自己的自定义类型名称):

功能输入定义

该代码将必须使用您刚刚为输入参数定义的名称(此处为myAgent)。 在这个函数中,你不能使用直接访问代理agent ,这只能直接在流程图的块。 因此,我们定义了输入参数myAgent并使用对agent的引用来调用该函数。 同样,流程流模块将为您提供agent的调用,该agent具有此流程图块中定义的类型的对象引用,该对象引用必须与Source中定义的类型以及您在输入参数和函数中使用的类型都匹配。

if (myAgent.TypeComponent.equalsIgnoreCase("blade") || myAgent.TypeComponent.equalsIgnoreCase("narcelle")){
    return uniform(3.5, 6);
}
else {
    return uniform(1, 3);
}

我真的需要在一个流程图中使用几种不同的代理类型吗?

你可能不会。

如果您的类型仅因属性而异,请使用字段(变量和参数)来区分它们。 例如,始终使用代理类型Component ,然后使用称为type的参数进行区分。 type参数可以是String(例如:“ Rotorblade”),甚至可以是AnyLogic Option List中的条目,您可以在其中预先定义所有可能的类型。

真正需要不同类型的唯一情况是,您的代理类型内部具有完全不同(复杂)的状态图,操作图,可视化或其他自定义的AnyLogic元素。

如果我真的需要一个流程图中的几种代理类型怎么办?

您可以使用继承来实现。 创建一个“基本”代理(到目前为止,它只是一个普通的代理),例如Component 该基本代理将是您设置为在所有流程图块中流过的类型的代理。 在此基本Agent内,添加所有类型通用的并且要在流程图中访问的所有变量,参数,函数等。

接下来,创建继承的代理。 再次,将它们创建为普通代理类型。 您可以使用以下简单设置使它们从基本代理继承:

继承代理

现在您将看到,在基本代理中定义的内容也将在继承的代理中显示(灰色):

基本代理和继承的代理

还有一件事:通过使用(MyInheritedAgent)agent从基类型强制转换为正确的类型,您实际上可以访问继承的代理的字段和功能。 但是,您必须事先确保此对象确实是这种类型,否则会出现转换错误。

结论

每个AnyLogic流程图只能(不使用继承的代理)仅使用一种代理类型。 因此,请确保在以下位置始终将代理类型设置为相同的一种代理类型:

  • 资料来源:新特工
  • 来源:代理商类型
  • 流程图块:代理类型
  • 与流动agent配合使用的功能:输入参数

如果还不够,请使用代理继承。


作为附带说明,请使用equals()equalsIgnoreCase()代替==进行字符串比较,原因在进行了说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM