AnyLogic - 自定义网络
AnyLogic - custom network
我仍然在使用 AnyLogic 时遇到问题...我正在开发一个流行病 SIRS 模型,我想定义我自己的网络。
特别是,我有这个矩阵定义年龄 class 之间的每日平均联系次数
因此我希望每个代理都根据这个矩阵与其他代理建立联系...这让我发疯:S
AgeClass 是使用以下函数计算的参数
我想用下面的代码设置一个在开始时发生一次的事件
现在我说的是"connect n times to a random agent"...我想说的是"connect n times to a random agent with AgeClass k"有什么办法吗?
感谢支持!
ps 当我写 int i = AgeClass
时,我采用代理的参数 AgeClass 的值,即 运行 代码,对吗?那么不同的代理会有所不同吗?
在 AnyLogic 中,您可以将矩阵表示为二维 Java 数组:
http://help.anylogic.com/topic/com.xj.anylogic.help/html/code/Arrays.html
初始化矩阵后,您可以使用元素'Link to agents'定义自定义联系网络:
http://help.anylogic.com/topic/com.xj.anylogic.help/html/agentbased/Link.html
可能您已经找到了解决方案。这是一种方法:
- 关于年龄,不需要那么大的if/else if序列。只需做这样的事情:
int ageClass = 0; // a variable of agents
ageClass = (int) floor(age / 5.0);
if (age >= 70.0 ) ageClass == 14; // just to be sure that max class is 14
return ageClass;
关于网络。我会创建一个名为 setup
的函数,这样您就可以在启动时将其放入代理操作中,例如setup();
你可以在代理级别创建一个link到代理对象(Person
在我的代码中,我使用连接名为 联系人 的对象)。该函数类似于:
// loop through age groups
for (int i = 0; i < network[0].length; i++) {
ArrayList<Person> ageGroupPeople = new ArrayList<Person>();
for (Person p : population ) {
if ( p.ageClass == i ) { ageGroupPeople.add(p) } \ create pool of potential alters by age
}
\ create network per agent
for (Person ego : population ) {
for (int k = 0; k < poisson(network[ego.ageClass][i]); k++) {
Person alter = randomFrom(ageGroupPeople);
if ( ego != alter ) { ego.contacts.connectTo(alter);}
}
}
我还没有检查过代码以及可能有多慢,这只是一种方法。
我仍然在使用 AnyLogic 时遇到问题...我正在开发一个流行病 SIRS 模型,我想定义我自己的网络。
特别是,我有这个矩阵定义年龄 class 之间的每日平均联系次数
因此我希望每个代理都根据这个矩阵与其他代理建立联系...这让我发疯:S
AgeClass 是使用以下函数计算的参数
我想用下面的代码设置一个在开始时发生一次的事件
现在我说的是"connect n times to a random agent"...我想说的是"connect n times to a random agent with AgeClass k"有什么办法吗?
感谢支持!
ps 当我写 int i = AgeClass
时,我采用代理的参数 AgeClass 的值,即 运行 代码,对吗?那么不同的代理会有所不同吗?
在 AnyLogic 中,您可以将矩阵表示为二维 Java 数组: http://help.anylogic.com/topic/com.xj.anylogic.help/html/code/Arrays.html
初始化矩阵后,您可以使用元素'Link to agents'定义自定义联系网络: http://help.anylogic.com/topic/com.xj.anylogic.help/html/agentbased/Link.html
可能您已经找到了解决方案。这是一种方法:
- 关于年龄,不需要那么大的if/else if序列。只需做这样的事情:
int ageClass = 0; // a variable of agents
ageClass = (int) floor(age / 5.0);
if (age >= 70.0 ) ageClass == 14; // just to be sure that max class is 14
return ageClass;
关于网络。我会创建一个名为
setup
的函数,这样您就可以在启动时将其放入代理操作中,例如setup();
你可以在代理级别创建一个link到代理对象(
Person
在我的代码中,我使用连接名为 联系人 的对象)。该函数类似于:
// loop through age groups
for (int i = 0; i < network[0].length; i++) {
ArrayList<Person> ageGroupPeople = new ArrayList<Person>();
for (Person p : population ) {
if ( p.ageClass == i ) { ageGroupPeople.add(p) } \ create pool of potential alters by age
}
\ create network per agent
for (Person ego : population ) {
for (int k = 0; k < poisson(network[ego.ageClass][i]); k++) {
Person alter = randomFrom(ageGroupPeople);
if ( ego != alter ) { ego.contacts.connectTo(alter);}
}
}
我还没有检查过代码以及可能有多慢,这只是一种方法。