进餐:如何根据特定条件获得特定的代理集?

时间:2019-08-05 03:18:13

标签: agent-based-modeling repast-simphony

我以前使用Netlogo,并且有一些非常好的内置方法,这些方法使我可以从总人口中筛选和控制所需的代理。 (请参阅:http://ccl.northwestern.edu/netlogo/docs/dictionary.html#agentsetgroup)。例如,我可以很容易地通过简单的代码(如

)在模拟中命令不同类别的人员代理
 ask peoples with [wealth_type = "rich"] [donate money...] 
 ask peoples with [wealth_type = "poor"] [get money from rich people...]

在Repast中,是否存在专门用于轻松控制代理集的方法列表?

1 个答案:

答案 0 :(得分:3)

Repast Simphony Java中的等效项是使用查询。查询将断言应用于上下文中的每个代理,并在迭代器中返回评估为true的谓词。 PropertyEquals查询将代理的w / r属性评估为某个值(例如“ wealth_type”和“ rich”)。请注意,此处的“属性”是指Java属性,即getter类型的方法:

String getWealthType() {
     return wealthType;
}

其中“ wealthType”是属性的名称。

作为示例,在JZombies示例模型中,我们可以查询能量等于5的人类。

Query<Object> query = new PropertyEquals<Object>(context, "energy", 5);
for (Object o : query.query()) {
    Human h = (Human)o;
    System.out.println(h.getEnergy());
}

query()迭代器返回能量等于5的所有人类。

通过提供自己的谓词,在等效性测试中会变得更加复杂。例如,

PropertyEqualsPredicate<Integer, Integer> pep = (a, b) -> {
    return a * 2 == b;
};

Query<Object> query2 = new PropertyEquals<Object>(context, "energy", 8, pep);
for (Object o : query2.query()) {
    Human h = (Human)o;
    System.out.println(h.getEnergy());
}

在这里,我们正在检查能量* 2 ==8。谓词在第一个参数中传递了代理的属性值,在第二个参数中传递了要与之进行比较的值。鉴于谓词返回的是布尔值,您还可以测试不等式(大于等)。

Simphony提供了多种查询。看到

https://repast.github.io/docs/api/repast_simphony/repast/simphony/query/package-summary.html https://repast.github.io/docs/RepastReference/RepastReference.html#_repast_model_design_fundamental_concepts

了解更多信息。

您也可以使用Simphony的ReLogo方言来做到这一点:

ask (turtles()){
    if (wealth_type == "rich") {
        donateMoney()
    }
    if (wealth_type == "poor") {
        getMoneyFromRichPeople()
    }
}

如果您只想收集richTurtles,可以这样做(其中“ it”是访问使用findAll进行迭代的单个海龟的默认方法):

richTurtles = turtles().findAll{
    it.wealth_type == "rich"
}

或带有显式的闭包参数:

richTurtles = turtles().findAll{x->
    x.wealth_type == "rich"
}