状態遷移のテスト法 のつづき。
遷移行列の積を求めるコードを書いてみた。
using System;
using System.Collections.Generic;
enum 状態 { 断, 弱, 中, 強 };
enum 事象 { 無, 電, 風 };
class Program {
const int 状態数 = 4;
const int 事象数 = 2;
static List<List<事象>>[,] createMatrix() {
return new List<List<事象>>[状態数, 状態数];
}
/*
* ここがキモ! 遷移行列の積
*/
static List<List<事象>>[,]
multiplyMatrix(List<List<事象>>[,] m, 事象[,] e) {
List<List<事象>>[,] result;
result = createMatrix();
for (int i = 0; i < 状態数; ++i) {
for (int j = 0; j < 状態数; ++j) {
for (int k = 0; k < 状態数; ++k) {
if (m[i, k] != null && e[k, j] != 事象.無) {
if (result[i, j] == null) {
result[i, j] = new List<List<事象>>();
}
foreach (List<事象> events in m[i, k]) {
List<事象> l = new List<事象>(events);
l.Add(e[k, j]);
result[i, j].Add(l);
}
}
}
}
}
return result;
}
// HTML - <table>形式で出力
static void printMatrix(List<List<事象>>[,] mtx) {
Console.WriteLine("<table border='1'><tbody>");
for (int i = 0; i < 状態数; ++i) {
Console.Write("<tr>");
for (int j = 0; j < 状態数; ++j) {
Console.Write("<td>");
if (mtx[i, j] != null) {
bool first = true;
foreach (List<事象> events in mtx[i, j]) {
if (!first) {
Console.Write("<br />");
} else {
first = false;
}
foreach (事象 ev in events) {
Console.Write(ev.ToString());
}
}
}
Console.Write("</td>");
}
Console.WriteLine("</tr>");
}
Console.WriteLine("</tbody></table>");
}
static void Main() {
// 単位行列を作る
List<List<事象>>[,] E = createMatrix();
for (int i = 0; i < 状態数; ++i) {
for (int j = 0; j < 状態数; ++j) {
if (i == j) {
E[i, j] = new List<List<事象>>();
E[i, j].Add(new List<事象>());
}
}
}
// 遷移行列を作る
事象[,] T = new 事象[状態数, 状態数];
for (int i = 0; i < 状態数; ++i) {
for (int j = 0; j < 状態数; ++j) {
T[i, j] = 事象.無;
}
}
T[0, 0] = 事象.風;
T[0, 1] = 事象.電;
T[1, 0] = 事象.電;
T[1, 2] = 事象.風;
T[2, 0] = 事象.電;
T[2, 3] = 事象.風;
T[3, 0] = 事象.電;
T[3, 1] = 事象.風;
List<List<事象>>[,] result = E;
// T^n (n=1..4) を求めてみゆぅ
for (int i = 0; i < 4; ++i) {
result = multiplyMatrix(result, T);
printMatrix(result);
Console.WriteLine();
}
}
}
これ使って T^4まで求めたぞ↓
T
風風 電電 |
風電 |
電風 |
|
電風 風電 |
電電 |
|
風風 |
電風 風電 |
電電 風風 |
|
|
電風 風電 |
電電 |
風風 |
|
T^2
風風風 電電風 風電電 電風電 |
風風電 電電電 |
風電風 |
電風風 |
電風風 風電風 電電電 風風電 |
電風電 風電電 風風風 |
電電風 |
|
電風風 風電風 電電電 風風電 |
電風電 風電電 |
電電風 風風風 |
|
電風風 風電風 電電電 風風電 |
電風電 風電電 |
電電風 |
風風風 |
T^3
風風風風 電電風風 風電電風 電風電風 風風電電 電電電電 風電風電 電風風電 |
風風風電 電電風電 風電電電 電風電電 電風風風 |
風風電風 電電電風 |
風電風風 |
電風風風 風電風風 電電電風 風風電風 電風電電 風電電電 風風風電 電電風電 |
電風風電 風電風電 電電電電 風風電電 |
電風電風 風電電風 風風風風 |
電電風風 |
電風風風 風電風風 電電電風 風風電風 電風電電 風電電電 電電風電 風風風電 |
電風風電 風電風電 電電電電 風風電電 |
電風電風 風電電風 |
電電風風 風風風風 |
電風風風 風電風風 電電電風 風風電風 電風電電 風電電電 電電風電 風風風電 |
電風風電 風電風電 電電電電 風風電電 風風風風 |
電風電風 風電電風 |
電電風風 |
T^4