2010年12月27日月曜日

RoboCupSoccer Simulation 2Dって言えば福井でしょ?

そう,勝手なイメージ福井

何故かわからないが,福井 

 福井高専がおそらく唯一高専から
JapanOpenに出場している.

っで一体どんな競技なのか・・・.
 早速調査!Σオイ
soccerwindow2によるagent2D同士の対戦模様
こんな競技みたいです.
soccerwindow2とagent2Dは秋山英久さんという方が公開されている,
ビューアとサンプルチームプログラムのことです.
実に楽しそう・・・.
一言で言い表せればたぶん,

「各選手が6000回の行動選択を行い,チームの勝利を目指すゲーム」

だそうで, 試合時間は5分ハーフの10分で,選手は0.1秒毎に選手は行動選択を行えるらしい.

うむ,まったくもって調査不足
ヽ( ´ ▽ ` )ノ

2010年12月25日土曜日

無いんだったら作ればいいのよ!

以前,日記的なことも増やしていこうと書きましたが,
待ってください.このブログ名

The Periphery of Game Informatics


そう,ゲーム情報学っていう文字が含まれている・・・.
タイトル変えるのも何かめんどい.
でも,それに関してあまり書けてない.

だったら書ける題材を作ればいいんじゃなイカ?
 
っていうことで,RoboCupSoccer Simulation 2D始めます.
大会に出るかどうかは別として,個人的に興味があるので,
結構書けるんじゃないかと思います.

2010年12月9日木曜日

今,思うこと

GIMP見習い

GIMPっていろいろな機能があり過ぎるので,暇つぶしにはもってこいかも.
立体的に魅せるのはまだまだ難しいけど,その試行錯誤が面白い.

最近,学校に行っていて5年間で何かできたかなぁと思うことがある.
あと少しで卒業.
次に繋げられるように,今を過ごしたい.

2010年12月8日水曜日

GIMPって凄い

GIMP見習い

GIMP,そもそもあんまりパソコンで絵を描いたり編集したりしないので,
使ってこなかったのですが,やっぱり凄いソフトウェアだと実感.
フリーウェアでここまで簡単にできるのは流石.d(>_< )
GUI作成の時なんかに使っていこうと思ってます.

2010年12月5日日曜日

NNGSのインストール方法

localhostでのjagoと端末での対局の様子
基本的にREADMEに従えば良いんですが,
自分の環境ではそのままでは上手くいかなかったので,
メモしときます.

・すること
nngs-1.1.22を$HOME/go/nngsにインストールする.

・環境
Ubuntu 10.04 LTS (10.10に移行してない・・・)

・(行った)手順
  1. nngs-1.1.22をダウンロードする.
  2. 展開する. tar xvzf nngs-1.1.22.tar.gz
  3. 展開したディレクトリに移動して,READMEを見る.NNGS入れる前にmlrateをmakeしといてねって書いてあることを確認する.
  4. mlrateをググってダウンロードする.
  5. 展開する. tar xzvf mlrate-1.2.tar.gz
  6. 展開したディレクトリに移動して,READMEを見る.Makefileを環境によって変更する必要があることがわかる.
  7. LinuxなのでMakefileのCFLAGSに-D_BSD_SOURCE -D_POSIX_C_SOURCE=2を追加する.
  8. makeする. make
  9. nngsのディレクトリに戻りmlrateへのリンクファイルを作成する. ln -s ../mlrate mlrate
  10. Makefileを作成する. ./configure --prefix=$HOME/go/nngs/
  11. makeする. make
  12. nngsmain.c:260: error: expected expression before ‘/’ token と怒られる.// でコメントアウトされている行を /*  */ でさらにコメントアウトする.その後再度makeする.
  13.  make[2]: *** No rule to make target `../mlrate/src/libmlr.a', needed by `nngssrv'.  Stop. /mlrate/src/libmlr.a がないので中断される.仕様がないのでディレクトリmlrateにディレクトリsrcを作成しディレクトリmlrateにあるlibmlr.aを作成したディレクトリsrcに移動させる.
  14.  nngsのディレクトリに戻り再再度makeする.makeが通る.
  15. インストールする. sudo make install
起動は$HOME/go/nngs/binに移動してnngssrvを実行で行えるみたいです.
自分の場合起動すると,
Error opening logfile '/home/hikaru/go/nngs/nngssrv/stats/logfile': 2(No such file or directory)
Error opening logfile '/home/hikaru/go/nngs/nngssrv/stats/logfile': 2(No such file or directory)
Error opening logfile '/home/hikaru/go/nngs/nngssrv/stats/logfile': 2(No such file or directory)
Fork1 = 27976
hikaru@HARU:~/go/nngs/bin$ Fork2 = 27977
Error opening logfile '/home/hikaru/go/nngs/nngssrv/stats/logfile': 2(No such file or directory)
NNGS: can't bind local address. errno=98(Address already in use)
Error opening logfile '/home/hikaru/go/nngs/nngssrv/stats/logfile': 2(No such file or directory)
NNGS: can't bind local address. errno=98(Address already in use)
Error opening logfile '/home/hikaru/go/nngs/nngssrv/stats/logfile': 2(No such file or directory)
Network initialize failed on ports 6969,9696.
と,logfileがないと言われますが,NNGSの起動はでき,実際にtelnetとjagoでそれぞれlocalhostの9696ポートに接続(ログイン)して,上の図のように対局を行うことができました.

見ていて何かおかしい点がありましたらコメントを頂ければと思います.

方針転換

気が付きました.

このブログ,面白くない.

面白くするにはどうすればいいのか・・・.
で,考えた結果,もうちょっと日記な記事を増やしていこうと思います.

そうそう,昨日は第4回UEC杯5五将棋大会が開催されたそうです.
まだ結果が確認できないんですが,人間部門の参加数は去年より多かったみたいです.

2010年11月29日月曜日

第4回UEC杯

第4回UEC杯,自分は
1勝5敗とな結果でした.
いろいろ勉強不足だと感じ,
次の大会に向けて,また頑張りたいと思います.

ちなみに優勝プログラムはFuegoでした.
おめでとうございます.

最後に,UEC杯運営委員会の皆様,お疲れさまでした.ありがとうございました.
来年はそちら側でも役立てるできるように,これから楽しい経験をしていきたいと思います.

2010年11月19日金曜日

もうそろそろUEC杯

謎のGUI
もうそろそろでUEC杯です.
参加できるか微妙な感じ.
観てるだけでも勉強になるし・・・.
まだまだ弱いし・・・.
最近方針変更してるし・・・.

囲碁って難いっすよね.Σ(・口・)

2010年11月11日木曜日

勢い余って買っちゃいました

はじめての「Go言語」 (I・O BOOKS)

勢い余って買っちゃいました.
もちろん,その勢いを作ったものがありまして,
単にGo言語を取り上げていたからではなく,
著者を拝見したとき,感動したからです.

著者:茨木 隆彰
1990年   兵庫県産まれ おー同世代!! w( ̄o ̄)w オオー!
神戸高専 電子工学科在学中 おー高専生!!! w( ̄▽ ̄;)wワオッ!!

茨木さんマジぽねぇっす (゚o゚;)
何か勇気付けられました.
ありがとうございます.

本の内容はGo言語の基本構文とか,
並列処理の仕方などの紹介がされていて,
本を用いた良いGo言語の導入になると思いました.
読んでてGo言語の面白さが伝わってきました.
個人的に不満だったところは,
多言語との比較,特に数値的なものがなかったことです.
あと細かい点ではインデントがときどき変なところ(これは仕様かも).

にして凄い.
世の中の高専生は頑張ってる.
俺も頑張ろうと思った今日です.(*゚▽゚*)

2010年11月9日火曜日

AOJ Volume 5 Problem 0502 : Dice

#include<iostream>

int main()
{
    for (int n; std::cin >> n, n;)
    {
        int s = 1, d[] = {2, 3, 5, 4, 1}, i, t, a, b;

        for (i = 0; i++ < n; s += d[4])
        {
            char c[9], e;
            std::cin >> c;
            e = *c;
            a = 0;
            
            if (e != 'R' && e != 'L')
            {
                e == 'N' ? a = 2, b = 0 : e == 'E' ? a = 1, b = 3 
                     : e == 'W' ? a = 3, b = 1 : b = 2;
                d[a] = d[4];
                d[4] = d[b];
                d[b] = 7 - d[a];
            }
            else
            {
                e == 'R' ? : a = 2;
                t = *d;
                *d = d[1 + a];
                d[1 + a] = d[2];
                d[2] = d[3 - a];
                d[3 - a] = t;
            }
        }
        std::cout << s << '\n';
    }

    return 0;
}
バリンバリンの自分なりのショートコーディング.
納得の331 Bytesです.

問題はサイコロに関する問題なんですが,
回転の種類を大きく2つに分けることができて,
関数化できるので,上記のようなショートコーディングが行えてます.

2010年11月3日水曜日

行列と転置行列の積


#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
using namespace std;
using namespace boost::numeric::ublas;

int main()
{
    matrix<int> A(2, 2), B(2, 2);

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            A(i, j) = i * 2 + j + 1;
            B(i, j) = i * 2 + j + 2;
        }
    }

    cout << A << endl;
    cout << B << endl;
    cout << prod(A, trans(B)) << endl;

    return 0;
}

