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

RepastJava:创建自定义边缘代理来安排特定操作

裴俊豪
2023-03-14

我有一个模型,在不同种类的其他代理(对象)之间有很多边(链接)。我想将这些边建模为代理,在那里我可以添加属性并安排操作。看看如何做这项工作的简单例子很有帮助?

更新:我按照您的说明运行模型时出错:

FATAL [Thread-2] 12:45:02,901 repast.simphony.ui.GUIScheduleRunner - RunTimeException when running the schedule
Current tick (1.0)
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at repast.simphony.engine.schedule.DynamicTargetAction.execute(DynamicTargetAction.java:72)
    at repast.simphony.engine.controller.ScheduledMethodControllerAction$ScheduleMethodAllAction.execute(ScheduledMethodControllerAction.java:333)
    at repast.simphony.engine.schedule.DefaultAction.execute(DefaultAction.java:38)
    at repast.simphony.engine.schedule.ScheduleGroup.executeList(ScheduleGroup.java:205)
    at repast.simphony.engine.schedule.ScheduleGroup.execute(ScheduleGroup.java:231)
    at repast.simphony.engine.schedule.Schedule.execute(Schedule.java:352)
    at repast.simphony.ui.GUIScheduleRunner$ScheduleLoopRunnable.run(GUIScheduleRunner.java:52)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.reflect.InvocationTargetException
    at jzombies.Zombie$$FastClassByCGLIB$$6141f31.invoke(<generated>)
    at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
    at repast.simphony.engine.schedule.DynamicTargetAction.execute(DynamicTargetAction.java:69)
    ... 7 more
Caused by: java.lang.NullPointerException
    at repast.simphony.query.PropertyGreaterThan.createPredicate(PropertyGreaterThan.java:72)
    at repast.simphony.query.AbstractPropertyQuery.query(AbstractPropertyQuery.java:83)
    at jzombies.Zombie.query_energy(Zombie.java:141)
    at jzombies.Zombie.step(Zombie.java:67)
    ... 10 more

我认为它受到僵尸中这种方法的影响:(但我不知道哪里错了,因为错误消息没有提供具体的说明)

    public void query_energy() {
//      Zombie this_zombie = new Zombie (space, grid, 9999);
        Context<Object> context = ContextUtils.getContext(this);
        Query<Object> query = new PropertyGreaterThan<Object>(context, "id", 2);
        for (Object o : query.query()) {
            Zombie h = (Zombie)o;
            System.out.println("zombie id: " + h.getID());
        }

    }

共有1个答案

穆鸿波
2023-03-14

下面是一个基于JZombies_演示模型的示例

首先创建一个CustomEdge类。

package jzombies;

import repast.simphony.space.graph.RepastEdge;

public class CustomEdge<T> extends RepastEdge<T> {

    private double customProperty;

    public double getCustomProperty() {
        return customProperty;
    }

    public void setCustomProperty(double customProperty) {
        this.customProperty = customProperty;
    }

    public CustomEdge(T source, T target, boolean directed, double weight) {
        super(source, target, directed, weight);
    }

    public CustomEdge(T source, T target, boolean directed) {
        super(source, target, directed);
    }

    public void customAction() {
        // define custom action here
    }
}

然后是CustomedEcreator类:

package jzombies;

import repast.simphony.space.graph.EdgeCreator;

public class CustomEdgeCreator<T> implements EdgeCreator<CustomEdge<T>, T> {

    public Class<CustomEdge> getEdgeType() {
        return CustomEdge.class;
    }

    public CustomEdge<T> createEdge(T source, T target, boolean isDirected, double weight) {
        return new CustomEdge<T>(source, target, isDirected, weight);
    }

}

然后,当您在JZombiesBuilder类中定义NetworkBuilder时,您提供了一个CustomEdgeCreator实例:

NetworkBuilder<Object> netBuilder = new NetworkBuilder<Object>(
                "infection network", context, true).setEdgeCreator(new CustomEdgeCreator());
        netBuilder.buildNetwork();

此时,无论何时向网络添加边缘,您都将能够访问边缘实例并计划您定义的任何自定义操作,例如,在Zombie类中:

    Network<Object> net = (Network<Object>)context.getProjection("infection network");
    CustomEdge edge = (CustomEdge)net.addEdge(this, zombie);
    RunEnvironment.getInstance().getCurrentSchedule().schedule(
            ScheduleParameters.createOneTime(RunEnvironment.getInstance().getCurrentSchedule().getTickCount() + 20), edge, "customAction");

我希望这有帮助。

 类似资料:
  • 最初只创建一个自定义边缘的解决方案是:Repast Java:创建一个自定义边缘代理来安排特定的操作 1)。现在我需要创建一种以上的自定义边缘来充当唯一代理(例如,在我的模型中,我有路由代理、供应链接代理、关系链接代理)。我必须再次重复链接中描述的上述过程吗?(即添加另一个专用的CustomEdgeCreator类和具有不同名称的CustomEdge类),或者有更有效的方法吗? 2).给定Zomb

  • 本文向大家介绍neo4j 创建边缘,包括了neo4j 创建边缘的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 如何定制AWS Codestar/Cloudformation模板以创建特定的代码构建项目 像lambda这样的资源很好SAM 问题是,当我试图添加代码构建设置时,使用Yaml作为模板的特定docker映像(需要使用Python3.7而不是默认的2.7)。yml构建规范。yml Lambda创建成功,但是代码构建部分被忽略,并且什么也没有发生 编辑2我能够编辑CF模板来强制创建另一个代码构建项目。

  • 问题内容: 我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量… 例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 040011”。 我无法更改这些值- 它们通过他们的公司存在,已经在州,客户等中注册。我知道将年份和其余年份分隔到单独的列中会很好,但这是不可能的。我什至不能真正做到“内部”,因为每一

  • 我正在为Cytoscape版本3.8.2中的网络创建一个手动布局。我希望能够定义边缘长度,这样网络看起来更均匀。有定义属性边长的方法吗? 具体地说,我希望像下面的网络小节是一个完美的圆。

  • 问题内容: 注释如何与Java一起使用?以及如何创建这样的自定义注释: 基本上,我需要保留的POJO在持久化时像这样进行序列化: 这样,实际的生成/持久对象是这样的: 任何想法如何实现这一点? 问题答案: 如果创建自定义注释,则必须使用此处的 API 示例进行处理。您可以参考如何声明注释。 这是Java中的示例注释声明的样子。 并被称为。 表示您想在运行时保留注释,并且可以在运行时访问它。 表示您