Вот проблема, которую я пытаюсь решить:
- Есть город с пациентами в месте (x, y) и время, когда они умрут.
- Пациент должен добраться до больницы до того, как он умрет, чтобы его спасли.
- Группа больниц в (x,y) с несколькими машинами скорой помощи, которые могут забрать максимум четырех пациентов за одну поездку и доставить их в любую больницу.
- Скорая помощь отправляется в больницу, совершает несколько поездок и может оказаться в любой больнице.
- Мы должны спасти максимально возможное количество пациентов.
- полное описание проблемы здесь: http://cs.nyu.edu/courses/fall15/CSCI-GA.2965-001/ambulance.html
Я пытаюсь использовать jsprit для решения этой проблемы и не могу понять, как сделать следующее: ( Я хочу знать, какую часть API мне следует изучить)
1) Уточнение, что количество машин скорой помощи ограничено, но они могут совершать многократные поездки.
- Делает ли это установка VehicleRoutingProblem.Builder.setFleetSize(FleetSize.INFINITE)? Код не документирует точную функциональность.
2) Принуждение пациентов доставляться в больницу до их смерти или покидать их.
- Достигает ли этого Shipment.Builder.newInstance("...").setDeliveryTimeWindow(time_of_patient_dying)?
3) Добавление 1 минуты на разгрузку для любой машины скорой помощи, прибывающей в больницу для доставки.
- Не знаю, на какую часть API смотреть для этого.
4) Позвольте машинам скорой помощи выбирать лучшие маршруты, позволяя им доставлять пациентов в любую больницу.
- Не знаю, на какую часть API смотреть для этого.
Вот мой код до сих пор:
// make vehicle routing problem builder
VehicleRoutingProblem.Builder vrpBuilder =
VehicleRoutingProblem.Builder.newInstance();
// make vehicle type
VehicleTypeImpl.Builder vehicleTypeBuilder =
VehicleTypeImpl.Builder.newInstance("ambulanceWithFourBeds")
.addCapacityDimension(0, 4);
VehicleType vehicleType = vehicleTypeBuilder.build();
// putting multiple vehicles at every hospital
List<Location> locations = state.getVehicleLocations();
int counter = 0;
for (Location location : locations) {
VehicleImpl.Builder vehicleBuilder =
VehicleImpl.Builder.newInstance("ambulance_" + counter++);
vehicleBuilder.setStartLocation(location);
vehicleBuilder.setType(vehicleType);
vrpBuilder.addVehicle(vehicleBuilder.build());
}
List<Patient> patients = state.getPatients();
counter = 0;
for (Patient patient : patients) {
Shipment shipment = Shipment.Builder.newInstance("patient_" + counter++)
.addSizeDimension(0, 1).setDeliveryTimeWindow(patient.getTimeWindow())
.setPickupLocation(Location.newInstance(patient.x, patient.y))
.setDeliveryLocation(patient.getAssignedClusterCentroid()).build();
vrpBuilder.addJob(shipment);
}
vrpBuilder.setRoutingCost(new ManhattanCosts(vrpBuilder.getLocations()));
VehicleRoutingProblem problem = vrpBuilder.build();