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

Repast Java:以结构化方式调度代理和全局行为

柳玄裳
2023-03-14

我之前与Netlogo合作多年,我非常习惯于基于一系列过程开发基于代理的模型。供应链仿真模型结构的示例如下所示:

;;the main simulation loop
@ScheduledMethod(start = 1, interval = 1)
public void step() {       
    place-order-to-suppliers() ;;procedures involving customer agent behaviors (a number of methods)
    receive-shipment-from-suppliers() ;;procedures involving both supplier and customer agents and their behaviors (methods)
    receive-order-from-customers()  ;;procedures involving supplier agent only 
    ship-order-to-customers() ;;procedures involving supplier agent only
    summarize()  ;;procedures involving global summary behaviors independent of any agents, as well as local summary behaviors per each type of agents (customer and supplier)
}

上述结构对于开发模拟模型非常有用和直观。我们首先将模拟世界分成几个关键部分(过程),在这些部分中,我们进一步开发与相关代理和行为相关的特定方法。基本部分是建立一个更高级别的过程(如包),该过程可以用于将不同类型的代理及其行为/交互完全集成(打包)在一个地方,并根据这些过程以所需的顺序执行模型。

在Repast中实现这种模块化建模策略是否有任何提示/示例?

更新:下面是我写的一个简单的模型,是关于男孩和女孩在聚会上如何互动的(完整的参考资料可以找到)https://ccl.northwestern.edu/netlogo/models/Party).下面是男生班的代码(女生是一样的,所以不再粘贴)。

package party;

import java.util.ArrayList;
import java.util.List;

import repast.simphony.context.Context;
import repast.simphony.engine.environment.RunEnvironment;
import repast.simphony.engine.schedule.ScheduledMethod;
import repast.simphony.parameter.Parameters;
import repast.simphony.query.PropertyGreaterThan;
import repast.simphony.query.PropertyEquals;
import repast.simphony.query.Query;
import repast.simphony.random.RandomHelper;
import repast.simphony.space.continuous.ContinuousSpace;
import repast.simphony.space.grid.Grid;
import repast.simphony.space.grid.GridPoint;
import repast.simphony.util.ContextUtils;

public class Boy {
    private ContinuousSpace<Object> space;
    private Grid<Object> grid;
    private boolean happy;
    private int id, x, y,tolerance;
    private boolean over;

    Boy (Grid<Object> grid, int id, int x, int y) {
        this.grid = grid;
        this.id = id;
        this.x = x;
        this.y = y;
        Parameters p = RunEnvironment.getInstance().getParameters();
        int get_tolerance = (Integer) p.getValue("tolerance");
        this.tolerance = get_tolerance;
        }

//  @ScheduledMethod(start = 1, interval = 1,shuffle=true)
//  public void step() {
//      relocation();
//      update_happiness();
//      endRun();
//      
//  }

    public void endRun( ) {
        Context<Object> context = ContextUtils.getContext(this);
        Query<Object> query = new PropertyEquals<Object>(context, "happy", true);
        int end_count = 0;
        for (Object o : query.query()) {
           if (o instanceof Boy) {
               end_count ++;               
           }
           if (o instanceof Girl) {
               end_count ++;               
           }
        }
        if (end_count == 70) {
            RunEnvironment.getInstance().endRun();
        }
    }



    public void update_happiness() {
        over = false;
        Context<Object> context = ContextUtils.getContext(this);
        Parameters p = RunEnvironment.getInstance().getParameters();
        int tolerance = (Integer) p.getValue("tolerance");
        GridPoint pt = grid.getLocation(this);
        int my_x = this.getX();
        int boy_count = 0;
        int girl_count = 0;
        Query<Object> query = new PropertyEquals<Object>(context, "x", my_x);
        for (Object o : query.query()) {
            if (o instanceof Boy) {
                boy_count++;
            }
            else {
                girl_count++;
            }
        }
        int total = boy_count + girl_count;
        double ratio = (girl_count / (double)total);
//      System.out.println((girl_count / (double)total));
        if (ratio <= (tolerance / (double)100)) {
            happy = true;
//          System.out.println("yes");
        }
        else {
            happy = false;
//          System.out.println("no");
        }
        over = true;
//      System.out.println(over);
    }

