如何从AnyLogic数据库表中读取延迟时间分布信息并正确调用
问题原因
你遇到的报错是因为AnyLogic的数据库Code类型本质还是字符串存储,运行时读取到的分布表达式是普通字符串,不会被自动识别为可执行的函数逻辑,因此会报「Unresolved reference」错误。
解决方案
推荐优先使用第一种方案,稳定性更高:
方案1:拆分分布存储字段(推荐)
- 调整导入Excel的结构,把原来单个存储分布表达式的列拆分为3列:
分布类型(字符串类型,存uniform/normal等分布名)、参数1、参数2,如有三参数分布可再加参数3列 - 在AnyLogic项目中新增一个通用工具函数,用于根据分布类型和参数返回随机采样值:
// 函数定义:输入分布类型、参数1、参数2,返回采样值 public double getDistributionSample(String distType, double param1, double param2) { switch (distType.trim().toLowerCase()) { case "uniform": return uniform(param1, param2); case "normal": return normal(param1, param2); case "exponential": return exponential(param1); // 按需补充你用到的其他分布类型即可 default: throw new IllegalArgumentException("未支持的分布类型:" + distType); } }
- 按你的业务逻辑查询符合条件的行,遍历行时按如下逻辑处理:
- 生成
uniform(0,1)随机数,和该行存储的概率值对比,仅当随机数小于概率值时执行求和 - 读取该行的3-4组分布类型、参数,分别调用
getDistributionSample拿到采样值,累加得到总延迟时长
- 生成
方案2:直接解析分布表达式字符串
如果不希望调整原有Excel结构,可以用字符串拆分解析的方式实现:
- 读取分布表达式字符串后,通过正则拆分出分布名和参数,再调用上述工具函数获取采样值,示例代码如下:
// 读取数据库存储的分布字符串 String distStr = (String) selectFrom(你的表名) .where(你的筛选条件) .firstResult(你的分布列名); // 拆分分布名 String distType = distStr.split("\\(")[0].trim(); // 拆分参数 String[] paramStrs = distStr.split("\\(")[1].replace(")", "").split(","); double param1 = Double.parseDouble(paramStrs[0].trim()); double param2 = Double.parseDouble(paramStrs[1].trim()); // 获取采样值 double sampleValue = getDistributionSample(distType, param1, param2);
注意该方案要求Excel中存储的分布表达式格式完全规范,无拼写错误、多余符号,否则会出现解析错误。
内容的提问来源于stack exchange,提问作者user17334485
相关产品推荐
相关产品推荐

