如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?

Posted

技术标签:

【中文标题】如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?【英文标题】:How to solve "java.lang.IndexOutOfBoundsException" problem via Agent-based modeling in Anylogic? 【发布时间】:2021-12-27 11:20:39 【问题描述】:

我想将停车分配给每个订单,然后从其他停车的订单集中删除停车分配订单时遇到问题。这个数组列表 arr_assignedOrderSet 的大小为 22,因此它应该迭代 22 次。但我不知道为什么它在 11 次后停止了。如果我将迭代次数 arr_assignedOrderSet.size() 替换为 22,它将显示错误“java.lang.IndexOutOfBoundsException: Index 11 out of bounds for length 11 ”。代码如下:

ArrayList<Order> arr_assignedOrderSet = new ArrayList<Order>();
arr_assignedOrderSet = pop_parkings.get(index).orderSet;

for(int i=0; i<arr_assignedOrderSet.size(); i++)
    Order order = arr_assignedOrderSet.get(i);
    for(int j=0; j<order.col_parking.size(); j++)
        Parking p = order.col_parking.get(j);
        p.orderSet.remove(order);
    


非常感谢您的帮助~ ;-)

【问题讨论】:

如何创建pop_orders 代理?一开始你创建了 22 个? 我创建了 100 个订单,并首先将停车位分配给其中的 22 个订单。 你什么时候运行这些循环?一开始? 你说“arr_assignedOrderSet 中有 22 个订单,像这样:”但代码清楚地显示只有 11 个 :) 是的,你是对的!当我评论“order.col_parking”的循环并打印出“arr_assignedOrderSet.size()”的循环时,我可以得到22个订单。但是我不知道为什么如果我把循环放回去,结果减半...... 【参考方案1】:

在不完全理解您的模型的情况下,11 恰好是 22 的二分之一似乎很可疑,这意味着以下语句:p.orderSet.remove(order); 正在缩小相同的orderSet,通过pop_parkings.get(index).orderSet 变量在pop_parkings.get(index).orderSet 中迭代。当这个赋值发生时arr_assignedOrderSet = pop_parkings.get(index).orderSet;Java 实际上并没有复制集合的内容,只是复制了对它的引用。如果是这种情况,那么解决方法是替换这一行:

arr_assignedOrderSet = pop_parkings.get(index).orderSet;

用这一行:

arr_assignedOrderSet.addAll(pop_parkings.get(index).orderSet);

【讨论】:

您好,Artem,感谢您的回答。当我打印出这个数组列表的结果时,一切正常,如下所示,“arr_assignedOrderSet 中有 22 个订单,如下所示:”。这意味着更改代码后,我仍然得到相同的结果。 :( 还是谢谢你。 您可以在开始删除元素之前将其打印出来,因此它在打印时看起来很好,但在运行时却不行。你知道哪一行导致索引越界错误吗? 您好 Artem,非常感谢您的建议。我发现错误在于这一行: Order order = arr_assignedOrderSet.get(i);当我将其更改为 Order order = arr_assignedOrderSet.get(0); 时,问题得到了解决获取每个元素,直到数组变空。

以上是关于如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?的主要内容,如果未能解决你的问题,请参考以下文章

(Anylogic)如何从另一个代理引用 Main

anylogic,流程建模库:split.如何设置和引用代理副本的属性?

Anylogic:如何根据代理的参数在 ResourcePool 中对设置时间(工具更换)进行建模?

通过anylogic中的特定资源路由代理

基于两个参数的 AnyLogic 优先级队列作为 Java 代码

如何在 Anylogic 中创建与特定代理的连接并为代理显示动画连接