    public void relocation() {
        if (!happy) {
            List<Integer> x_list = new ArrayList<Integer>();
            for (int i = 5; i <= 50; i = i + 5) {
                x_list.add(i);
            }   
            int index = RandomHelper.nextIntFromTo(0, 9);
            int group_x = x_list.get(index);
            while(group_x == this.getX()){
                index = RandomHelper.nextIntFromTo(0, 9);
                group_x = x_list.get(index);
            }
            int group_y = 35;
            while (grid.getObjectAt(group_x,group_y) != null) {
                group_y = group_y + 1;
            }
            this.setX(group_x);
            grid.moveTo(this, group_x,group_y);
        }
    }

    public int getTolerance() {
        return tolerance;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public int getID() {
        return id;
    }

    public boolean getHappy() {
        return happy;
    }

    public boolean getOver() {
        return over;
    }


    public void setTolerance(int tolerance) {
        this.tolerance = tolerance;
    }
}

---------------------------------------------------------------------------------
package party;

import java.util.ArrayList;
import java.util.List;

import repast.simphony.context.Context;
import repast.simphony.engine.environment.RunEnvironment;
import repast.simphony.engine.schedule.ScheduleParameters;
import repast.simphony.engine.schedule.ScheduledMethod;
import repast.simphony.engine.schedule.Schedule;
import repast.simphony.query.PropertyEquals;
import repast.simphony.query.Query;
import repast.simphony.util.ContextUtils;
import repast.simphony.util.collections.IndexedIterable;

public class Global_Scheduler {


    @ScheduledMethod(start = 1, interval = 1,shuffle=true)
    public void updateHappiness() {
        Context<Object> context = ContextUtils.getContext(this);
        IndexedIterable<Object> boy_agents = context.getObjects(Boy.class);
        IndexedIterable<Object> girl_agents = context.getObjects(Girl.class);

        for (Object b: boy_agents) {
            ((Boy) b).update_happiness();
        }
        for (Object g: girl_agents) {
            ((Girl) g).update_happiness();
        }
    }

    @ScheduledMethod(start = 1, interval = 1,shuffle=true)
    public void relocate() {
        Context<Object> context = ContextUtils.getContext(this);
        IndexedIterable<Object> boy_agents = context.getObjects(Boy.class);
        IndexedIterable<Object> girl_agents = context.getObjects(Girl.class);

        for (Object b: boy_agents) {
            ((Boy) b).relocation();
        }
        for (Object g: girl_agents) {
            ((Girl) g).relocation();
        }

    }


    @ScheduledMethod(start = 1, interval = 1,shuffle=true)
    public void summary() {
        Context<Object> context = ContextUtils.getContext(this);
        Query<Object> query = new PropertyEquals<Object>(context, "happy", true);
        int total_count = 0;
        int boy_count = 0;
        int girl_count = 0;
        for (Object o : query.query()) {
           if (o instanceof Boy) {
               total_count ++;  
               boy_count++;
           }
           if (o instanceof Girl) {
               total_count ++;  
               girl_count++;
           }
        }
        System.out.println("Total happy person: " + total_count);
        System.out.println("Total happy boys: " + boy_count);
        System.out.println("Total happy girls: " + girl_count);     
    }

