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

Java 如何在Anylogic中处理一个流程图中的不同材料?,java,anylogic,Java,Anylogic,对于我的流程图,我通过不同的来源生成了三个不同的代理。现在我想在流程图中的不同块中以不同的方式处理它们。例如,我想为代理设置不同的延迟时间。由于我对AnyLogic不熟悉,对Java也不是很在行,因此我在理解如何处理模型中的代理时遇到了问题 我给代理一个带有名称的字符串参数,并尝试使用带有if-else语句的函数来区分延迟中的代理。下图总结了我的方法(我希望我做得对): 函数中的代码为: if (agent.TypeComponent == "blade" || agent

对于我的流程图,我通过不同的来源生成了三个不同的代理。现在我想在流程图中的不同块中以不同的方式处理它们。例如,我想为代理设置不同的延迟时间。由于我对AnyLogic不熟悉,对Java也不是很在行,因此我在理解如何处理模型中的代理时遇到了问题

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

函数中的代码为:

if (agent.TypeComponent == "blade" || agent.TypeComponent == "narcelle")
return uniform(3.5, 6);
else return uniform(1, 3);
我收到错误报告(翻译自德语):

无法将代理解析为变量

Main类型中的delayPrepFeeder()方法不适用于参数(代理)


谢谢您并致以亲切的问候。

简短而简单的回答:流程图中只能有一个代理类型,并正确使用它。因此,要么只使用一个源,要么确保所有源都创建相同的代理类型,例如组件。以下是关于不同方面的更多细节


流程图代理类型定义 每个流程图块都定义了此块所需的代理类型:

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

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

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

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

代码必须使用您刚才为输入参数定义的名称(此处:myAgent)。在该函数中,您不能使用
代理直接访问代理,这仅在流程图块中直接起作用。因此,我们定义了输入参数
myAgent
,并通过引用
agent
调用函数。同样,流程模块将为您调用
agent
此流程图块中定义类型的对象引用,该对象引用必须与源中定义的类型以及您在输入参数和函数中使用的类型相匹配

if(myAgent.TypeComponent.equalsIgnoreCase(“刀片”)| | myAgent.TypeComponent.equalsIgnoreCase(“纳塞尔”)){
返回制服(3.5,6);
}
否则{
返回制服(1,3);
}
我真的需要在一个流程图中使用几种不同的代理类型吗? 你可能不知道

如果您的类型仅因属性不同,请使用字段(变量和参数)来区分它们。例如,始终使用代理类型
组件
,然后使用名为
类型
的参数进行区分。此
类型
参数可以是字符串(例如:“Rotorblade”),或者更好的是来自的条目,您可以在其中预先定义所有可能的类型

真正需要不同类型的唯一情况是,在代理类型中有完全不同(复杂)的状态图、动作图、可视化或其他定制的AnyLogic元素

如果我真的需要在一个流程图中包含多个代理类型,该怎么办? 您可以使用继承来实现这一点。创建一个“基本”代理(到目前为止只是一个普通代理),例如组件。此基本代理将是您在所有流程图块中设置为流动类型的代理。在这个基本代理中,您添加了所有类型和所共有的变量、参数、函数等,您希望在流程图中访问这些变量、参数和函数

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

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

还有一件事:通过使用:
(MyInheritedAgent)agent
将继承代理从基类型强制转换为正确的类型,您可以实际访问继承代理的字段和函数。但是,您必须事先确保此对象确实属于此类型,否则您将得到一个强制转换错误

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

  • 资料来源:新代理人
  • 资料来源:代理类型
  • 流程图块:代理类型
  • 使用流动
    代理的函数
    :输入参数
如果一个还不够,请使用代理继承



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

非常感谢您的帮助,Florian。当延迟块尝试执行函数时,第一个错误仍然发生。我试过了(myAg)