当前位置: 首页 > 知识库问答 >
问题:

使用参数和源块创建代理

商鸿哲
2023-03-14

我用几个参数创建了自己的流程图块。其中两个是“代理”类型,我主要选择了相应的代理。我的块所做的是,它根据进入块的代理创建新的代理(有点像批处理块)。

到目前为止,我能够验证传入的代理,以确保在Main中选择了正确的代理类型。现在我想创建另一个带有源块和注入功能的代理。但是我的问题来了。我想根据选择的参数(类型代理)动态地创建代理。显然,在新代理字段中只输入参数的名称是行不通的(它确实有效,但只适用于第一个代理——之后我得到一个错误,因为创建的是同一个代理)。我知道通常我必须使用像'new Agent()'这样的东西来创建新的代理,但是我找不到参数值和代理类型之间的联系。

我这里的问题是,我试图使我的块尽可能可定制,这意味着我希望在未来的项目中再次使用这个块,而不改变任何代码(或者至少不改变太多)。每个项目都有不同的代理、变量、名称、参数等。

编辑:增加了截图

我的街区的简化版

共有3个答案

程俊誉
2023-03-14

首先感谢你所有的提示。

我在原来的帖子中添加了一个小截图。如前所述,我的代码块背后的想法是,我希望根据传入的代理和参数生成新元素。例如,如果我已经将相关参数设置为代理“B”,我想将代理“A”转换为代理“B”。

我这里的问题不是实施。我能把一切都硬编码好。我的想法是创建我自己的自定义库,可以重复使用或与其他同事共享。因此,每个自定义块都应该尽可能地可定制和万无一失。

最后,我做了Felipe建议的类似事情——编写了一个使用instanceof的函数。

Agent a = null;

if(pToAgent instanceof Lot){
    a = new Lot();
}else if(pToAgent instanceof Magazine){
    a = new Magazine();
}else if(pToAgent instanceof Module){
    a = new Module();
}else{
    traceln("CustomUnbatch: Error - Undefined Agent-type");
}

return a;

这种解决方案唯一的缺点是,当添加新代理或启动新项目时,函数必须一次又一次地更改。也许将来我会包含映射表的想法,这样我就不必在函数中添加更多的行。

羊舌兴德
2023-03-14

我不确定这是否有帮助,但我认为它可以引导你找到正确的答案。。。我也不确定我是否真的明白你到底想要什么

首先,可以将源创建为总体,每个总体成员创建不同的代理类型...像这样:

在这个例子中,我有两个源的数组。。。现在,您需要从数组中的每个源生成不同的代理类型。。。为此,需要在返回代理的新代理参数上创建一个函数

此函数以该源总体的源的索引作为参数。。。这是一个局部变量,可以在创建对象总体时自由使用

现在,函数可以如下所示:

Agent x=null;
if(index==0)
    x=new MyAgent1();
else if(index==1)
    x=new MyAgent2();
    
return x;

现在唯一的问题是,每次在新模型上有新条件时,你都必须重写这个函数,但是根据你有多少代理类型,这可能不是那么多工作......

选择可以通过索引。。。所以你可以让它足够灵活,如果你有这样的东西。。。如果这是正确的方向,也许当你提供更多信息时,我们可以改进

当然,您可以使用源代码注入代理。获取(索引)。注入()

您使用的参数是索引,而不是代理类型

index -> agent type 

你模型中的其他地方

宁兴修
2023-03-14

有两种方法可以实现这一点:通过Java反射和使用Java。util。作用供应商请注意,这两种方法的缺点是,由于生成的代理的类型事先未知,代码将新实体称为代理,但它实际上创建了正确类型的代理,可以使用“instanceof”或cast进行检查。

下面提供了两个版本。示例. alp可以在接下来的2小时内找到。在这个例子中,有两个代理主代理和编程代理。

现在来谈谈创造的方法。

  1. 通过Java反射

这是两种方法中最不可取的一种。在示例主代理中,代码位于“直接创建”按钮的action属性中。代码如下,请阅读评论以获得更详细的描述。

// This is the name of the class that needs to be created
//  as a string. It can be passed as a parameter. 
// NOTE: you need the whole name including package name 
//  (in this case 'testprogcreation.' but you'll have your own) 
String classNameValue = "testprogcreation.ProgrammaticAgent";

