You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数据库节点名称与AnyLogic节点关联以实现运输器调度

AnyLogic半导体生产仿真:运输器节点名称与模型节点匹配及调度实现

问题描述

我正在使用AnyLogic进行半导体生产仿真,需要控制运输器(Transporter)在各节点(Node)间移动。现有数据库包含3列:from、to、volume,其中from为运输器需优先访问的节点名称列表,to为后续访问的节点名称列表,需据此调度运输器在from到to节点间移动。模型内节点默认命名为A_1、A_2等,现在需要实现运输器按数据库数据移动,请问如何将数据库中的名称数据与现有节点匹配?

现有代码片段:

List<Tuple> rows = selectFrom(sheet1).list();
for (Tuple row : rows) {
    String fromNodeName = row.get(sheet1.from_db);
    String toNodeName = row.get(sheet1.to_db);

    Node locationFrom = nodeNameMap.get(fromNodeName);
    Node locationTo = nodeNameMap.get(toNodeName);
  
} 

解决方案

1. 初始化节点名称映射表(nodeNameMap)

你代码中用到的nodeNameMap是匹配数据库名称与模型节点实例的核心,必须先完成初始化:

  • 手动初始化(适合节点数量少的场景)
    在模型Main代理的On startup事件中添加代码:
// 创建HashMap存储节点名称到实例的映射
HashMap<String, Node> nodeNameMap = new HashMap<>();
// 将模型中的节点逐个加入映射
nodeNameMap.put("A_1", A_1);
nodeNameMap.put("A_2", A_2);
// 按此格式补充所有需要调度的节点
  • 自动遍历初始化(适合节点数量多或动态生成的场景)
    如果节点集中在Node Network或代理种群中,可自动遍历获取:
HashMap<String, Node> nodeNameMap = new HashMap<>();
// 假设节点都在名为nodeNetwork的Node Network组件内
for(Node node : nodeNetwork.getNodes()){
    nodeNameMap.put(node.getName(), node);
}
// 若节点是独立代理种群,可改为:
// for(MyNodeAgent node : myNodePopulation){
//     nodeNameMap.put(node.getName(), node);
// }

2. 节点匹配有效性校验

为避免数据库中存在模型未定义的节点名称导致空指针异常,需添加校验逻辑:

List<Tuple> rows = selectFrom(sheet1).list();
for (Tuple row : rows) {
    String fromNodeName = row.get(sheet1.from_db);
    String toNodeName = row.get(sheet1.to_db);

    Node locationFrom = nodeNameMap.get(fromNodeName);
    Node locationTo = nodeNameMap.get(toNodeName);

    // 校验节点是否存在
    if(locationFrom == null){
        traceln("警告:模型中不存在节点 " + fromNodeName);
        continue;
    }
    if(locationTo == null){
        traceln("警告:模型中不存在节点 " + toNodeName);
        continue;
    }

    // 后续添加运输器调度逻辑
}

3. 运输器调度实现

拿到匹配后的节点实例后,调用Transporter的移动方法完成调度:

// 示例:使用单个运输器执行任务
transporter.moveTo(locationFrom);
// 等待到达优先节点后,再移动到目标节点(可通过延迟或事件触发)
transporter.moveTo(locationTo);

// 如果需要结合运输量(volume)字段:
// int volume = row.get(sheet1.volume);
// transporter.setTransportedItemsCount(volume);

若涉及多运输器调度,可结合ResourcePool的getAvailable()方法获取空闲运输器,再分配对应任务。

内容的提问来源于stack exchange,提问作者Eric Kwon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:06:03