【问题标题】:jsprit getting started: conceptional advicejsprit 入门:概念性建议
【发布时间】:2020-02-05 22:03:48
【问题描述】:

对不起,这不是一个具体的问题。由于我是 Jsprit 的新手,我需要一些关于如何开始解决问题的概念性帮助。

我的例子:

我开始时只有一辆车具有起点和终点位置。有几个具有优先级的取货位置,只有一个用于交付的仓库位置。车辆应行驶 1 天,然后休息 2 天,然后再休息 2 天,每天给定开始/结束时间。开始/结束位置是每天定义的(1 和 4)。车辆可以在第 1 天返回其终点位置,包括装载,但在第 4 天,最后一个位置应该是卸货(并空车返回)的仓库。

我想根据优先级和车辆 2d 负载限制尽可能多地拾取物品,如果拾取过多,它们将被忽略。车辆每天可多次返回仓库卸货。我还想过在第 4 天开始之前更改接送优先级。

  • 有什么想法吗?
  • 分别定义取货和交货而不是使用货件是否有好处/区别?
  • 我想定义2辆车而不是定义一个休息,但我不想在第一天卸货。我读到这可以使用 2 个驱动程序来完成,查看 API 和我不知道的驱动程序设置。 https://discuss.graphhopper.com/t/3-questions-endlocation-and-multiple-vehicles/414/8 Driver 类有一个 home 属性,但这是一个字符串,只能在车辆上定义中断。
  • 我是否应该运行求解器两次,并在第 4 天运行它之前移除第一条路线中的拾取器? + 之后合并结果?
  • 如何实现仅在负载达到 85% 时才加载的约束?
  • 如何实施约束,即第 4 天的最后一个位置应该是返回终点位置之前的站点(如果所有提货都完成,即使

【问题讨论】:

    标签: jsprit


    【解决方案1】:

    我会每周运行两次解决方案,并删除第一天要完成的所有停靠点,因为下一个解决方案不再需要它们。如果卡车第二天可以在任何地方启动,则需要在第二天更新启动位置。否则,如果两天都是从仓库出发,则两天的起点和终点位置相同。

    首先您要定义您的车辆类型和车辆:

    // Vehicle Type
    VehicleTypeImpl vehicleType = VehicleTypeImpl.Builder.newInstance("Your vehicle type")
        .addCapacityDimension(0, capacity)
        .setMaxVelocity(maxSpeed) // in meters per second
        .setCostPerDistance(value)
        .build();
    
    VehicleImpl vehicle = VehicleImpl.Builder.newInstance(fleet[i])
        .setType(vehicleType)
        .setEarliestStart(start).setLatestArrival(end)
        .setStartLocation(location) // Warehouse location
        .setEndLocation(location) // warehouse location
        .build();
    

    接下来,创建您的工作。服务工作从仓库开始,提货工作可以从商店位置开始,然后送到目标位置。有了这个,我将定义pickupsservice 工作,然后将它们添加到VRP

    // Service Jobs
    Service.Builder.newInstance(instanceName)
        .setName("Unique Name").setLocation(
             new Location.Builder()
             .newInstance().setId("Unique ID")
             .setCoordinate(new Coordinate(x, y))
        )
        .addSizeDimension(0, 1) // accounts for vehicle capacity
        .build();
    
    // Shipment Jobs
    Shipment.Builder.newInstance(instanceName)
        .setName("Unique Name")
        .setPickupLocation(
             new Location.Builder()
             .newInstance().setId("Unique ID")
             .setCoordinate(new Coordinate(x, y))
        )
        .setDeliveryLocation(
             new Location.Builder()
             .newInstance().setId("Unique ID")
             .setCoordinate(new Coordinate(x, y))
        )
        .addSizeDimension(0, 1)
        .build();
    
    // You can add priorities to jobs how you like with .setPriority()
    

    您可以遍历您的作业并根据类型创建任一作业并将其添加到VRP。还可以查看成本矩阵有助于您的解决方案。 (查看:Using a cost matrix

    然后,运行您的解决方案。

    干杯!

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2023-03-31
      • 2013-03-26
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2020-04-16
      相关资源
      最近更新 更多