/* execution result
[2,2]((1,2),(3,4))
[2,2]((2,3),(4,5))
[2,2]((8,14),(18,32))

*/ 


上のプログラムは下記の計算を行っています.


スッキリ書けて素晴らしい.d(゚∀゚)b

2010年11月1日月曜日

今年一番不真面目に取り組んじまった

    
 テスト画像           圧縮データによる復元画像

一目で荒さがわかりますね.ニューラルネットには砂時計型(64-16-64)を使用しています.
プログラムは下の本の5章に書かれていることを参考に実装しました.


学習回数は上の画像では1000回です.
問題の圧縮率は,元画像は192.1 KB,圧縮データは49.1 KBなので,約25.6%となっています.
圧縮データの構成は,画像のヘッダー情報,中間層と出力層の数,中間層と出力層間の重み,
出力層の各バイアス,中間層の各出力です.

GUIも作成し,内容は圧縮したいデータをドラッグ&ドロップしたら圧縮データが作成され,
その復元画像が表示されるものです.

カラー画像のPNSR(peak signal-to-noise ratio)ってどう算出するのかわからないんだけど,
MSEをRGBに対してそれぞれ求めて足し合わせたものを3で割った物を使って,
PNSRを求めると約26.8 dBでした.もうちっと上げたいものですね.

