! A Fleet Routing and Assignment model in LINGO.
Given a number of flights, each with a number of passengers to carry,
and a set of vehicle types, each with a capacity, how should
vehicles be assigned to flights, and vehicles be routed,
to carry the passengers at minimum cost;
! Keywords: Aircraft scheduling, Airline, Assignment, Fleet assignment,
Fleet routing, FTL routing, Load assignment, Routing, Trucking, Vehicle routing;
SETS:
LOCN; ! List of locations or cities;
VTYPE: CAP, CLEG, NVAIL; ! Vehicle types & attributes/fields;
PERIOD; ! Period or Event index set;
FLIGHT( LOCN, PERIOD, LOCN, PERIOD): NUMPASS; ! Flight demand info;
V2F( VTYPE, FLIGHT): XVF; ! Vehicle flight combinations;
VxL( VTYPE, LOCN): IDLEB; ! Vehicle locaton combinations;
VxLxP( VTYPE, LOCN, PERIOD): IDLE; ! V, L, P combinations;
ENDSETS DATA:
! The cities in today's problem;
LOCN = CHI MNN, KC_;
! The periods or event points in today's problem;
PERIOD = P0600 P0630 P0700 P0730 P0800 P0830 P0900 P0930;
! Vehicles and their attribues;
VTYPE, CAP, CLEG, NVAIL =
B737 162 20 2
A320 150 19 4;
! Start and end point and passengers, each flight;
FLIGHT, NUMPASS =
CHI P0600 KC_ P0730 145
MNN P0600 CHI P0730 100
KC_ P0630 MNN P0930 130
CHI P0700 MNN P0830 120
MNN P0730 KC_ P0930 130
KC_ P0730 CHI P0900 135;
ENDDATA
! To see the scalar version, click on Solver | Generate | Display model;
! Variables:
XVF( v, i, p1, j, p2) = number vehicle of type v departing locn i
in period p1, arriving at j in p2,
IDLE( v, i, p) = number vehicles of type v idle on ground at i,
just after period/event p
IDLEB( v, i) = number vehicles of type v idle on ground at i,
just before 1st period/event.
! Objective: Minimize cost;
MIN = @SUM( V2F( v, i, p1, j, p2) : CLEG( v) * XVF( v, i, p1, j, p2));
! Flow balance,
Begin on ground + arrivals = ending on ground + departures;
! Begining period, vehicle v, city i;
@FOR( VxL( v, i):
[BAL0] IDLEB( v, i) = IDLE( v, i, 1)
+ @SUM( V2F( v, i, p1, j, p2) | p1 #EQ# 1: XVF( v, i, p1, j, p2));
);
! Subsequent periods, flow into v, j, p = flow out of v, j, p;
@FOR( VxLxP( v, j, p) | p #GT# 1:
[BAL] IDLE( v, j, p-1) + @SUM( V2F( v, i, p1, j, p) : XVF( v, i, p1, j, p))
= IDLE( v, j, p) + @SUM( V2F( v, j, p, i, p2): XVF( v, j, p, i, p2));
);
! Cannot use more planes than have in fleet;
@FOR( VTYPE( v):
[VAVAIL] @SUM( LOCN( i): IDLEB( v, i)) <= NVAIL( v);
);
! Capacity on leg i, p1, j, p2 must cover demand on leg;
@FOR( FLIGHT( i, p1, j, p2):
[FCOV] @SUM( V2F( v, i, p1, j, p2) : CAP( v) * XVF( v, i, p1, j, p2))
>= NUMPASS( i, p1, j, p2) ;
);
! The XVF variables must be general integer;
@FOR( V2F( v, i, p1, j, p2):
@GIN( XVF( v, i, p1, j, p2))
);
! Optional features not included:
Deadheading/Repositioning/RedEye flights,
Cyclic schedule that repeat daily or weekly.
Specified initial position of vehicles,
Revenue/flight to allow selection of most profitable
legs to fly in face of limited capacity.
Random demand with safety capacity;
|