try {
    // get a handle on the Class of that agent
    Class agentClass = Class.forName(classNameValue);
    
    // find the Constructor
    Constructor c = agentClass.getDeclaredConstructor(
        com.anylogic.engine.Engine.class,
        com.anylogic.engine.Agent.class,
        com.anylogic.engine.AgentList.class);
        
    // Create the agent. Now, because we don't know the type
    // at compile time it has to be declared as 'Agent' here
    // but in actuality it is of type specified in 'classNameValue' above
    Agent agent = 
        (Agent)c.newInstance(getEngine(), this, getDefaultPopulation());
    
    // add to default population
    ((AgentLinkedHashSet<Agent>)getDefaultPopulation())._add(agent);
        
    // set up parameters by name
    agent.setParameter("parameterOne", 5.0, false);
    agent.setParameter("parameterTwo", "some value", false);
    agent.markParametersAreSet(); // <- mark that parameters are set

    // tell AnyLogic that agent is created and started  
    agent.create();
    agent.start();
    
    // now you can do whatever with the agent, in this case send it
    // via 'enter' into some process
    enter.take(agent);
} catch (Exception e) {
    e.printStackTrace();
    error("Could not instantiate %s, see Console for full error", classNameValue);
}

这是一个更简洁的方法。在这里,将创建新代理的块有一个名为代理供应商(见图)的动态参数,java.util.function.供应商类型,并在需要新代理实例时调用agentSupplier.get()

然后向该供应商提供“添加”方法的参考,该方法在创建代理填充对象时由AnyLogic自动生成。在这种情况下,总体称为“programmaticAgents”,因此该方法称为“add_programmaticAgents(…”。

请注意,在上图中,默认值字段中的代码实际上会在封闭代理中更改,以反映正确的自动创建方法。

 类似资料:
  • 我试图从这里用我当前的应用程序实现数据源代理 我在Spring xml中配置了数据源对象,即在dataSourceProxy对象中传递dataSourceReal。 侦听器和过滤器与文档中一样正确配置。 Spring xml文件: 数据源名称的JNDI名称的xml文件: 我得到了这个错误: 请帮忙。

  • 本文向大家介绍JavaScript 使用rest参数创建参数数组,包括了JavaScript 使用rest参数创建参数数组的使用技巧和注意事项,需要的朋友参考一下 示例 如果您需要一个数组,其中包含您可能会或可能不会希望拥有的额外参数,除了您明确声明的参数外,还可以在参数声明内使用array rest参数,如下所示: 示例1,数组中的可选参数: 示例2,所有参数现在都是一个数组: 控制台输出tru

  • 4.4.1 模块的创建和使用 在 Python 语言中,模块对应于 Python 程序文件,即每个 Python 程序文件就是一个模块。 模块是 Python 程序的最高层结构单元,用于组织程序的代码和数据,以便能被同一程 序的其他模块甚至被其他程序重用。一个模块可以导入其他模块,导入后就可以使用其他模 块中定义的函数、类等对象。 用模块作为程序的结构单元,至少有三个作用: (1)代码重用:将代码

  • 我需要生成一个具有以下参数的JWK: > “kty”:键类型 “孩子”:密钥标识 “使用”:“sig”公钥使用 “n”:模数 “e”:“AQAB”公众指数 "x5c": X.509证书链 “x5t”:X.509证书SHA-1指纹 注: > 应包含使用“x5t”(X.509 SHA-1指纹)和“x5c”(X.509证书链)参数的X.509证书 前5个参数(kty,孩子,使用,n,e)相当简单,不是问

  • 使用JavaAPI设置源和设置的唯一方法是使用这样的代码(这是一个只有一个@test方法的简单测试类): 当我第一次运行它时,它就起作用了。但当我第二次运行它时,我得到: JAVAlang.IllegalStateException:未能加载ApplicationContext allable.java:12DefaultCacheAware ContextLoaderDorg.springfra

  • 我在一家公司实习。我被要求找到一种方法,使用java在其中一个系统中实现snmp代理。我试图为java找到一个免费的MIB编译器,但失败了。因此,我尝试使用SNMP4J agentX库来实现这一点(因为他们明确表示需要主代理和子代理)。我以前从未使用过它,所以我很难实现它。库包中有一个示例主代理和子代理。我不明白如何修改它以包含我自己mib文件中的变量。或者,如果任何人有一个更简单的主代理或子代理