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

时间:2019-06-26 10:46:39

标签: java 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)

谢谢您的问候。

1 个答案:

答案 0 :(得分:1)

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


流程图代理类型定义

每个流程图块都定义了该块期望的代理类型:

Flowchart Agent type definition

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

源代理类型

确保在您的来源中将新代理代理类型设置为特定的代理类型:

Source Agent Type Definition

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

函数的输入参数

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

Function Input Definition

代码必须使用您刚刚为输入参数定义的名称(此处为myAgent)。在此功能内,您无法使用agent直接访问代理,这仅在流程图块中直接起作用。因此,我们定义了输入参数myAgent,并引用了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参数可以是字符串(例如:“ Rotorblade”),甚至可以是AnyLogic Option List中的条目,您可以在其中预先定义所有可能的类型。

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

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

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

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

Inherit Agent

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

Base Agent and Inherited Agent

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

结论

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

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

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


作为旁注,请使用equals()equalsIgnoreCase()代替==进行字符串比较,原因here进行了解释。