縦に線が入ってる理由は,おそらく入力を
左上から右に順々に繰り返しているからだと考えられます.

改善+オリジナリティが必要ですが,また発表ではミスりましたが,
質疑応答もしっかりと出来ませんでしたが,
俺の本命はゲーム情報学なので,これからはそっちに熱を注ぎたいと思います.

2010年10月30日土曜日

週末は高専祭

3層階層型ニューラルネットワーク
週末,(留年しなければ)俺にとって最後の高専祭が開催されます.
台風来てますが,開催されるみたいです.え

俺は前に言ってた通り,
 "学校でデータ圧縮に関して何かやらなきゃいけない立場"で,
それに関する発表が高専祭当日だったりします.
っで,既存手法の実装にもかかわらず昨日まで必死に試行錯誤していました.
もうちっと,計画的に生きたいです.

一様プロジェクトで去年からの引き継ぎなものです.
プロジェクト名は「ニューラルネットワークを用いた情報圧縮技術」なもんで,
いろいろ楽しかったです.

粘ったかいもあり,ギリギリ発表できるものはできたように思えます.
ブログの方にも月曜日位にできれば結果を掲載したいと思います.

2010年10月7日木曜日

プログラミング部の人は必見の一冊かも

プログラミングコンテストチャレンジブック 

たまたま本屋で見かけた一冊.
プログラミングコンテストの問題を解くためのアルゴリズムがソース付きで解説されています.
ソースはC++で書かれています.
アルゴリズムの教科書になるレベルで, まとまり感が個人的にハンパないです.
値段は学生にとってはちと高く感じますが, 満足できると思います.  
問題を解くための情報も満載です.
誤植は読者サポートページを参照とのことです.

2010年10月2日土曜日

このブログ,ゲーム情報学が主軸なはずです

夏からいろいろあって,
正直,何一つ進まずじまいです.

っで,いつになったらGoswfが使えるのか分からないので,
制作したUCTとUCBの一局をテストで表示してみます.
微妙な一局ですみません.

今,制作中のは素直にUCTを使っていないので,これよりどうなることやら・・・.
微妙にできてはいるんですが,弱いし要修正な感じです.

2010年10月1日金曜日

ポインタを保持するvector


