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

AnyLogic技术问询:如何基于行程时间移动Transporter?

在AnyLogic中用MoveByTransporter实现基于行程时间的移动(路径非比例场景)

针对路径未按比例绘制、需要固定节点间行程时间的需求,不用依赖模型比例,直接通过动态计算Transporter速度来复刻MoveTo块的"Trip time"功能,具体步骤如下:

核心思路

每次移动前根据目标行程时间和当前实际路径长度,实时计算Transporter需要的速度,确保移动耗时严格等于设定值,完全避开模型比例的影响。

具体实现步骤

1. 给Transporter添加自定义参数

在你的Transporter agent里新增一个double类型的参数,比如targetTripTime,用来临时存储当前行程需要的固定时间(单位和你模型的时间单位一致,比如分钟)。

2. 触发移动前赋值目标行程时间

在调用MoveByTransporter块的前置逻辑里(比如进入块的On enter动作,或者触发移动的事件中),根据当前的起点和终点,给targetTripTime赋值:

// 示例:从节点A到B,行程时间设为5分钟
transporter.targetTripTime = 5.0;
// 从节点C到D则设为3分钟
// transporter.targetTripTime = 3.0;

如果节点组合多,可以写个工具方法来映射:

double getTripTime(Node from, Node to) {
    if(from == nodeA && to == nodeB) return 5.0;
    else if(from == nodeC && to == nodeD) return 3.0;
    // 补充其他节点组合的时间规则
    else return 1.0;
}

然后调用这个方法赋值:

transporter.targetTripTime = getTripTime(currentSourceNode, currentTargetNode);

3. 动态计算并设置速度

有两种触发时机可选,选适合你模型的一种:

方式一:利用Transporter的On path changed事件

在Transporter agent的On path changed事件中添加以下代码,每次路径变化时自动计算速度:

double pathLength = getPathLength();
// 避免除以0的情况
if(pathLength > 0 && targetTripTime > 0) {
    // 速度公式:速度 = 路径长度 / 目标行程时间(单位匹配,比如长度单位/分钟)
    setSpeed(pathLength / targetTripTime);
}

方式二:在MoveByTransporter的Before moving动作中计算

直接在MoveByTransporter块的Before moving动作里写计算逻辑,更直接可控:

Transporter tp = agent.getTransporter();
Node start = agent.getSourceNode();
Node end = agent.getTargetNode();
double tripTime = getTripTime(start, end);
double pathLen = tp.getPathLength(start, end);

if(pathLen > 0 && tripTime > 0) {
    tp.setSpeed(pathLen / tripTime);
}

注意事项

  • 确保时间单位和速度单位统一:比如行程时间用分钟,速度就设为「长度单位/分钟」,避免出现时间误差。
  • 处理边界情况:比如起点终点相同时,直接跳过速度计算,避免除以0错误。
  • 多任务场景:如果Transporter可能同时处理多个移动请求,要保证targetTripTime在每次移动前被正确覆盖,避免旧值干扰新行程。

内容的提问来源于stack exchange,提问作者Avi K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:46:00