! LP formulation of a Markov Decision Problem;
! Road repair example, average cost criterion;
! Key words: Maintenance, Markov decision process, MDP, Repair, Road repair, Steady state ;
SETS:
STATE: SSPROB;
DECISION:;
SXD( STATE, DECISION): C, Y;
SXSXD( STATE, STATE, DECISION): P;
ENDSETS DATA:
! Give names to the states and decisions;
STATE = S0 S1 S2 S3;
DECISION = D1 D2 D3;
! Definitions of states & decisions:
S0 : road surface is excellent,
S1 : uneven surface, cracks forming,
S2 : some potholes,
S3 : a real tire buster,
D1 : do nothing,
D2 : add thin top layer, fill potholes,
D2 : major resurfacing;
! Only a few decisions are typically valid in each state,
so we use sparse form and list only the valid
combinations of
state, decision, cost;
SXD, C =
S0 D1 0
S1 D1 1000
S1 D3 6000
S2 D1 3000
S2 D2 4000
S2 D3 6000
S3 D3 6000;
! Only a few transitions are typically
possible from each state, so list only the ones
with positive probability. Note: P(i, j, k) =
Prob{next state=j|current state=i and our decision=k};
SXSXD, P=
S0 S1 D1 .875
S0 S2 D1 .0625
S0 S3 D1 .0625
S1 S1 D1 .75
S1 S2 D1 .125
S1 S3 D1 .125
S1 S0 D3 1
S2 S0 D3 1
S2 S2 D1 .5
S2 S3 D1 .5
S2 S1 D2 1
S3 S0 D3 1;
ENDDATA
SUBMODEL MDPMOD:
! Definition of variables:
Y(I,K) = probability of being in state I
and making decision K.
Typically, for each I there will be only one K
such that Y(I,K) > 0. That is, Y(I,K) > 0 means
if the state is I, then you should take decision K;
! Minimize average cost per period;
MIN = AVGCOST;
AVGCOST = @SUM( SXD( J, K): C( J, K) * Y( J, K));
! Probabilities must sum to 1;
@SUM( SXD( J, K): Y( J, K)) = 1;
! Prob{ being in state J}= sum of probabilities of
getting there from other states ( I, K);
@FOR( STATE( J):
SSPROB( J) = @SUM( SXD( J, K): Y( J, K));
SSPROB( J) =
@SUM( SXSXD( I, J, K): Y( I, K) * P( I, J, K));
);
ENDSUBMODEL
CALC:
@SOLVE( MDPMOD); ! Solve it;
! Display a little report;
@WRITE(' State SS_PROB', @NEWLINE( 1));
@FOR( STATE( J):
@WRITE(' ', STATE( J), ' ', @FORMAT( SSPROB( J), '6.5f'), @NEWLINE( 1));
);
@WRITE(' Average cost/period= ', AVGCOST, @NEWLINE(1));
ENDCALC
|