#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int num = 5;
    vector<int*> v;

    v.push_back(&num);
    cout << "num = " << num << endl;
    cout << "*v[0] = " << *v[0] << endl;

    *v[0] = 15;
    cout << "num = " << num << endl;
    cout << "*v[0] = " << *v[0] << endl;

    return 0;
}

// execution result
/*
num = 5
*v[0] = 5
num = 15
*v[0] = 15

*/ 

個人的なメモ.
jk当然可能.

28/01/11 追記
この方法はよく考えたらよくないですね.
スコープ外れてもdeleteしてくれないし・・・.
ごめんなさい.
boostのshared_ptrを使ったほうが良いですね.

2010年9月30日木曜日

彼女曰く「しー」には「えっち」が不可欠なんだそうです

彼女と二人で「C」体験! (MF文庫J)

突っ込んだら負けなラノベ.

結構ブログなどで紹介されてたので,
本屋で580円(税別)に戸惑いながらも購入.

Cと思ったらC++だったり,
基底と派生が逆だったり,
ヘッダーのことをえっちと言ったり,
突っ込んだら負けなところがありますが,
ラノベな感じでいいんじゃないんでしょうか.

てか,久しぶりにラノベを読んだ.

2010年9月25日土曜日

PBL シンプルなシェルの作成

PBLっていうのは先生が問題を提示し,学生内で班などを形成して
学生同士の意見交換などにより問題を解決していく授業形式?です.

で,リダイレクション機能,パイプ機能,バックグラウンド機能,
exitと入力されたら終了することができる
シンプルなシェルを作成が問題として提示されてました.
ググってみると,情報関係の大学生もやっているので,よくある課題なのかなと思います.
俺がいた班は最終的には非カノニカルモードを使うことで,Tabキーが押されたら,
コマンドの予測表示(補完ではない)までいけました.

そこで,作成するのに役立った本などをご紹介します.
まずは,
 詳解UNIXプログラミング
