如何在AnyLogic中通过数据库表动态设置行人数量与速度?
在AnyLogic中关联数据库行人数据的解决方案
先说说你原有代码的问题
- 每次行人从PedSource出来都执行一次数据库查询,重复操作效率低,还可能导致数据不一致
- 只设置了速度,但没把pid和行人绑定起来,没法实现真正的“数据关联”
正确实现步骤
1. 提前加载数据库数据到模型
不要每次生成行人都查库,在模型启动时一次性把15条数据加载到全局变量里:
- 先在Main代理中创建一个全局列表,用自定义类存数据更清晰:
- 新建一个简单类(右键模型根节点 → 新建 → 简单类),命名为
PedestrianInfo,添加两个属性:String pid、double speed,并生成对应的getter/setter方法 - 在Main代理中定义全局变量:
List<PedestrianInfo> pedDataList = new ArrayList<>(); - 在Main的
onStartup事件中添加加载代码:// 一次性查询所有数据 List<Object[]> rows = executeQuery("SELECT pid, speed FROM table"); for(Object[] row : rows){ PedestrianInfo info = new PedestrianInfo(); info.setPid((String)row[0]); info.setSpeed((Double)row[1]); pedDataList.add(info); }
- 新建一个简单类(右键模型根节点 → 新建 → 简单类),命名为
2. 给行人Agent添加关联属性
打开你用的行人Agent(默认是Pedestrian,如果是自定义代理就打开自定义Agent),添加一个String pid属性,用来存储数据库里的pid(速度可以直接用Agent自带的comfortableSpeed)。
3. 修改PedSource的onExit事件代码
直接用提前加载的列表,给每个行人绑定对应的数据:
// 确保当前生成的行人索引不超过数据列表长度 if(getIndex() < main.pedDataList.size()){ PedestrianInfo info = main.pedDataList.get(getIndex()); // 绑定pid ped.pid = info.getPid(); // 设置自定义速度 ped.comfortableSpeed = info.getSpeed(); } // 如果行人数量超过15条,可在这里设置默认速度 else{ ped.comfortableSpeed = 1.3; // 默认速度,按需调整 }
4. 限制行人数量(可选)
如果你只需要生成15个行人,直接在PedSource的属性里设置最大数量为15,这样就不会出现索引超出的情况。
验证关联效果
可以在行人的onDraw事件里添加代码,把pid显示在行人上方,确认关联是否成功:
drawText(pid, getX(), getY()+1, Color.BLACK);
内容的提问来源于stack exchange,提问作者Jaskirat Singh
相关产品推荐
相关产品推荐

