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

AnyLogic中如何用同一数据库表创建零售商群体并生成定时订单?

解决AnyLogic按数据库时间生成订单代理的方案

核心思路

不用Schedule或DynamicEvent的内置加载功能,直接在模型启动时读取数据库订单数据,为每条数据创建延迟触发的事件,到指定模拟时间生成对应Order代理。

具体步骤

  1. 确认数据库表关联逻辑

    • 你的Excel表需包含retailer_id(对应khachhang群体的唯一标识,比如ID字段)、demand、time这几个核心列。
    • 已创建的khachhang群体,要保证每个零售商有唯一ID,方便后续匹配订单目的地。
  2. 在Main代理的On startup事件中编写代码
    遍历数据库中的订单数据,为每条符合条件的记录创建延迟事件:

    // 替换为你实际的数据库表名称
    for(int i=0; i<ordersTable.size(); i++){
        // 读取当前行的订单数据
        double orderTime = ordersTable.get(i).getTime();
        int retailerId = ordersTable.get(i).getRetailer_id();
        int demandQty = ordersTable.get(i).getDemand();
        
        // 匹配对应的零售商代理
        Khachhang targetRetailer = khachhang.stream()
            .filter(k -> k.getId() == retailerId)
            .findFirst()
            .orElse(null);
        
        // 找到匹配零售商后,创建延迟触发的订单
        if(targetRetailer != null){
            delay(orderTime, () -> {
                Order newOrder = add_Order();
                newOrder.retailer = targetRetailer;
                newOrder.demand = demandQty;
                // 可在此添加订单生成后的后续逻辑,比如发送至零售商、加入订单队列等
            });
        }
    }
    

    代码说明:

    • ordersTable是你导入的Excel数据库表对象,khachhang是零售商群体对象,Khachhang和Order需替换为你模型中的实际代理类名。
    • delay()是AnyLogic内置的延迟触发方法,第一个参数为模拟时间延迟值,第二个参数是触发时执行的代码块。
  3. 替代方案:用DynamicEvent批量创建事件
    若偏好使用DynamicEvent组件,可在启动时批量生成实例:

    for(int i=0; i<ordersTable.size(); i++){
        double orderTime = ordersTable.get(i).getTime();
        int retailerId = ordersTable.get(i).getRetailer_id();
        int demandQty = ordersTable.get(i).getDemand();
        
        Khachhang targetRetailer = khachhang.stream()
            .filter(k -> k.getId() == retailerId)
            .findFirst()
            .orElse(null);
            
        if(targetRetailer != null){
            DynamicEvent de = add_DynamicEvent();
            de.setTime(orderTime);
            de.setAction(() -> {
                Order newOrder = add_Order();
                newOrder.retailer = targetRetailer;
                newOrder.demand = demandQty;
            });
        }
    }
    

关键注意事项

  • 确保Excel表中的time列单位与模型的模拟时间单位一致(比如秒、分钟)。
  • 该方案适配大订单量场景,AnyLogic启动阶段的遍历逻辑性能稳定。
  • 不推荐用Schedule的原因是它更适合周期性重复事件,而你的需求是单次、精确时间点的事件触发,延迟事件的逻辑更贴合。

内容的提问来源于stack exchange,提问作者Minh Nhật Hồ Tấn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 15:34:53