首页 > 解决方案 > 如何根据交货地点和库存水平批量代理

问题描述

为了理解我的问题,让我首先介绍我的模型。当大约 50 个订单代理同时进入“进入”块时,该过程开始(见图)。之后,延迟块将订单延迟 1 秒,以将它们分开。然后,等待块用于创建批量大小,使其小于所选车辆的最大容量。这是通过将参数“数量”(保存在订单代理中)相加来完成的,直到达到最大容量 20(参见代码)。订单保存在一个名为“collection”的集合中,集合的大小用作下一个块中的批量大小。

问题是在查看订单的交货地点时,订单有时是不合逻辑的批处理。例如,车辆 1 和车辆 2 都去地方 A 和 B,而如果车辆 1 去地方 A,车辆 2 去地方 B,效率更高。有没有办法让批次考虑交货位置,使得他们彼此靠近吗?交货地点作为客户类型的参数“deliveryLocation”存储在订单代理中(GIS 地图上的位置)。

 inventory=agent.amount+inventory;
 collection.add(agent);

 if(inventory>=20){
      batch.set_batchSize(collection.size());
      wait.freeAll();

 collection.clear();
 inventory=0;
 }

工艺图

标签: anylogic

解决方案


这个问题与这个https://stackoverflow.com/a/68917002/4019094非常相似,请在那里查看它以获取另一种实现方式。

下面的示例基于您现有的在订单进入等待块时执行所有编码的逻辑

为了根据位置发布订单,您需要将您的收藏更改为以位置为键的地图。

在此处输入图像描述

对于这个例子,我创建了一个选项 list Location,每个 Order 代理都有一个 location 类型的参数。因此,当他们进入等待状态时,我可以简单地将它们添加到等待同一位置的订单列表中,如果它们符合批次标准,则释放它们

if (!collection.containsKey(agent.location)) collection.put(agent.location, new ArrayList<Order>());
collection.get(agent.location).add(agent);

if (collection.get(agent.location).size() > batchSize) {
    for (Order order:collection.get(agent.location)) {
        wait.free(order);
    }
}


并记住在它们离开等待块时将它们从集合中删除。

在此处输入图像描述


推荐阅读