I have an optimization model that assigns facilities to a distribution center and now I want to begin routing vehicles to serve those assigned facilities. I've worked through the vehicle routing problem, and even adapted it to work with my data. The problem I am having is it seems to work fine for less than 50 nodes and 10 trucks. I need to do something more like 300 nodes and up to 100 trucks.
The code I have right now is:
proc cas;
loadactionset "optimization";
source pgm;
/* Read in DDU Data */
set <str> NODES;
num ddu_longitude {NODES};
num ddu_latitude {NODES};
num demand {NODES};
read data RDC1_NODES into NODES=[name] ddu_latitude ddu_longitude demand;
num num_vehicles = &num_vehicles;
num capacity = &capacity;
set ARCS={i in NODES, j in NODES: i ne j};
set VEHICLES = 1..&num_vehicles;
str depot= 'DDU649';
/* The cost is the geodist between each node */
num cost {<i,j> in ARCS}
init geodist(ddu_latitude[i],ddu_longitude[i],ddu_latitude[j],ddu_longitude[j],'M');
var Flow {ARCS,VEHICLES} >= 0 <= capacity;
var UseNode {NODES,VEHICLES} binary;
var useArc {ARCS, VEHICLES} binary;
/* each non-depot node must be serviced by at least one vehicle */
con Assignment {i in NODES diff {depot}}:
sum {k in VEHICLES} UseNode[i, k] >=1;
/* each vehicle must start at the depot node */
for{k in VEHICLES} fix UseNode[depot, k]=1;
/* some vehicle k traverses an arc that leaves node i
if and only if UseNode[i,k] = 1 */
con LeaveNode {i in NODES, k in VEHICLES}:
sum {<(i), j> in ARCS} UseArc[i, j, k]=UseNode[i, k];
/* some vehicle k traverses an arc that enters node i
if and only if UseNode[i,k] = 1 */
con EnterNode {i in NODES, k in VEHICLES}:
sum {<j, (i)> in ARCS} UseArc[j, i, k]=UseNode[i, k];
/* the amount of demand supplied by vehicle k to node i must equal demand
if UseNode[i,k] = 1; otherwise, it must equal 0 */
con FlowBalance {i in NODES diff {depot}, k in VEHICLES}:
sum {<j, (i)> in ARCS} Flow[j, i, k] - sum {<(i), j> in ARCS}
Flow[i, j, k]=demand[i] * UseNode[i, k];
/* if UseArc[i,j,k] = 1, then the flow on arc (i,j) must be at most capacity
if UseArc[i,j,k] = 0, then no flow is allowed on arc (i,j) */
con VehicleCapacity {<i, j> in ARCS, k in VEHICLES}:
Flow[i, j, k] <=Flow[i, j, k].ub * UseArc[i, j, k];
/* decomp by vehicle */
for {i in NODES, k in VEHICLES} do;
LeaveNode[i, k].block=k;
EnterNode[i, k].block=k;
end;
for {i in NODES diff {depot}, k in VEHICLES} FlowBalance[i, k].block=k;
for {<i, j> in ARCS, k in VEHICLES} VehicleCapacity[i, j, k].block=k;
/* minimize the total distance traversed */
min TotalCost = sum {<i,j> in ARCS, k in VEHICLES} cost[i,j] * UseArc[i,j,k];
save mps rdc_tsp;
endsource;
optimization.runOptmodel/code=pgm;
run;
quit;
proc optmilp data=mycas.rdc_tsp primalout=mycas.rdc_tsp_sol dualout=mycas.rdc_tsp_dual maxtime=3600 ;
decomp logfreq=1;
run;
Any ideas would be greatly appreciated.
... View more