如何从数据库中读取概率分布并将它们保存在集合中
How to read probability distributions from a database and save them in collections
我正在从 Arena 迁移到 AnyLogic,并且对发行版有疑问。我需要根据某些代理参数使用不同的分布。我已经看到了这里的建议,但是分布的数量太多了,我不想硬编码它们。
在 Arena 中,可以创建表达式数组并将它们 link 到数据库(例如 excel),并使用这些参数从表达式数组中获取分布。我尝试使用 AnyLogic 中的集合来做同样的事情,但无法将字符串(例如 "uniform(100,120)")转换为分布。
- AnyLogic 中有什么方法可以将分布存储在集合中吗?
- AnyLogic 有没有办法从数据库中读取分布?
谢谢
你说的一切都是可能的..至少有4种方法可以做到:用分布创建代理,创建分布集合classes,执行你提到的字符串表达式并读取和计算直接从数据库。在这种特殊情况下,我喜欢带有 classes 的选项,表达式 one 对您来说更简单,但我可能会稍后写下所有其他选项:
使用 ExecuteExpression
如果您设法创建了一个包含代表您的分布的字符串的集合,您可以这样做:
executeExpression("uniform(100,200)");
或者在你的情况下有一个集合(无论你选择什么 "i")
executeExpression(collection.get(i));
但是这样很难看,所以我会做复杂而酷的方法
使用数据库
第一件事显然是用您的信息创建一个数据库。我会假设,因为这似乎是你的情况,你想要有一个分布的集合,这些分布都是统一的。所以数据库将如下所示:
其中 cum_probability 是要选择的分布的累积概率,最大值和最小值将代表均匀(最小值、最大值)分布的参数。
使用 Class
的分布集合
现在我们将创建一个包含所有这些信息的 class:
public class Distribution implements Serializable {
public double probability;
public double min;
public double max;
/**
* Default constructor
*/
public Distribution(double probability,double min,double max) {
this.probability=probability;
this.min=min;
this.max=max;
}
public double getDistributionResult() {
return uniform(this.min,this.max,new Random());
}
}
您还将创建一个集合:
并且您将在启动时在 Main 中初始化您的集合
List <Tuple> theList=selectFrom(distributions).list();
for(Tuple t : theList){
distributionsArray.add(
new Distribution(t.get(distributions.cum_probability),
t.get(distributions.minimum),
t.get(distributions.maximum))
);
}
好的,现在你有了一组分布。伟大的。唯一剩下的就是创建一个函数,它将 return 随机收集分布结果:
double rand=uniform();
List <Distribution> filtered=filter(distributionsArray,d->d.probability>=rand);
return top(filtered,d->-d.probability).getDistributionResult();
我正在从 Arena 迁移到 AnyLogic,并且对发行版有疑问。我需要根据某些代理参数使用不同的分布。我已经看到了这里的建议,但是分布的数量太多了,我不想硬编码它们。
在 Arena 中,可以创建表达式数组并将它们 link 到数据库(例如 excel),并使用这些参数从表达式数组中获取分布。我尝试使用 AnyLogic 中的集合来做同样的事情,但无法将字符串(例如 "uniform(100,120)")转换为分布。
- AnyLogic 中有什么方法可以将分布存储在集合中吗?
- AnyLogic 有没有办法从数据库中读取分布?
谢谢
你说的一切都是可能的..至少有4种方法可以做到:用分布创建代理,创建分布集合classes,执行你提到的字符串表达式并读取和计算直接从数据库。在这种特殊情况下,我喜欢带有 classes 的选项,表达式 one 对您来说更简单,但我可能会稍后写下所有其他选项:
使用 ExecuteExpression
如果您设法创建了一个包含代表您的分布的字符串的集合,您可以这样做:
executeExpression("uniform(100,200)");
或者在你的情况下有一个集合(无论你选择什么 "i")
executeExpression(collection.get(i));
但是这样很难看,所以我会做复杂而酷的方法
使用数据库
第一件事显然是用您的信息创建一个数据库。我会假设,因为这似乎是你的情况,你想要有一个分布的集合,这些分布都是统一的。所以数据库将如下所示:
使用 Class
的分布集合现在我们将创建一个包含所有这些信息的 class:
public class Distribution implements Serializable {
public double probability;
public double min;
public double max;
/**
* Default constructor
*/
public Distribution(double probability,double min,double max) {
this.probability=probability;
this.min=min;
this.max=max;
}
public double getDistributionResult() {
return uniform(this.min,this.max,new Random());
}
}
您还将创建一个集合:
并且您将在启动时在 Main 中初始化您的集合
List <Tuple> theList=selectFrom(distributions).list();
for(Tuple t : theList){
distributionsArray.add(
new Distribution(t.get(distributions.cum_probability),
t.get(distributions.minimum),
t.get(distributions.maximum))
);
}
好的,现在你有了一组分布。伟大的。唯一剩下的就是创建一个函数,它将 return 随机收集分布结果:
double rand=uniform();
List <Distribution> filtered=filter(distributionsArray,d->d.probability>=rand);
return top(filtered,d->-d.probability).getDistributionResult();