東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

状態遷移のテスト法(そのに)

状態遷移のテスト法 のつづき。

遷移行列の積を求めるコードを書いてみた。

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

投稿日時 : 2008年8月7日 11:48

コメントを追加

# re: 状態遷移のテスト法(そのに) 2008/08/07 12:46 ghost_shell

先生~!
const int 事象数 = 2;
が使われていた時のコードが気になります。

# re: 状態遷移のテスト法(そのに) 2008/08/07 13:05 επιστημη

あー...使うカナー思ぉて用意しといたんだけども、使い途ありませんでしたねぇ...
数値演算ならどってことないんだけども、
数式のままシンボル演算せにゃならんのがキツかったす。

# re: 状態遷移のテスト法(そのに) 2008/08/07 13:46 NyaRuRu

>シンボル演算

こういうのは Mathematica の方が楽ですなぁ.

ClearAttributes[Times, Orderless]
T = {{風, 電, 0, 0}, {電, 0, 風, 0}, {電, 0, 0, 風}, {電, 風, 0, 0}}
Table[MatrixPower[T, i] // ExpandAll // MatrixForm, {i, 1, 3}]

# re: 状態遷移のテスト法(そのに) 2008/08/07 14:07 επιστημη

おもしろそうだなぁ"ましまちか"。
んなもん手に入れたら丸一日遊んじゃって仕事ならんですきっと。

# re: 状態遷移のテスト法(そのに) 2008/08/07 15:55 NyaRuRu

あー,上の Mathematica のコードだとまだまずいかも.
もうちょいまじめに積を定義してやらないといけない気がしてきました.

# re: 状態遷移のテスト法(そのに) 2008/08/07 16:03 επιστημη

> まずいかも
交換則が成り立たん(風電!=電風)とか、そゆこと?

# re: 状態遷移のテスト法(そのに) 2008/08/07 18:22 NyaRuRu

>交換則が成り立たん(風電!=電風)とか、そゆこと?

ですね.
Mathematica には,標準で可換な積 (*) と非可換な積 (**) があるのですが,手抜きで可換な積の属性を上書きしてやってみたところ結局ダメだったという感じです.
非可換な積 (**) は,デフォルトでは 0 元も分配則も定義されていないので,これを自前で定義してやることで正しい結果を得ることができました.
ちと長くなったので続きは自分の日記にて.

# パターンマッチと項書き換え - Mathematica で非可換なシンボル計算 2008/08/08 0:48 NyaRuRuの日記

状態遷移のテスト法 - 東方算程譚 状態遷移のテスト法(そのに) - 東方算程譚” 遷移行列てのはある状態からある状態に遷移させるのに必要な事象の行列。  断弱中強 断風電   弱電 風  中電  風 強電風   わかるよね。縦に並ぶのが今の状態、横に並ぶのが次の状態。

# ZAoOKADvQFxQWN 2011/12/26 23:22 http://www.discreetpharmacist.com/fre/index.asp

The text is promising, will place the site to my favorites..!

# AoBiVgeDiCG 2011/12/27 18:19 http://www.laurenslinens.com

Heartfelt thanks..!

# lTjKFJILdrMSlUxjumm 2012/01/06 22:01 http://www.luckyvitamin.com/c-110-apple-cider-vine

However, the author created a cool thing..!

タイトル  
名前  
URL
コメント