です.と言ってもあんまり読んでないんですが,たぶん王道?だと思います.
訳本なので,英語に自信がある方は原本の方が良いかも.
社会に出る前には読んどきたい一冊ですが,今回の課題に対しては詳しすぎる気がしました.
あと重か(ry.

次にご紹介するのはこちら.
例解UNIXプログラミング教室
たぶん,今回の課題に一番マッチしていた本だと思います.
一番読んだし,コードが豊富で読み易かったです.オススメの一冊.
この一冊だけで,今回の課題はパスできると思います.

 次はこちら.
Unix/Linuxプログラミング理論と実践
位置づけは,初めに紹介した本を易しくした感じ.
説明とコードの割合がいい感じで,読み進めるのは楽かも.
図も分かりやすかったと思います.

他にも参考にした本があるんですが,あんまり読んでないので紹介は止めときます.
突き詰めれば突き詰めるほどいろいろ工夫できたので,面白い課題でした.

2010年9月22日水曜日

AOJ Volume 5 Problem 0505 : Questionnaire


#include<iostream>
using namespace std;

int main()
{
    for (int n, m, i, j, c; cin >> n >> m, i = n;)
    {
        int r[101] = {0};
        for (; i--;)
            for (j = 0; ++j <= m; !c ? : r[j]++)
                cin >> c;

        for (i = n + 1, c = 0; --i;)
            for (j = 0; ++j <= m;)
                r[j] != i ? : cout << j << (++c == m ? '\n' : ' ');
    }

    return 0;    
}

若干ショートコーディング気味のコード.
ショートコーディングを自分なりにちゃんとやると208 Bytesになりました.

2010年9月14日火曜日

俺より先にBotがツイートしやがった

誰でもできるTwitter Botの作り方―人気キャラにつぶやかせる

 Twitter Botを上の本を参考に作ってみました.
と言ってもまだHello World!をツイートした程度ですが.

つまずいたのは
sudo apt-get install libopenssl-rubyが必要なこと.
もしかしたら必要ないかもですが, no such file to load -- net/httpsのエラーが
入れたら消えたと思います.

本の内容は,懇切丁寧な感じで, 日頃からWeb APIに
触れている人はたぶん物足りないと思いますが,
そもそもTwitterって何な俺みたいな人には最適かもです.

アプリケーション名はクール狸(cool_tanuki)です.
クールにつぶやけるように, 卒業研究後に改良していきたいと思ってます.

2010年9月7日火曜日

モンテカルロ法を用いた円周率の算出風景

モンテカルロ法を用いた円周率の算出中の画像
実際はリアルタイムで点が増えてきます
Qtの練習第二弾として, モンテカルロ法を用いた円周率の算出風景?を
可視化できるものを作成してみました.

リアルタイムで点が増えて行くのはまぁまぁ気持ち良くないですが,
なかなか正確な値に近づかないのが,もどかしい気持ちにさせます.
ちなみに第一弾の5五将棋のGUIは未だに作成中です.
決して逃げた訳じゃないと思う・・・。

作成手順は
1.  正方形なウィンドウを作成し内接円を描く.
2. ウィンドウサイズ内にランダムに点を打ち,円の内外判定を行う.
 今回はupdate(x, y, width, height)で特定の場所を更新できることを用いました.
3. 4×円の内側 (円周上も含める) に入った点の数 / 点を打った数を中央に表示する.
4. 2と3を繰り返す.

っな感じです.
上の例では 内側の点は青く, 外側の点は赤くしてます.

2010年9月1日水曜日

AOJ Volume 1 Problem 0196 : Baseball Championship


#include <iostream>
using namespace std;

int main()
{
    int n;
    while (cin >> n, n)
    {
        char name[10];
        int win[10] = {0};
        int lose[10] = {0};

        for (int i = 0; i < n; i++)
        {
            cin >> name[i];
            for (int j = 0; j < n - 1; j++)
            {
                int s;
                cin >> s;
                if (s == 0)
                    win[i]++;
                if (s == 1)
                    lose[i]++;
            }
        }

        for (int i = n - 1; i > -1; i--)
            for (int j = 0; j < n - i; j++)
                for (int k = 0; k < n; k++)
                    if (win[k] == i && lose[k] == j)
                        cout << name[k] << endl;

    }

    return 0;
}

本来,ソートを行うべきですが,入力されるチーム数が最大10と少ないため,
ソートせずに,全勝のチーム,1敗 0引き分けのチームといった順番にヒット?させています.
絶対無駄な処理があり,実行速度は若干遅いだろうと思いますが,
コード自体がスッキリするので,これもありなんじゃないかと思います.

2010年8月27日金曜日

なんちゃってランレングス圧縮


#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

void Compress(string inputFileName, string outputFileName);
void UnCompress(string inputFileName, string outputFileName);

int main(int argc, char** argv)
{
    if (argc < 3)
        return 0;

    if (! strcmp(argv[1], "nz"))
    {
        Compress(argv[2], argv[2]);
        cout << "Compressed file is " << argv[2] << ".nz" << endl;
    }
    else if (! strcmp(argv[1], "unz"))
    {
        string outputFileName(argv[2]);
        string::size_type index = outputFileName.rfind(".nz");
        if (index != string::npos)
            outputFileName = "Unz" + outputFileName.substr(0, index);
        else
            return 1;

        UnCompress(argv[2], outputFileName);
        cout << "Extracting file is " << outputFileName << endl;
    }

    return 0;
}

void Compress(string inputFileName, string outputFileName)
{
    outputFileName += ".nz";
    ifstream fin(inputFileName.c_str(), ios::in | ios::binary);
    ofstream fout(outputFileName.c_str(), ios::out | ios::binary);

    if (! fin || ! fout)
        return;

    int delimiterPre = 0;
    int delimiterPost = 0;
    int rawByte, preByte, num = 0;
    preByte = fin.get();

    while ((rawByte = fin.get()) != EOF)
    {    
        if(rawByte != preByte || num == 255)
        {
            if (num > 1)
            {
                fout.write((char*) &delimiterPre, sizeof(char));
                fout.write((char*) &delimiterPost, sizeof(char));
                fout.write((char*) &num, sizeof(char));
            }
            fout.write((char*) &preByte, sizeof(char));
            preByte = rawByte;
            num = 1;
        }
        else if (rawByte == preByte)
            num++;

    }
    if (num > 1)
    {
        fout.write((char*) &delimiterPre, sizeof(char));
        fout.write((char*) &delimiterPost, sizeof(char));
        fout.write((char*) &num, sizeof(char));
    }
    fout.write((char*) &preByte, sizeof(char));

    fin.close();
    fout.close();
}

void UnCompress(string inputFileName, string outputFileName)
{
    ifstream fin(inputFileName.c_str(), ios::in | ios::binary);
    ofstream fout(outputFileName.c_str(),ios::out | ios::binary);
    if (! fin || ! fout)
        return;

    int rawByte, preByte;
    preByte = fin.get();

    while ((rawByte = fin.get()) != EOF)
    {
        if (preByte == 0 && rawByte == 0)
        {
            while ((preByte = fin.get()) == 0)
                fout.write((char*) &preByte, sizeof(char));

            rawByte = fin.get();
 
            for (int i = 0; i < preByte; i++)
                fout.write((char*) &rawByte, sizeof(char));

            if ((preByte = fin.get()) == EOF)
                break;
        }
        else
        {
            fout.write((char*) &preByte, sizeof(char));
            preByte = rawByte;
        }
    }

    if (preByte != EOF)
         fout.write((char*) &preByte, sizeof(char));

    fin.close();
    fout.close();
}


上のコードでの実行に起因する損害に関して責任を持ちません.
 あと,世の中の高専生はもっと賢いです.こんなコードは書きません.

上のコードは1バイト単位でデータのランレングス圧縮を行うようなものです.
俺,実は学校でデータ圧縮に関して何かやらなきゃいけない立場なようで,
バイナリでデータを扱う練習がてら作ってみたものなんですが,
圧縮になるときと,ならないときが出てきちゃう,ダメダメなものになってしまいました.

ここで簡単にランレングス圧縮の説明ー.
文字列Zeeeeeeeingってなのを考えたとき,
連続した文字に注目して文字列中に数字が出てこないとして,
数字+文字で数字の数だけ文字があることを表すとすれば
文字列Zeeeeeeeingのeは7eと省略でき,最終的に
Z7eingとすることで文字列長を10から6に圧縮でき,
確かこんな操作を行う圧縮をランレングス圧縮と呼ばれる(たぶん).

で,上のコードも1バイト読み取ってそんな操作を行っているんですが,
デリミターで問題?が生じた結果, 圧縮にならないときが生じてしまいました.
ここでデリミターは繰り返しがある位置を表す区切り文字のこととします.
上のコードではデリミターを0x0000にしています.
で0x0000 (文字の繰り返し回数) (繰り返し文字) と 4バイトでランレングス圧縮を試みてるんですが,
これだと5回以上連続で文字が出現しない限り,圧縮にならないことになります.
そこで,4回以下はそのまま出力すればいいやと思っていたら,
0x0000 の表記があった場合それがデリミターか単なる?0x0000なのか
区別がつかなくなることに気がつき,どうしようもなく,そのままにしてあります.
おそらく2回連続は良くある?ので3回以上はランレングス圧縮するようにすれば良くなるかもですが・・・.
で,最終的に上のコードが言いたいことは,1バイト単位でやってもそんな圧縮にならんってことです(たぶん).

圧縮に関しては, 卒研より相当締切り日的なものが近く,
どうにかしなければならないので,今からで遅すぎますが,
どうにかして行きたいと思います.

ちなみに上のコードでC++で書いたHelloを出力する
実行ファイルを圧縮してみたところ,7783 bytesとから 6365 bytesと
見事に微妙に圧縮されました.
他のファイルではデリミッター問題?で元より増加してしまいました(ダメダメです).

使い方
コンパイル
g++ -o RunLength このコードファイル名.cpp

圧縮 (例としてhelloファイルの圧縮)
./RunLength nz hello
でhello.nzってな圧縮ファイルが作成される.

解凍(伸長)
./RunLength unz hello.nz
でUnzhelloってな解凍ファイルが作成される.

helloとUnzhelloが同じファイルであることを切に願います.

2010年8月23日月曜日

5五将棋ってなボードゲームがあります

5五将棋 (Minishogi) の初期配置
現在ゲーム情報学で取り扱われているゲームの一つに
5五将棋と呼ばれる物があります.英語名ではMinishogiらしく,
その名の通り, 上図のような普通の?将棋を小さくしたようなボードゲームです.

今年日本で開催されるComputer Olympiad 2010でもShogi (5×5) 部門として開催されるようです.
UEC杯も開催されていて, 今年は12月4日に開催が予定されています.
囲碁は11月27日, 28日なので, 囲碁よりも遅い日程なんすね.
ルールは将棋と (駒の動きとか)は同じですが,細かいルールは
電通大の伊藤研究室が運営されてる5五将棋PORTALをご参照ください.

ゲームの探索空間は1060より少ない程度だと考えられていて,
オセロより少ない位だと考えられているそうです.俺にはオセロより難しく見えるけど・・・.
今の状況として, 柿木さんが作成されているK55が強いみたいです.
確か学習ベースでRLGOみたいに, 自己対戦により評価方法を学習しているらしい.
噂によれば, 指せば指すほど強く(勝ち方を学習する)らしく, K55に勝つには一発勝負が大事とか・・・.

ちなみに上の図は,Qt 4.6.3 LGPL版で作成しているもので, 手抜き感maxですが作成してます.
理由は, Qtの導入です・・・. 前x3回のブログでQtに関する書籍少ないと書きましたが,
サンプルが結構充実してたりするんで, 何とかなりそうです.

2010年8月22日日曜日

AOJ Volume 0 Problem 0077 : Run Length


#include <iostream>
using namespace std;

int main()
{
    char ch, n;
    while (cin.get(ch))
    {
        n = '1';
        if (ch == '@')
            cin >> n >> ch;

        for (int i = 0; i < n - '0'; ++i)
            cout << ch;
    }

    return 0;
} 

まともに解きすぎてると思う.
もっと柔らかく思いつきたい.

2010年8月19日木曜日

てへっ

Hello with Qt
IDEの一つ,Qt Creatorを使ってみました.
動作は意外にサクサクしていて,雰囲気はVisual Studioと同じ感じでした.
QtってLGPLになってから結構普及したんだと思うのですが,実際どうなんだろう.
書籍は少ないし,やっぱ国内はVisual Studioで十分ってことなのかなぁ・・・。

AOJ Volume 1 Problem 0105 : Book Index

#include <iostream>
#include <string>
#include <set>
#include <map>
using namespace std;

int main()
{
    int n;
    string str;
    map<string, set<int> > m;
    map<string, set<int> >::iterator p;

    while (cin >> str>> n)
        m[str].insert(n);

    for (p = m.begin(); p != m.end(); p++)
    {
        cout << p->first << endl;
        set<int>::iterator q = (p->second).begin();
        for (; q != (p->second).end(); )
        {
            cout << *q;
            cout << (++q != (p->second).end() ? ' ' : '\n');
        }
    }

    return 0;
}
 一つの書き方としてありかも.
あと, 書き方を変えてみました. こっちの方が一般的?
確かFuegoも書き方はこんな感じだったと思う.
いろいろ見て, 見習っていきたい.

HTTP/1.1 400 Bad Request

これのお蔭で結構時間を無駄にした.
バグは単純なもので,GET要求の中でHTTP/1.1のところをHTTP1.1ってしてた・・・.
ま,これで当分はこのミスをしないってことで.

 時間は大切に.

2010年8月17日火曜日

AOJ Volume 5 Problem 0501 : Data Conversion


#include <iostream>
#include <map>
using namespace std;

int main() {
    int n;
    while (cin >> n, n) {
        map<char, char> conversion;
        map<char, char>::iterator p;
        for (int i = 0; i < n; i++) {
            char pre, post;
            cin >> pre >> post;
            conversion[pre] = post;
        }

        cin >> n;
        for (int i = 0; i < n; i++) {
            char ch;
            cin >> ch;
            p = conversion.find(ch);
            cout << (p == conversion.end() ? ch : p->second);
        }
        cout << endl;
    }

    return 0;
}


mapを使ってキーが見つからない場合はマップの末尾を指す反復子を返すことを利用している.
全然,コンピュータ囲碁プログラムの話題ができなくて,テーマ変わっちゃいそうですが,今必死に考え中です・・・.

AOJ Volume 0 Problem 0051 : Differential Ⅱ


#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int n, min;
    cin >> n;

    for (int i = 0; i < n; i++) {
        string str;
        cin >> str;
        sort(str.begin(), str.end());
        min = atoi(str.c_str());
        sort(str.rbegin(), str.rend());
        cout << atoi(str.c_str()) - min  << endl;
    }

    return 0;
}

