[英]Anylogic: How can I add multiple agents (jobs) to one resource at the same time in Anylogic 8.0?
[英]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.