    @ScheduledMethod(start = 1, interval = 1,shuffle=true)
    public void endRun( ) {
        Context<Object> context = ContextUtils.getContext(this);
        Query<Object> query = new PropertyEquals<Object>(context, "happy", true);
        int end_count = 0;
        for (Object o : query.query()) {
           if (o instanceof Boy) {
               end_count ++;               
           }
           if (o instanceof Girl) {
               end_count ++;               
           }
        }
        if (end_count == 70) {
            RunEnvironment.getInstance().endRun();
        }
    }
}

上面使用全局调度器代理运行模型的代码运行良好,结果应该是相同的。然而,我不确定模型的执行是否真的遵循了顺序(即更新_happiness()-

共有2个答案

双子民
2023-03-14

您可以在@ScheduledMethod注释中使用优先级,例如。,

@ScheduledMethod(start = 1, interval = 1, shuffle=true, priority=1)

较高优先级将在较低优先级之前运行。

诸葛砚文
2023-03-14

您提供的代码示例几乎与repast model agent中的代码示例完全相同——您只需更改注释行前缀;;在agent类中//并实现place-order-to-suppliers()等方法。典型ABM中的agent行为结构遵循这一精确结构。一种通用的“分步”方法,根据所需的执行顺序将各个子步骤组合在一起。

就餐常见问题解答中概述了许多行为安排方法:https://repast.github.io/docs/RepastReference/RepastReference.html#_scheduling.如您在示例中所提供的,通过注释进行计划将定期或在单个时间步重复该行为。您还可以通过直接在Repast schedule上放置操作,在模型中动态地安排时间。这种类型的调度适用于基于事件的行为,比如调度由模型中的其他事件触发的一次性行为。您还可以使用@Watch注释进行调度,这些注释会根据注释中指定的一组条件触发行为。

 类似资料:
  • tags: polipo linux 下的 shadowsocks 不提供全局代理的功能,因此不得不寻找其他办法。 因此我们引入 polipo,在 shadowsocks 提供的 socks5 代理的基础上提供 http 代理。 PAC全局代理 参考资料: Ubuntu 16安装shadowsocks-qt5并使用PAC全局代理 具体做法如下: 安装 pip sudo apt-get insta

  • 问题内容: 有什么方法可以简单地为gradle设置全局的,系统范围的代理? 是的,我知道 当前 文件中有.etc设置,但它仅在实际项目中有效。但 __ 我不会在每个gradle项目中都进行设置 而且由于我的本地网络配置,我不会更改项目的源代码。 那么,是否有任何“ global gradle.properties”文件? 问题答案: 是的,似乎有可能。见这里,尤其是: 我们可以定义一个文件并在该文

  • 本文向大家介绍jQuery 局部div刷新和全局刷新方法总结,包括了jQuery 局部div刷新和全局刷新方法总结的使用技巧和注意事项,需要的朋友参考一下 div的局部刷新 $(".dl").load(location.href+" .dl"); 全页面的刷新方法 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架

  • 我正在研究为Spark结构化流在kafka中存储kafka偏移量,就像它为DStreams工作一样,除了结构化流,我也在研究同样的情况。是否支持结构化流?如果是,我如何实现? 我知道使用进行hdfs检查点,但我对内置的偏移量管理感兴趣。 我期待Kafka存储偏移量只在内部没有火花hdfs检查点。

  • 本文向大家介绍结构化,半结构化和非结构化数据之间的差异,包括了结构化,半结构化和非结构化数据之间的差异的使用技巧和注意事项,需要的朋友参考一下 在大数据方面,我们知道它处理大量数据及其执行。简而言之,我们可以说大数据是一种处理大量数据的事物,并且由于数据量如此之大,因此从广义上讲,根据数据的组织方式定义了三类,即结构化,半结构化和非结构化数据。 现在,根据组织数据的级别,我们可以发现这三种类型的数

  • 用户界面区域和指南 这章涵盖了从移动应用到桌面应用的高层次结构,同时包含几点指导。 不同种类的应用需要处理不同的需求。例如: 在单一屏幕操作单一集中活动的应用(如计算器,相机和游戏) 主要用于不同活动之间切换并且不需要很深入指导的应用(如手机的电话功能会提供收藏,最近联系和联系人) 糅合广泛数据视图,并需要深层浏览的应用(如一个拥有不同文件夹的邮件应用程式或一个拥有商品分类的购物应用程式) 你的应