ショートコーディングすると,241byteでC++の中では一番短いみたいですが,
Cで書かれた一番短いコードとは100byte近く離されてる・・・。

AOJ Volume 1 Problem 0157 : Russian Dolls


#include <iostream>
#include <map>
using namespace std;

int main()
{
    int n, r, h;
    while (cin >> n, n)
    {
        // longest increasing subsequence: lis
        int k = 0, lis[200] = {0};
        multimap<int, int> dolls;

        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cin >> r >> h;
                dolls.insert(pair<int, int>(r, h));
            }
            if (! i)
                cin >> n;
        }

        for (multimap<int, int>::iterator p = dolls.begin();
             p != dolls.end(); p++)
        {
            for (multimap<int, int>::iterator q = dolls.begin();
                 q != p; q++)
            {
                if (p->first > q->first && p->second > q->second)
                {
                    if (lis[distance(dolls.begin(), p)] 
                        <= lis[distance(dolls.begin(), q)])
                    {
                        lis[distance(dolls.begin(), p)] 
                            = lis[distance(dolls.begin(), q)] + 1;
                        if (k < lis[distance(dolls.begin(), p)])
                            k = lis[distance(dolls.begin(), p)];
                    }
                }
            }
        }
        cout << k + 1 << endl;
    }

    return 0;
}

