IBM ILOG Dispatcher User's Manual > Transportation Industry Solutions > Pickup and Delivery by Multiple Vehicles from Multiple Depots > Model > Define the RoutingModel::createVisits function

You use csv reader functionality to input visits from csv files. You then create a node for each pickup and delivery visit. This code is provided for you:

void RoutingModel::createVisits(const char* visitPath) {
  IloCsvReader orderReader(_env, visitPath);
  IloCsvReader::LineIterator it(orderReader);
  while ( it.ok() ) {
    IloCsvLine line = *it;
    //read visit data from files
    char * pickupVisitName = line.getStringByHeader("pickup");
    char * pickupNodeName = line.getStringByHeader("pickupNode");
    char * deliveryVisitName = line.getStringByHeader("delivery");
    char * deliveryNodeName = line.getStringByHeader("deliveryNode");
    IloNum quantity = line.getFloatByHeader("quantity");
    IloNum pickupMinTime  = line.getFloatByHeader("pickupMinTime");
    IloNum pickupMaxTime  = line.getFloatByHeader("pickupMaxTime");
    IloNum deliveryMinTime  = line.getFloatByHeader("deliveryMinTime");
    IloNum deliveryMaxTime  = line.getFloatByHeader("deliveryMaxTime");
    IloNum dropTime = line.getFloatByHeader("dropTime");
    IloNum pickupTime = line.getFloatByHeader("pickupTime");
    //read data nodes from the file nodes.csv and creat pickup and delivery 
nodes
    IloNode pickupNode = IloNode::Find(_env, pickupNodeName);
    IloNode deliveryNode = IloNode::Find(_env, deliveryNodeName);

You next create the submodel for each pickup and delivery visit.

Step 11   -  

Create visit models

Add the following code after the comment //Create visit models

    IloModel pickupModel(_env);
    IloModel deliveryModel(_env);

You create a pickup visit and add the constraints. Each visit takes a certain amount of time (pickupTime) and involves the delivery of a certain quantity of good. It must be performed within a given time window. The visit is added to the submodel pickupModel.

Step 12   -  

Create pickup

Add the following code after the comment //Create pickup

    IloVisit pickup(pickupNode, pickupVisitName);
    pickupModel.add(pickup.getDelayVar(_time) == pickupTime);
    pickupModel.add(pickup.getTransitVar(_weight) == quantity);
    pickupModel.add(pickupMinTime <= pickup.getCumulVar(_time) <= 
pickupMaxTime);
    pickupModel.add(pickup);
    pickup.setObject( (IloAny)pickupModel.getImpl() );
    pickup.getDelayVar(_length).setBounds(0,0);
    pickup.getWaitVar(_length).setBounds(0,0);

You follow the same procedure to create the delivery visit, add constraints, and add the delivery visit to the submodel deliveryModel.

Step 13   -  

Create delivery

Add the following code after the comment //Create delivery

    IloVisit delivery(deliveryNode, deliveryVisitName);
    deliveryModel.add(delivery.getDelayVar(_time) == dropTime);
    deliveryModel.add(delivery.getTransitVar(_weight) == -quantity);
    deliveryModel.add(deliveryMinTime <= delivery.getCumulVar(_time) <= 
deliveryMaxTime);
    deliveryModel.add(delivery);
    delivery.getDelayVar(_length).setBounds(0,0);
    delivery.getWaitVar(_length).setBounds(0,0);

Finally, you add the pickup and delivery order constraint to the pickupModel. A reference to the deliveryModel is placed via delivery.setObject. This means that the submodel for a delivery can be retrieved from the delivery at any time. Finally, each pickupModel and deliveryModel are added to the model of the whole problem _mdl.

Step 14   -  

Order the pickup and delivery

Add the following code after the comment //Order the pickup and delivery

    pickupModel.add( IloOrderedVisitPair(_env, pickup, delivery) );
    delivery.setObject( (IloAny)deliveryModel.getImpl() );
    _mdl.add( pickupModel );
    _mdl.add( deliveryModel );
    ++it;
  }
  orderReader.end();
}