包裹投递动态资源池 Anylogic

Dynamic resource pool for parcel delivery Anylogic

我正在尝试为具有异构车队(9 种类型)的多站点车辆路径问题编写基于 Anylogic 的仿真。我找到了一个关于车队交付优化的例子 (https://www.anylogic.com/resources/educational-videos/delivery-fleet-optimization-with-gis/),但是,这个例子只使用了一种类型的卡车。有人知道如何用动态车辆代理制作资源池吗?

备选方案是创建 9 个资源池并定义每辆车使用的车辆数量。但是,我想通过包含具有车辆规格的数据集来使模型更广泛地适用。

在这种情况下,我为不同的车辆类型创建单独的代理。

如果需要,创建这些资源的集合,以便您可以通过索引访问所需资源。

事实上,ResourcePool 确实允许您添加多个资源。如果你切换到动态编辑器,你可以这样做:

您不需要在这里做任何概念上的不同(例如多种代理类型、多个资源池或使用代理继承),也不需要资源池是“动态的”(无论是在动态添加资源的感觉 and/or 它包括多种类型的代理)。 [所有这些都是可能的,但在这里不是必需的,如果你走这些路线,资源池的工作方式会增加一些复杂性。]

只需要一个 Vehicle 代理类型,其属性(通过参数)涵盖了不同车辆类型之间的相关差异(这可能只是归结为某些选项列表类型的单个参数,它说明了哪种类型车辆的这是或可能与其他东西的负载有关,例如燃料 capacity/type、装载能力等)。

然后您的模型输入(例如,通过模型参数或 Excel 导入数据库)将指定每个 'sub-type' 您需要的车辆数量。初始化资源池,其大小等于这些的总和(并确保池将它们添加到 Vehicle 类型的自定义群体中,以便您可以显式访问/循环访问它们)。然后,作为模型初始化的一部分(例如,在 Main 的启动操作中),为它们中的每一个设置适当的特定于子类型的属性值。 [还有其他方法可以进行初始化;例如,请参阅 ,我的答案在其他答案上有所扩展。]

具体如何执行此操作取决于您的车辆参数是什么以及您如何定义控制它们的输入数据。假设你定义

  • 具有值 TYPE_ATYPE_BTYPE_C
  • 的选项列表 VehicleType
  • 模型参数 numTypeAnumTypeBnumTypeC,它们分别定义了您想要的数量
  • Vehicle 仅具有数据类型 VehicleType
  • 的单个参数 type 的代理类型

然后一些初始化逻辑(必须为自定义种群 allVehicles 中的所有车辆设置 type)可能如下所示。 (这样可以写得更优雅,但下面更容易理解。)

// Set up type A vehicles in population (using relevant indices)
for (int i = 0; i < numTypeA; i++) {
   allVehicles.get(i).type = VehicleType.TYPE_A;
}

// Set up type B vehicles in population (using relevant indices)
for (int i = numTypeA; i < numTypeA + numTypeB; i++) {
   allVehicles.get(i).type = VehicleType.TYPE_B;
}

// Set up type C vehicles in population (using relevant indices)
for (int i = numTypeA + numTypeB; i < numTypeA + numTypeB + numTypeC; i++) {
   allVehicles.get(i).type = VehicleType.TYPE_C;
}

在模型逻辑中,您需要根据占用哪些资源来区分它们,请使用相关 Seize/Service 块的 'Resource choice condition' 选项。这通过依次评估每个可用资源的资源选择条件(当前资源可通过 unit 关键字访问)来实现:如果它 returns true 则该资源将被占用。显然,条件将取决于您的模型需要如何工作(并且可能取决于执行捕获的代理的属性,可通过 agent 关键字访问),因此可能类似于

agent.weight > 40 ? unit.type == VehicleType.TYPE_A : unit.type == VehicleType.B

(如果进行扣押的代理人有权重,并且您希望为权重 > 40 的代理人使用 A 类车辆,而对于此特定的扣押操作,则使用 B 类车辆。)一般来说,这将是一个返回 boolean 它接受执行扣押的代理人和当前单位(车辆)作为参数,并执行任何需要的逻辑来确定是否要选择该车辆。可能是您的选择逻辑不能轻易地在对每个资源说是或否的基础上起作用;例如,如果您的标准是'choose the vehicle that has the most time since it last carried something',这意味着知道这对所有车辆做出选择。这样的逻辑还是可以实现的,只是比较复杂。

如果您希望车辆类型本身是数据驱动的(即,您不想 'hardcode' 进入模型——例如,通过选项列表——可以存在哪些车辆类型),那就是复杂得多(因为您还必须在泛型时也使用类型的所有逻辑)但可行。

注意:可能您真正需要的只是让车队中的车辆以某种方式区分(例如,不同的装载能力),而不必明确指定或关心 'type' 车辆是什么。这不会改变以上任何内容,除非您不需要 Vehicle 的显式属性(参数)来说明它是什么子类型。