I fill my spare time on the Web site of "AOJ".
What's "AOJ?"
AOJ stands for Aizu Online Judge.

他にもオンラインジャッジはUva Online Judgeなどありますが,
会津大学のオンラインジャッジは,パソコン甲子園などの日本語の問題も幅広く取り扱っていて
高校, 高専, 大学のプログミング部や同好会は結構使っているんじゃないかなぁと思います.
コードを書いて基礎体力?とアルゴリズムを勉強していきたい人には打って付けだと思います.

上のコードはDPを用いて解いたものです.
最長増加部分列を求めるような問題でした.
たぶん,コードを見ればその人との力量が分かると思うんで,
今こんな感じですが, 今後も励んでちっとでも美しく書けるように頑張りたいと思います.

2010年8月15日日曜日

卒業研究

GoGuiを用いたデバック風景
黒番が自分で白番が作成中の囲碁プログラムによるもの

そう,卒業研究の内容が決まってないんです.
題材はコンピュータ囲碁で行こうと思うんですが・・・。

実際は決まってたんですけど上手く行ってなくて,
方向転換する 必要性が出てきた感じです.
できれば,この夏休み中にまだ上手く行ってないアイディアで
再度,勝負したいんですが・・・.
プログラミング言語と計算機はあるんで,ヤル気次第・・・?

