MODEL:
 ! Dynamic programming illustration (see Anderson,
   Sweeney & Williams, An Intro to Mgt Science, 
   6th Ed.),  or Hillier & Lieberman, various editions.
   We have a network on a number of states/cities.  We
   want to find the length of the shortest route from
   every state to the final/last state.  As special case,
   this allows us to find the cheapest/shortest path
   from state 1 to the final state.;
 ! Keywords: Dynamic programming, Shortest path, Recursion;
SETS:
 ! Here is our primitive set of ten states, where
   F( i) = the shortest path distance
   from state i to the last state;
  state: F;

 ! The derived set, MOVE, lists the moves that 
   exist between the states (note: not all state
   pairs are directly linked by a road. Moves
   are assumed to be one way.);
  MOVE( state, state): D;
 ! D( i, j) is the distance from city i to j;
ENDSETS
DATA: STATE = S1..S10; ! Here are roads/moves and distances that correspond to the moves that are available; MOVE, D= S1,S2,1 S1,S3,5 S1,S4,2 S2,S5,13 S2,S6,12 S2,S7,11 S3,S5,6 S3,S6,10 S3,S7,4 S4,S5,12 S4,S6,14 S5,S8,3 S5,S9,9 S6,S8,6 S6,S9,5 S7,S8,8 S7,S9,10 S8,S10,5 S9,S10,2; ! D( i, j) is the distance from city i to j; ENDDATA SUBMODEL DYNPROG: ! If you are already in State last state, then the cost to travel to City 10 is 0; F( STATESN) = 0; ! The following is the classic dynamic programming recursion. In words, the shortest distance from State i to State 10 is the minimum over all state j reachable from i of the sum of the distance from i to j plus the minimal distance from j to City 10; @FOR( state( i)| i #LT# STATESN: F( i) = @MIN( MOVE( i, j): D( i, j) + F( j)) ); ENDSUBMODEL
CALC: STATESN = @SIZE( STATE); ! Get index number of final state; @SOLVE( DYNPROG); ! Do the Dynamic Programming; ! Write a simple report, showing best decision for each state...; ! Find an optimal decision for all states, except last; @WRITE(' Dynamic Programming Solution', @NEWLINE(1)); @WRITE(' If in this state. Choose this state next', @NEWLINE(1)); @FOR( STATE( i) | i #LT# STATESN: ! Find next state for i on shortest route; @FOR( MOVE( i,j) | F(i) #EQ# D(i,j) + F(j): @WRITE( @FORMAT( STATE(i),'14s'),' ', @FORMAT( STATE(j), '15s'), @NEWLINE(1)); ); ); @WRITE(@NEWLINE(1), " The Least Cost Path From State 1 is:", @NEWLINE(1)); NEXT1 = -1; START1 = 1; @WHILE( NEXT1 #NE# STATESN: @FOR( MOVE( i,j) | i #EQ# START1 #AND# F(i) #EQ# D(i,j) + F(j): NEXT1 = j; ); @WRITE( @FORMAT( STATE(START1),'14s'),' to', @FORMAT( STATE(NEXT1), '15s'), @NEWLINE(1)); START1 = NEXT1; ); ENDCALC END