AnyLogic智能体模型中,如何用数据库按时间生成飞机智能体?
解决方案:按数据库指定时间生成飞机智能体
不用流程库的Source块,也能轻松实现按数据库时间触发智能体生成,以下是具体步骤:
1. 预加载数据库计划数据
在模型启动事件(On startup)中,把数据库里的飞机生成计划(包含生成时间、智能体属性等字段)加载到有序集合里,确保按时间排序:
// 假设数据库表flight_data包含arrival_time(生成时间,单位与模型时间一致)、flight_id等字段 List<Map<String, Object>> flightSchedule = selectMapList("SELECT * FROM flight_data ORDER BY arrival_time");
2. 用事件链逐个触发生成
步骤细节:
- 创建一个
int类型变量currentFlightIndex,初始值设为0,用来追踪当前处理的计划条目。 - 创建自定义事件(命名为
generateFlight),在事件的Action中写入生成逻辑:// 获取当前计划的参数 Map<String, Object> currentPlan = flightSchedule.get(currentFlightIndex); double targetTime = (double)currentPlan.get("arrival_time"); // 创建飞机智能体并放置到机场附近 Plane newPlane = add_Plane(); // 替换为你的智能体类型和Population名称 newPlane.setLocation(airportNearbyPoint); // airportNearbyPoint是预设的机场附近坐标点 // 给智能体赋值属性(比如航班ID) newPlane.flightId = (String)currentPlan.get("flight_id"); // 处理下一条计划 currentFlightIndex++; // 若还有未处理计划,安排下一次事件触发 if(currentFlightIndex < flightSchedule.size()){ double nextTime = (double)flightSchedule.get(currentFlightIndex).get("arrival_time"); generateFlight.restart(nextTime - time()); } - 在模型启动事件中,安排第一次事件触发:
if(flightSchedule.size() > 0){ double firstTime = (double)flightSchedule.get(0).get("arrival_time"); generateFlight.schedule(firstTime); }
3. 更简洁的替代方案:批量创建一次性事件
如果不想维护索引变量,可在启动时直接为每个计划创建独立的一次性事件:
for(Map<String, Object> plan : flightSchedule){ double targetTime = (double)plan.get("arrival_time"); // 创建匿名事件到点执行生成逻辑 Event generateEvent = new Event(this){ public void action(){ Plane newPlane = add_Plane(); newPlane.setLocation(airportNearbyPoint); newPlane.flightId = (String)plan.get("flight_id"); } }; generateEvent.schedule(targetTime); }
注意事项
- 确保数据库时间单位与模型时间单位一致(比如统一为秒/分钟),避免时间偏差。
- 智能体的状态图默认在创建后会自动进入初始状态,无需额外触发。
内容的提问来源于stack exchange,提问作者Xadash
相关产品推荐
相关产品推荐

