差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
r:maintenance:condition_monitoring_with_two_dimension_state [2019/01/06 18:56] – created watalu | r:maintenance:condition_monitoring_with_two_dimension_state [2019/01/07 10:45] (現在) – watalu | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | はじめに:この箇所のみ、状態を0から始める、として番号付けを行なっている。状態数がN+1の時、状態の番号は0からNまでとなる。 | ||
+ | |||
+ | ===== 多次元の状態ベクトルを持つマルコフ決定過程 ===== | ||
+ | |||
+ | [[:: | ||
+ | |||
==== 直積状態空間の1次元への変換 ==== | ==== 直積状態空間の1次元への変換 ==== | ||
行 75: | 行 81: | ||
< | < | ||
mmdp_X.to.Y = function(X, | mmdp_X.to.Y = function(X, | ||
+ | mdp_check.state = function(S) { | ||
+ | if( min(S)!=0 ) { | ||
+ | stop(" | ||
+ | } else if( max(S)!=(length(S)-1) ) { | ||
+ | stop(" | ||
+ | } else { | ||
+ | return(TRUE) | ||
+ | } | ||
+ | } | ||
m = length(X) | m = length(X) | ||
n = NULL | n = NULL | ||
行 104: | 行 119: | ||
< | < | ||
mmdp_X.to.Y.n = function(S) { | mmdp_X.to.Y.n = function(S) { | ||
+ | mdp_check.state = function(S) { | ||
+ | if( min(S)!=0 ) { | ||
+ | stop(" | ||
+ | } else if( max(S)!=(length(S)-1) ) { | ||
+ | stop(" | ||
+ | } else { | ||
+ | return(TRUE) | ||
+ | } | ||
+ | } | ||
m = length(S) | m = length(S) | ||
x.max = NULL | x.max = NULL | ||
行 116: | 行 140: | ||
この関数には状態空間のみを与える。 | この関数には状態空間のみを与える。 | ||
< | < | ||
- | > mmdp_X.to.Y.n(list(c(0: | + | > mmdp_X.to.Y.n(list(c(0: |
[1] 25 | [1] 25 | ||
</ | </ | ||
行 158: | 行 182: | ||
</ | </ | ||
この表示された行列の意味を少し確認すること。 | この表示された行列の意味を少し確認すること。 | ||
- | |||
- | === 状態指定取替 P.Age === | ||
- | |||
- | ある状態でのみ取替を実行し、他の状態では何もしない行動を定義しておく。 | ||
- | < | ||
- | mmdp_create.age.replacement.matrix = function(S, | ||
- | R.S = max(S)-min(S) | ||
- | n.S = length(S) | ||
- | if( R.S != n.S-1 ) { | ||
- | stop(" | ||
- | } | ||
- | P = diag(rep(1, | ||
- | P[T.ast+1, | ||
- | P[T.ast+1, | ||
- | rownames(P) = S | ||
- | colnames(P) = S | ||
- | return(P) | ||
- | } | ||
- | </ | ||
- | |||
- | これも状態空間が0から4の場合に実行してみておく。 | ||
- | |||
- | < | ||
- | > mmdp_create.age.replacement.matrix(c(0: | ||
- | 0 1 2 3 4 | ||
- | 0 1 0 0 0 0 | ||
- | 1 0 1 0 0 0 | ||
- | 2 0 0 1 0 0 | ||
- | 3 1 0 0 0 0 | ||
- | 4 0 0 0 0 1 | ||
- | </ | ||
- | |||
- | この行動は、通常の状態監視保全では現れないことを注意しておく。 | ||
==== 状態遷移行列の組み合わせ ==== | ==== 状態遷移行列の組み合わせ ==== | ||
行 295: | 行 286: | ||
あるいは2つ目の方を取り替えるのであれば | あるいは2つ目の方を取り替えるのであれば | ||
< | < | ||
- | mmdp_expand.P.2(list(mmdp_create.replacement.matrix(c(0: | + | mmdp_expand.P.2(list(mmdp_create.replacement.matrix(c(0: |
</ | </ | ||
とする。 | とする。 | ||
行 387: | 行 378: | ||
あとは実行するだけ。 | あとは実行するだけ。 | ||
- | 上の例を実行すると、次のような結果を得る。 | + | 例によって準備をする。 |
+ | |||
+ | < | ||
+ | install.packages(" | ||
+ | library(MDPtoolbox) | ||
+ | </ | ||
+ | |||
+ | そして、上の例の最適方策を価値反復アルゴリズムによって求めると、次のような結果を得る。 | ||
< | < | ||
> mdp_value_iteration(P, | > mdp_value_iteration(P, | ||
行 416: | 行 414: | ||
< | < | ||
> optimal.policy = mdp_value_iteration(P, | > optimal.policy = mdp_value_iteration(P, | ||
- | > cbind(expand.grid(c(0: | + | > cbind(expand.grid(c(0: |
- | Var1 Var2 optimal.policy$policy | + | Var1 Var2 optimal.policy$policy |
- | 1 | + | 1 |
- | 2 | + | 2 |
- | 3 | + | 3 |
- | 4 | + | 4 |
- | 5 | + | 5 |
- | 6 | + | 6 |
- | 7 | + | 7 |
- | 8 | + | 8 |
- | 9 | + | 9 |
- | 10 4 1 2 | + | 10 4 1 |
- | 11 0 2 1 | + | 11 0 2 |
- | 12 1 2 1 | + | 12 1 2 |
- | 13 2 2 1 | + | 13 2 2 |
- | 14 3 2 1 | + | 14 3 2 |
- | 15 4 2 2 | + | 15 4 2 |
- | 16 0 3 1 | + | 16 0 3 |
- | 17 1 3 1 | + | 17 1 3 |
- | 18 2 3 1 | + | 18 2 3 |
- | 19 3 3 1 | + | 19 3 3 |
- | 20 4 3 2 | + | 20 4 3 |
- | 21 0 4 3 | + | 21 0 4 |
- | 22 1 4 3 | + | 22 1 4 |
- | 23 2 4 3 | + | 23 2 4 |
- | 24 3 4 3 | + | 24 3 4 |
- | 25 4 4 4 | + | 25 4 4 |
</ | </ | ||
- | この方策は「状態が4になったのみ方を取替し、両方とも4になったら両方とも取替する」という方策である。 | + | この方策は「状態が4になったのみ方を取替し、両方とも4になったら両方とも取替する」という方策であると、読み取れるだろうか。 |