電王戦 ボンクラーズの勝利ッ!!!

A級リーグ指し手1号
http://aleag.cocolog-nifty.com/

電王戦リアルタイム実況 by やねうらお - やねうらお-よっちゃんイカを食べながら、息子語録を書き綴る
http://d.hatena.ne.jp/yaneurao/20120114#p1

電王戦観戦記 ほかではあまり語られない舞台裏
http://weekly.ascii.jp/elem/000/000/072/72605/

将棋、囲碁とあまりに弱い(でも普通ぐらいには強い...かな。いや、弱いかも)ので、電王戦にはいまいち興味が持てずにいるのですが、ちと古い記事ですが、

ボンクラーズが勝った。そうです。

vlcsnap-2012-01-31-09h16m49s147

ええ、正式名称は「bonkras」なんですが、どうやら名称元は↑らしい。実に「爽快」ですね。

将棋とか囲碁、オセロもそうですが、時間があれば必ず解ける(勝てる)問題なので、アルゴリズム自体と高速化に頭を費やせる解決可能な問題です。これはこれで面白そうなので、4年ほど前から考えてはいたのですが、いや、先人が多くて無理、というのと私自身が弱くて無理。開発者の伊藤英紀氏はどうなんでしょう?そこそこ強いのだと思いますが。

名前が痛快ですね(イタイという意味でもw)はさておき、

ブレードサーバーを6枚使わないと米長名人に勝てないのか、そうなると、米長名人の頭の中のアルゴリズム(らしきもの、直感も含めて)はどうなっているんでしょう?ということになるわけで、実は棋士一般に云えることで、

  • 将棋盤のパターン化で覚える(月下の棋士のように?)
  • 膨大な棋譜(記憶にある棋譜)から、似たようなパターンを思い描く。
  • 似たようなパターンと、違いを見出す。
  • 先読みをする。

といういくつかのパターン化と、アルゴリズム化(決定論という意味で)が混じっています。ボンクラーズなどの将棋アルゴリズムがやることをは、最後の「先読み」を膨大に進めることで、その他の「パターン化」を補っている、と考えられます。ええ、考えられます、ってのは、ボナンザなどなどアルゴリズムを覗いたわけではないので、想像です。

逆に言えば、パターン化を進める、パターン化による省略化、省力化によって、人や動物は変化に瞬時に対応するわけでそのあたりお「いい感じ」(via 岸和田博士)にしてしまうのが、最近の私の目標かなぁと。ちと、他に頭が廻っていますが、また opencv に頭を戻していきます。そうそう、特徴点抽出による物体認識も、初手はテンプレート検索になってしまうので、このあたり認識スピードや卵と鶏の関係っぽいですね。もうちっと、大ざっぱにやりたいと思い直しています。

余談ですが、中村太地五段がボンクラーズの代理をして指しているのを、ロボットが指すと、痛さ倍増かもと思ったりして。このあたりが目標ですね。

カテゴリー: 雑談 | コメントをどうぞ

Excel ファイルの類似検索、ひとまず公開

Excel ファイル、と言いますか、バイナリファイルの類似検索のツールです。

BinDiffCheck.0.1 からダウンロードしてください。

フォルダ内にある、ファイルを「いい感じ」に比較して、どれだけ近いか、を出すツールです。

image

  1. チェックするフォルダを指定します。
    (複数フォルダは指定できないから...あったほうがいいかな?)
  2. チェックする拡張子を指定します。
    空欄の場合は、すべてのファイルが対象になります。
  3. 「実行」すると、相互にファイルをチェックしていきます。
  4. 結果を「コピー」ボタンでクリップボードにコピーして、Excel に貼りつけてください。
  5. 「DiffFile」の値が、小さいほど似通っています。

Diff のロジックは、2007-03-15 - 当面C#と.NETな記録 からそのまま頂いております。

image

適当に、オートソートを掛ければわかりやすいかなと。

2つの Excel を比較する場合は、vector とかで、ベクター : 「excel ファイル 比較」の検索結果 すると、色々出てきます。

ソースコードの公開は、後程。

カテゴリー: ツール | コメントをどうぞ

Excel ファイルの類似検索の続き

単純に2ファイルを比較する部分は、

2007-03-15 - 当面C#と.NETな記録
http://d.hatena.ne.jp/siokoshou/20070315

にある FastDiff のコードをコピーして利用。

namespace SampleBinDiff
{
	class Program
	{
		static void Main(string[] args)
		{
			string srcfile = args[0];
			string destfile = args[1];

			Program prog = new Program();
			prog.Go(srcfile, destfile);
		}

		public int Go(string srcfile, string destfile)
		{
			string src = BinToString(srcfile);
			string dest = BinToString(destfile);

			// DiffResult[] res = FastDiff.DiffChar(src, dest);
			DiffResult[] res = FastDiff.Diff(src, dest);

			Console.WriteLine("count: {0}", res.Length);
			int diffcount = 0;
			foreach (var di in res)
			{
				Console.WriteLine(di.ToString());
				if (di.Modified)
				{
					diffcount += di.ModifiedLength + di.OriginalLength;
				}
			}
			Console.WriteLine("diffcount: {0}", diffcount);
			return 0;
		}

