从 Anylogic 中的直方图数据元素计算百分位数

Calculated Percentile from Histogram Data Element in Anylogic

我刚开始使用 Anylogic / JAVA 并组装了一个带有代理组件的流程图。该模型包括从整个流程图的多个位置提取直方图数据。我的目标是获取直方图数据的第 x% 个百分位值,这样我就可以获得 x% 的数据小于的变量值(在本例中为队列和延迟)。

帮助文件建议我可以指定我希望计算的低置信度值和高置信度值(即第 x% 个值)。但是,在 运行 时间内,我只看到图中显示了 CDF,并且百分位数不可用。如何提取百分位值 post-模拟以显示为输出? Anylogic 中是否有这样做的内置方法?

我找到的最接近的东西是“getCDF 函数,我必须在其中编写一个自定义函数来查找产生目标 x%th 值的最接近索引。如果我必须走自定义函数的路线,我开始了以下代码

我希望将各个直方图数据对象作为参数传递给函数,并能够在函数体内使用直方图数据方法。这不起作用,因为这些方法无法识别。我做错了什么?该函数应该接受一个变量直方图数据对象并给定一个指定的百分位数,计算通过 getCDF 函数迭代产生目标百分位数的按比例分配的索引值。

提前谢谢大家的帮助!

虽然我无法确认您的逻辑是否正确,但您的代码中存在一些基本错误

  1. histoName 的输入参数类型应该是 HistogramSmartData 而不是对象。这就是为什么“方法无法识别”

您可以使用完整代码验证对象的类型 - 请参阅下面的示例,我如何验证从调色板中拖出的直方图数据对象的类型为 HistogramSmartData。之后你可以在帮助中查找HistogramSmartData

  1. 您在 while 循环中使用了 do while 语法 - 而不是 java 中的语法 ;-)

要么

do {
   // Do stuff
} while (condition);

while (condition) {
   // Do stuff
}

下面的代码有效。

PS - 屏幕截图很棒 - 但代码更好 - 如果不是 iPhone 上的文本识别我曾经将你的图像转换为文本我不会回答这个问题;-)

int index = 0;
int indexStart = roundToInt(histoName.getXMin());
int indexStop = roundToInt(histoName.getXMax());
double temp1 = 0;
double temp2 = 0;
double size = histoName.getIntervalWidth();
double result;

while (temp2 < percentile) {
    index = indexStart;
    temp1 = histoName.getCDF(index);
    temp2 = histoName.getCDF(index+1);
    index++;
}

result = index * (percentile-temp1) /(temp2-temp1)+(index-1)*(temp2-percentile)/(temp2-temp1);
return result;