如何从数据库中读取概率分布并将它们保存在集合中

Posted

技术标签:

【中文标题】如何从数据库中读取概率分布并将它们保存在集合中【英文标题】:How to read probability distributions from a database and save them in collections 【发布时间】:2019-04-19 00:32:03 【问题描述】:

我正在从 Arena 迁移到 AnyLogic,并且对分布有疑问。我需要根据一些代理参数使用不同的分布。我已经看到了这里的建议,但是分布的数量太大,我不想硬编码它们。

How to associate a probability distribution to Agents - Anylogic

在 Arena 中,可以创建表达式数组并将它们链接到数据库(例如 excel)并使用这些参数从表达式数组中获取分布。我尝试在 AnyLogic 中使用集合来做同样的事情,但无法将字符串(例如“uniform(100,120)”)转换为分布。

    AnyLogic 中是否有任何方法可以将分布存储在集合中? AnyLogic 中是否有任何方法可以从数据库中读取分布?

谢谢

【问题讨论】:

【参考方案1】:

您所说的一切皆有可能.. 至少有 4 种方法可以做到这一点:使用分发创建代理、创建分发类的集合、执行您提到的字符串表达式以及直接从数据库中读取和计算。在这种特殊情况下,我喜欢带有类的选项,并且表达式对您来说更简单,但我可能稍后也会写下所有其他选项:

使用 ExecuteExpression

如果您设法使用代表您的分布的字符串创建了一个集合,您可以这样做:

executeExpression("uniform(100,200)");

或者在你的情况下使用一个集合(无论你选择“i”是什么)

executeExpression(collection.get(i));

但这很丑,所以我会做复杂而酷的方式

使用数据库

显然,第一件事是使用您的信息创建一个数据库。我会假设,因为这似乎是您的情况,您希望拥有一个统一的分布集合。所以数据库将如下所示:

其中 cum_probability 是要选择的分布的累积概率,最大值和最小值将代表您的均匀(最小值、最大值)分布的参数。

使用类收集分布

现在我们将创建一个包含所有这些信息的类:

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))
    );

好的,现在您有了一个发行版集合。伟大的。剩下的就是创建一个返回随机集合分布结果的函数:

double rand=uniform();
List <Distribution> filtered=filter(distributionsArray,d->d.probability>=rand);
return top(filtered,d->-d.probability).getDistributionResult();

【讨论】:

谢谢 Felipe,exceuteExpression() 正是我想要的。均匀分布就是一个例子。问题是它们不是能够将参数存储在集合中并调用它们的相同类型的分布。将它们保存在代理中也是不可能的,因为确定使用哪个分布的参数不仅取决于代理类型,还取决于其他参数,例如时间。您是否有任何不喜欢 executeExpression 方法的具体原因?顺便说一句,你的上课方式绝对更酷,我会喜欢的。 我不知道...这只是一个偏好问题,executeExpression 有时有错误或太慢...只需使用它:) 当 executeExpression 有错误时,天哪,这很难发现您遇到的问题。

以上是关于如何从数据库中读取概率分布并将它们保存在集合中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 2 个集合中读取数据并从两个集合中保存数据并将其保存在 SpringBatch 的第 3 个集合中

如何从联合、离散、概率分布函数中进行数值采样

如何在 MatLab 中绘制概率密度函数?

机会的度量:概率和分布

在 Julia 中估计概率分布并从中采样

什么是均匀分布