		public string BinToString( string fname )
		{
			BinaryReader br = new BinaryReader(File.Open(fname, FileMode.Open,FileAccess.Read));
			byte[] data = new byte[new FileInfo(fname).Length];
			br.Close();
			StringBuilder sb = new StringBuilder();
			foreach (byte b in data)
			{
				sb.Append(Convert.ToString(b, 16));
				sb.Append("\n"); // 行単位で比較
			}
			string src = sb.ToString();
			return src;
		}
	}
}

バイナリ比較のために FastDiff.DiffChar で比較しようと思ったのだけど、あまり思ったような結果が得られないので、無理矢理改行コードを入れて FastDiff.Diff で比較しています。

実行結果は以下のような感じ。ファイル名を2つ指定すると、diffcount という数値を出します。diffcount が 0 であれば一致、大きければそれだけファイルが違うという感じ。

Debug>SampleBinDiff ..\..\Program.cs ..\..\Program3.cs
count: 2
Common, OrgStart:0, OrgLen:2720, ModStart:0, ModLen:2720
Modified, OrgStart:2720, OrgLen:0, ModStart:2720, ModLen:24
diffcount: 24

これを相互 10,000 ファイルで当たっていけばよいので、適当な閾値をつけて類似ファイルを見つけるか、ヒストグラムを出して、一致する自動的に閾値を見つけるか、という感じで。続きは明日。

カテゴリー: C# | コメントをどうぞ

Excel ファイルの類似検索(準備)

Twitter / @futamiryo: 画像は類似検索があるけどxlsやzipは完全一致ばっ ...
https://twitter.com/#!/futamiryo/status/163566455504375808

 

image

単純に、バイナリdiff を取ればよいのでは?と思ったり思わなかったりしただけど、

  • バイナリ形式で、Excel ファイルを比較するけど、ファイル数は 10,000 ファイルほどある模様。
  • なので、単純な突き合わせだと、10^10 のオーダーになって爆発しそう。

な訳で、2段階踏まないと、実運用に耐えなそう。

バイナリ形式の diff は、文字単位に diff を取ればよいので、2007-03-15 - 当面C#と.NETな記録 の .NET diff class の DiffChar を使うのがよさげ。比較するのが string なので、バイナリデータを 0xFF のアルファベットに直してから比較するのが良いでしょう。

比較ファイルの絞り込みは、

  • ファイル名の比較(おそらく、似た名前で作っているハズ)
  • ファイル長さの比較(あまり違う場合は、はずすとか)

にしておけば、10^10 のオーダーではなくなるハズです。

そして、結果の、DeffResult[] が、少ない順にまとめていけば、なんとなく新旧のファイルがあつまるはずですね。

結果は、なんらかの形でレポートすれば、よかろうと。

 

ってことで、ふたみさんの作業には間に合わいそうもないけどw、ちと、この路線で明日作ってみますか。

カテゴリー: 開発 | コメントをどうぞ

Excel 方眼紙を作る方法他

Tips と言いますか、メモ書き。時々忘れるので。
画像の編集とかの場合には、「Excel 方眼紙」を作ると便利です。特に Excel 2010 にもなると、ワードアートなんかを使って綺麗なロゴが作れます。ここのロゴや トニー電の.NETプログラミング講座 のロゴは Excel 2010 で作っています。

■背景が白の方眼紙を作る

1.Excel 2010 を起動して、列を CZ ぐらいまで適当に選択
2.そのまま右クリックして、「列の幅」をクリックする。

3.列の幅を「2」に設定
4.方眼紙っぽくなります。

5.リボンで「ファイル」→「オプション」をクリック
6.「詳細設定」のタブで、「枠線を表示する」のチェックを外す。

あるいは、リボンの「ページレイアウト」→「枠線」→「表示」

7.これで、背景が白の Excel シートができます。

■複数のオブジェクトを選択

貼りつけたオブジェクトを選択したい場合は、ひとつひとつ選択してもよいのですが、以前のようにマウスで囲みたいですよね。Excel 2010 の場合は、リボンの「ホーム」→「検索」の▼ボタンを押して「オブジェクトの選択」でできます。

こんな風に範囲で選択できます。

■オブジェクトをグリッドに合わせる

方眼紙なのですから、グリッドにぴったりに合わせることもできます。
何かのオブジェクトを選択した状態で、リボンの「書式」→「配置」の「枠線にあわせる」をチェックします。

こうすると、枠線(グリッド)に合わせることができるので、図形を綺麗にそろえることができます。

微妙な位置合わせは、図形を選択した状態で、カーソルキー(↑↓など)でドット単位(多分)動かせるので、これを使うとよいかも。

■図形から画像ファイルを作る、クリップボードへコピーする

Excel には面白い機能があって、セルを選択した状態にして、Ctrl+C すると、画像がコピーされます。

この状態で、Ctrl+C でコピーします。クリップボードに転送されるので、ペイントに貼りつければ、画像ファイルに保存できます。

こんなところが、私の編集スタイルですね。高価な画像ソフトを持っていないのですが、まあ最近はこれで十分かと。

カテゴリー: 雑談 | 2件のコメント