手动转换代理并在AnyLogic中访问其类型为SelectOutputOut的参数?

时间:2019-01-24 11:47:54

标签: anylogic

我了解到,可以通过将整个过程中的代理类型更改为通用Agent来将不同类型的代理插入同一块中(感谢Amy很好地工作)。 snapshot

但是,我对如何使用手动强制转换selectOutputIn1来解决问题感到困惑。每种代理类型都有一个名为p_new_location且类型为SelectOutputOut的参数。

我需要什么帮助

如果通过agent.p_new_location正确投射,则传递与selectOutputIn1等效的内容。

我尝试过的

通过手动强制转换创建函数

if( agent instanceof Wife){
    return ((Wife)agent).p_new_location ;
} else if(agent instanceof Child_M){
    return ((Child_M)agent).p_new_location ;
} else if(agent instanceof Child_F){
    return ((Child_F)agent).p_new_location ;}

how it looks with the error

不幸的是,您会看到一个错误,指出该方法必须返回SelectOutputOut类型的结果,尽管该方法已经定义。

每个类中的参数类型看起来与this完全一样。从模拟内部看,传递值之前看起来像this,传递值之后看起来像this。此外,我注意到在仿真过程中未显示诸如SelectOutputOut之类的不常见参数类型的值 as shown here。如您所见,参数(agecountDbtaken)及其值都存在,但p_new_location却没有。

解决方案

再次感谢艾米:)

  

编译器正在查看if / else if / else if。如果这些都不是正确的怎么办?如果最后一个else if是唯一的选择,只需将其更改为else或输入适合您要执行的代码。

这就是现在的代码

if( agent instanceof Wife){
    return ((Wife)agent).p_new_location ;
    } else if(agent instanceof Child_M){
        return ((Child_M)agent).p_new_location ;
    } else{
        return ((Child_F)agent).p_new_location ;}

感谢前进;

1 个答案:

答案 0 :(得分:0)

是的,AnyLogic可以在单个流程块中轻松处理多种代理类型。注意事项:

  • 确保将流程块设置为处理通用类型“ Agent”或母亲,父亲,孩子的父类。
  • 由于在同一块中有多种代理类型,因此您应该准备进行一些强制转换以获取任何类的特定信息。
  • AnyLogic代理一次不能出现在多个流程图块中,即使它们可以在许多集合中也是如此。它们也可以位于“否”流程图块中。在将业务代表发送到enter块之前,必须首先将其从其所在的任何其他块中删除(如果在其中)。例如,如果所有妻子都在队列中,则需要在调用enter.take(妻子)代码行之前从队列中删除妻子代理。