由于时间问题,JSprit不使用更近的车辆



具有两辆车的单作业计划。一辆车在作业附近启动,另一辆车在远离作业的地方启动。似乎它应该更喜欢使用更近的车辆,因为每距离有成本。但是它使用更远的那个,如果有一个非零setCostPerWaitingTime().为什么?

public void testUseCloserVehicleWhenCostsAreSet() throws Exception {
VehicleType type = VehicleTypeImpl.Builder.newInstance("generic")
.setCostPerDistance(0.017753)
//.setCostPerTransportTime(1.0)
.setCostPerWaitingTime(1.0)
.build();
double serviceTime = 420.0;
Location pointA = Location.newInstance(100.0, 100.0);
Location pointB = Location.newInstance(100.0, 200.0);
Location closeToPointA = Location.newInstance(110.0, 110.0);
Location farFromPointA = Location.newInstance(500.0, 110.0);
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder
.newInstance()
.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
.addVehicle(VehicleImpl.Builder.newInstance("CloseBy")
.setType(type)
.setStartLocation(closeToPointA)
.build())
.addVehicle(VehicleImpl.Builder.newInstance("FarAway")
.setType(type)
.setStartLocation(farFromPointA)
.build())
.addJob(Shipment.Builder.newInstance("123")
.setPickupLocation(pointA)
.setPickupServiceTime(serviceTime)
.setDeliveryLocation(pointB)
.setDeliveryServiceTime(serviceTime)
.setPickupTimeWindow(new TimeWindow(36000.0, 36360.0))
.setDeliveryTimeWindow(new TimeWindow(36360.0, 36720.0))
.setMaxTimeInVehicle(720.0)
.build())
.build();
VehicleRoutingAlgorithm algorithm = Jsprit.Builder.newInstance(vrp)
.buildAlgorithm();
VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(algorithm.searchSolutions());
SolutionPrinterWithTimes.print(vrp, bestSolution, SolutionPrinterWithTimes.Print.VERBOSE);
System.out.flush();
assertEquals("CloseBy", bestSolution.getRoutes().iterator().next().getVehicle().getId());
}

结果:

+----------------------------------------------------------+
| solution                                                 |
+---------------+------------------------------------------+
| indicator     | value                                    |
+---------------+------------------------------------------+
| costs         | 35616.03246830352                        | 
| noVehicles    | 1                                        | 
| unassgndJobs  | 0                                        | 
+----------------------------------------------------------+
+--------------------------------------------------------------------------------------------------------------------------------+
| detailed solution                                                                                                              |
+---------+----------------------+-----------------------+-----------------+-----------------+-----------------+-----------------+
| route   | vehicle              | activity              | job             | arrTime         | endTime         | costs           |
+---------+----------------------+-----------------------+-----------------+-----------------+-----------------+-----------------+
| 1       | FarAway              | start                 | -               | undef           | 0               | 0               |
| 1       | FarAway              | pickupShipment        | 123             | 400             | 36420           | 35607           |
| 1       | FarAway              | deliverShipment       | 123             | 36520           | 36940           | 35609           |
| 1       | FarAway              | end                   | -               | 37350           | undef           | 35616           |
+--------------------------------------------------------------------------------------------------------------------------------+
junit.framework.ComparisonFailure: 
Expected :CloseBy
Actual   :FarAway

我怀疑这与车辆到达400工作有关,直到36000才能开始。有没有办法防止这种情况,所以车辆只在需要到达第一个作业时才启动?setCostPerWaitingTime做一些与我的想法不同的事情吗?

以下是该作业与仅CloseBy车辆的比较。

+--------------------------------------------------------------------------------------------------------------------------------+
| detailed solution                                                                                                              |
+---------+----------------------+-----------------------+-----------------+-----------------+-----------------+-----------------+
| route   | vehicle              | activity              | job             | arrTime         | endTime         | costs           |
+---------+----------------------+-----------------------+-----------------+-----------------+-----------------+-----------------+
| 1       | FarAway              | start                 | -               | undef           | 0               | 0               |
| 1       | FarAway              | pickupShipment        | 123             | 400             | 36420           | 35607           |
| 1       | FarAway              | deliverShipment       | 123             | 36520           | 36940           | 35609           |
| 1       | FarAway              | end                   | -               | 37350           | undef           | 35616           |
+--------------------------------------------------------------------------------------------------------------------------------+
+--------------------------------------------------------------------------------------------------------------------------------+
| detailed solution                                                                                                              |
+---------+----------------------+-----------------------+-----------------+-----------------+-----------------+-----------------+
| route   | vehicle              | activity              | job             | arrTime         | endTime         | costs           |
+---------+----------------------+-----------------------+-----------------+-----------------+-----------------+-----------------+
| 1       | CloseBy              | start                 | -               | undef           | 0               | 0               |
| 1       | CloseBy              | pickupShipment        | 123             | 14              | 36420           | 35986           |
| 1       | CloseBy              | deliverShipment       | 123             | 36520           | 36940           | 35988           |
| 1       | CloseBy              | end                   | -               | 37031           | undef           | 35989           |
+--------------------------------------------------------------------------------------------------------------------------------+

我认为问题在于 CloseBy 车辆到达得更快,因此它支付了更高的等待成本,而另一辆车在此期间行驶,因此支付的等待成本更少。如果车辆在需要时才启动,这将得到缓解,但我不确定如何设置。

相关内容

  • 没有找到相关文章

最新更新