如何根据交货地点和库存水平对代理进行批处理

How to batch agents based on delivery location and inventory level

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

问题是,在查看订单的发货地点时,订单有时会出现不合逻辑的批处理。例如,车辆 1 和车辆 2 都前往地点 A 和 B,而如果车辆 1 前往地点 A 而车辆 2 前往地点 B 则效率更高。有没有一种方法可以让批次考虑交货地点,以便他们彼此靠近? 交货地点作为 Customer 类型的参数“deliveryLocation”(GIS 地图上的位置)存储在订单代理中。

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

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

 collection.clear();
 inventory=0;
 }

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

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

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

对于这个例子,我创建了一个选项列表 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);
    }
}


并记得在它们离开等待块时将它们从 collection 中移除。