文書の過去の版を表示しています。


時間計画保全のマルコフ決定過程による表現

年齢取替の行動の状態遷移行列

次の関数は1期間ごとに1ずつ年齢を重ねる、という状態遷移を表す行列を生成する。ここでのSは状態空間だが、年齢の範囲を表す集合でもある。

mmdp_create.ageing.matrix = function(S) {
  R = max(S)-min(S)
  n = length(S)
  if( R != n-1 ) {
    stop("age space is not regular and/or does not begin with 0.")
  }
  max.S = max(S)
  P = rbind(cbind(0,diag(rep(1,max.S))),0)
  P[max.S+1,max.S+1] = 1
  rownames(P)=S
  colnames(P)=S
  return(P)
}

次のコードは年齢を0から20までに設定する。

mmdp_create.ageing.matrix(c(0:20))

次の関数は状態を年齢に取り、指定した年齢で取替を行い、他の年齢では何もしないという行動を表す状態遷移行列を生成する。

mmdp_create.age.replacement.matrix = function(S,T.ast) {
  R.S = max(S)-min(S)
  n.S = length(S)
  if( R.S != n.S-1 ) {
    stop("state space is not regular and/or does not begin with 0.")
  }
  P = diag(rep(1,n.S))
  P[T.ast+1,1] = 1
  P[T.ast+1,T.ast+1] = 0
  rownames(P) = S
  colnames(P) = S
  return(P)
}

次の実行例は、年齢が0から4まで推移する対象に、年齢2で取替を行う行列を生成する。

mmdp_create.age.replacement.matrix(c(0:4,2)

時間計画保全では、予防取替と事後取替がある。 ここでは故障状態になったら強制的に緊急取替を行うように状態遷移行列を変更している。 最後の一行に注目して欲しい。

P.Dgr = matrix(c(
  9/10, 1/10, 0, 0, 0,
  0, 9/10, 1/10, 0, 0,
  0, 0, 9/10, 1/10, 0,
  0, 0, 0, 9/10, 1/10,
  1, 0, 0, 0, 0), nrow=5, ncol=5, byrow=TRUE)
rownames(P.Dgr) = c(0:4)
colnames(P.Dgr) = c(0:4)
P.Dgr

その費用関数

C.Opr.Dgr = c(0,0,0,0,2000)

残りのコード。

S.Dgr = c(0:4)
S.Age = c(0:10)
P.Dgr = matrix(c(
  9/10, 1/10, 0, 0, 0,
  0, 9/10, 1/10, 0, 0,
  0, 0, 9/10, 1/10, 0,
  0, 0, 0, 9/10, 1/10,
  1, 0, 0, 0, 0), nrow=5, ncol=5, byrow=TRUE)
rownames(P.Dgr) = c(0:4)
colnames(P.Dgr) = c(0:4)
P.Age = mmdp_create.ageing.matrix(S.Age)
P.Hrd = mmdp_create.age.replacement.matrix(S.Age,4)
P.Dgr.2 = mmdp_expand.P.2(list(P.Dgr,P.Age))
P.Hrd.2 = mmdp_expand.P.2(list(mmdp_create.replacement.matrix(S.Dgr),P.Hrd))
P = array(0,dim=c(dim(P.Dgr.2)[1],dim(P.Dgr.2)[2],2))
P[,,1] = P.Dgr.2
P[,,2] = P.Hrd.2
C.Opr.Dgr = c(0,0,0,0,2000)
C.Opr.Age = rep(0,11)
C.Rpl.Dgr = c(150,150,150,150,150)
C.Rpl.Age = rep(0,11)
C.Opr.Opr = mmdp_expand.R.2(list(C.Opr.Dgr,C.Opr.Age))
C.Rpl.Rpl = mmdp_expand.R.2(list(C.Rpl.Dgr,C.Rpl.Age))
Cost = cbind(C.Opr.Opr,C.Rpl.Rpl)
R = -Cost

年齢が6になったら、交換を行うという保全基準の方策

cbind(expand.grid(c(0:4),c(0:10)),c(rep(1,5*6),rep(2,5*5)))

反復によって総機体割引き費用を求める。

mdp_eval_policy_iterative(P,R,0.95,c(rep(1,5*6),rep(2,5*5)))

一方で、価値反復法によって、故障したら事後取替、そして年齢による予防取替、の2つの最適な方策を求めてみると。

mdp_value_iteration(P,R,0.95)

年齢による予防取替は、年齢に達しない限り、そのまま放置をするのだが、それが1年間放置する、という結果になってしまう。

同じ設定での状態監視保全は、前回の内容そのままなので省略する。