別に自己対戦でパターンの評価をするようなプログラムを作成して
みたんですが,なかなか良い結果はでなくて,ちと休憩中な感じです.

他に考えられる研究としては,自分が現在所属している研究室は
機械学習を専門としているので,それの応用とかだと思います.
機械学習といえば強化学習を用いたプログラム,RLGOが有名です.

何にせよ,早くこのブログに棋譜が掲載できるような
プログラムを作ってやんよ,な強気な姿勢で夏を過ごしたいと思います.

2010年8月14日土曜日

ようやく夏休み

今週から,ようやく夏休みです.
いろいろ,楽しみたいと思います.

また,卒業研究の内容がまだ確定してないので,
できればこの休み中にいろいろ考えて行きたいと思います.

Hello, I'm hizz

Hello, I'm hizz. I'm a CS major.
な日本の学生です.英語は好きですが,苦手です.

The Periphery of Game Informatics (ゲーム情報学の周辺のつもり) では
その名の通り,ゲーム情報学の周辺について書いて行きたいと思っています.
ゲーム情報学とは, 科学的にゲームを捉えてゲームを題材として情報処理の
諸分野を研究する分野で, 例えば囲碁や将棋のボードゲームとかRoboCup
Soccerとか扱います.

具体的に今はコンピュータ囲碁に挑戦しています.
最近のコンピュータ囲碁は モンテカルロ法を上手く使うことにより,
棋力の向上に成功しています.
最近の主な研究対象は,そのモンテカルロ法の並列化とかです.
自分のプログラムはまだまだ強くなく, 正直弱いですが, 11 月27, 28日に
開催される第4回UECコンピュータ囲碁大会で予選通過するプログラムを
作ることを目標に頑張ってます.
このブログでは,その試行錯誤などを書いていければと思います. 

絶対不定期なブログですが, 暇な時に見て頂ければと思います.