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

如何动态修改Agent外观颜色 基于HashMap为Facility代理动态设置

动态修改Agent外观的实现方案

你可以通过以下两种方式实现基于动态HashMap的Agent颜色动态设置:

方案1:绑定形状动态属性(最简实现)

AnyLogic的动画形状支持动态值绑定,系统会在每次界面刷新时自动重新计算取值,你只需要直接在Facility代理的目标形状(如2D矩形、3D立方体)的填充色动态输入框中写入如下判断逻辑即可:

for(String groupKey : main.deliveryData.keySet()){
    if(main.deliveryData.get(groupKey).contains(this.getIndex())){
        // 按所属分组返回对应颜色
        switch(groupKey){
            case "0": return RED;
            case "1": return BLUE;
            // 按需扩展更多分组颜色
            default: return GRAY;
        }
    }
}
// 不属于任何分组时返回默认颜色
return LIGHT_GRAY;

该方案无需额外触发逻辑,只要main.deliveryData内容发生变更,下一次界面刷新时颜色就会自动同步更新,你之前写的静态判断逻辑就是该方案的简化版本:
模型快照

方案2:事件驱动主动更新(性能更优)

如果你的Facility代理数量较多、HashMap更新频率低,可以采用主动触发更新的方式降低性能损耗:

  1. 先在Facility代理中定义颜色更新函数updateColor():
public void updateColor(){
    for(String groupKey : main.deliveryData.keySet()){
        if(main.deliveryData.get(groupKey).contains(this.getIndex())){
            switch(groupKey){
                case "0": this.targetShape.setFillColor(RED); break;
                case "1": this.targetShape.setFillColor(BLUE); break;
                default: this.targetShape.setFillColor(GRAY); break;
            }
            return;
        }
    }
    this.targetShape.setFillColor(LIGHT_GRAY);
}

代码中的targetShape替换为你实际要修改颜色的动画形状名称即可。
2. 在所有修改main.deliveryData的逻辑后(包括模型启动初始化、事件触发修改等场景),新增代码遍历所有Facility代理执行更新:

// 假设你所有的Facility代理存放在main的facilities群体中
for(Facility f : facilities){
    f.updateColor();
}

优化建议

  • 建议将HashMap的ArrayList存储内容从Agent索引改为直接存储Facility对象,判断逻辑可以简化为main.deliveryData.get(groupKey).contains(this),运行效率更高,同时避免索引错位导致的匹配错误
  • Agent销毁时要同步将其从HashMap的对应列表中移除,避免无效匹配和空指针问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:45:04