2012年12月4日火曜日

数学と将棋がわからない人が5五将棋の最大分岐数を求めるとこうなった

Twitterでmath26さんが以下のようなツイートをされていて
わたし、木になります!(*´∀`*)教えて、ホータロー

分岐数は合法手の数と考えられるので,
ようは5五将棋で合法手は最大何手なのかっていう問題だと思います.
まずはホワイトボードを使って考えてみました.
すると,以下のことに気が付きました
  • 相手は玉だけが一番都合がよさそう・・・
  • 持ち駒はそれぞれ1種類ずつ持っていたほうがいい
  • 駒を盤上に置くと打つ場所が1つ減るので,持ち駒は最大5種類であるから全体として最大で5つの合法手がなくなる
こんなことに注意しながら考えると次のような局面が得られました.


自分,打ち歩詰めに関しての知識が乏しいのですが,たぶんこの局面の分岐数は138です.(案外ある・・・

次に,この問題は玉2枚は必ず盤面上に配置し,また金銀(または成銀)飛車(または龍)角(または馬)をそれぞれ1枚ずつ盤面または駒台に配置し,残りの駒は自分側の駒台に配置した場合に,合法手の数が最大になる局面を見つけるのと同じなんじゃないかと考えました.ただし,当然その局面は相手の玉に対して利きがないものを対象とします.以下そう考えた理由が続きます・・・。

駒台には駒は1種類ずつあったほうが良い理由としては,盤上において1つの駒の合法手の最大数は利きに駒がない状態の3三馬や4三龍などで得られる12です.一方,打つ駒以外が盤面にすべて配置されていたとしても打つ合法手はおよそ14あります.このことから,駒は1種類ずつ自分の駒台にあったほうが良いと考えられます.(こう単純じゃないんかな・・・ orz)

次に歩は盤面に配置しない方がいいと考えました.盤上に配置してしまうと駒を打つ場所が1つ減ってしまいます.したがって,持ち駒の種類の数分たぶん合法手は減ります.一方,歩に関する合法手の数は最大で2です.よって,持ち駒の種類が3以上であれば歩を配置することによって最大分岐数は増加しないと考えられます.また,先に述べたように持ち駒の種類の数が多いほど種類が少ないときの場合と比べて合法手の数は減ることはないと考えられます.このことから,歩は駒台の上にあったほうがよいと考えられます.

相手は玉1枚のみが最大分岐する局面が得られやすいと考えました.これは相手の玉を配置しないで(もはや将棋じゃないけど)考えたときと配置した場合との最大分岐数が同じであれば簡単に示せそうです.なぜなら,そのような状況で相手の玉以外の駒を配置した場合に最大分岐数が増加することはおそらくないと考えられるからです.

以上の考え(仮定?)をもとにプログラムを作成し,合法手が最大となる局面を求めてみました.結果として以下の10局面2局面*が得られました.この局面はすべて合法手がたぶん138あります.(打ち歩詰めがわからない・・・)
今回,歩は自分の駒台に固定しました.また,相手に1枚渡した場合,駒台に置く以外に盤面上にも配置できることから,分岐数が138の局面は20以上あると考えられます・・・.
相手の玉を配置しない場合でも得られた最大分岐数は138でした.




また,歩(またはと)を盤面(または駒台)に配置する条件を追加した場合も同様に最大分岐数は138で,そのとき敵玉を配置しない場合でも最大分岐数は138でした.以下の図は上記で示した局面以外に得られた局面で,上の図の金がとに変わっています.これから,各駒をそれぞれ1枚ずつ任意の盤面のマスに配置(または駒台に配置)した場合における最大分岐数は138であることがわかりました.また各種類の駒を2つ盤面に配置した場合,最大分岐数は増加しないことから,たぶん5五将棋の最大分岐数は138なのではないかと思います.



寝てないこともたぶんあって,文章がスゴイヤバいですが,数学と将棋はわからない自分が求められた5五将棋の最大分岐数は138でした.

*10局面の内8局面は自玉が相手の敵玉の利きにつっこむものが含まれていました.これは反則手だそうです.将棋って奥が深い(・∀・;) math26さんにご指摘頂きました.ありがとうございます.また,金はとに代えてもいいと助言を頂きました.(2012年12月4日修正)

2012年11月15日木曜日

In 箱根


先週はGPW2012のアルバイトをさせて頂きました.
冷房の中始まったGPW2012( ̄□ ̄;)!!
(不手際で申し訳ございませんでした.orz  いつ暖房から冷房に変わったのか・・・)

あらかた自分は受付にいたので発表はあまり聞けなかったのですが,
モンテカルロ将棋のセッションがあるなど,
昨年とはちょっと違った傾向にあったと思いました.

GPWが終わった後,ちょっと周りを散策.
天気があんまし良くなかったんですが,
紅葉がめっちゃ綺麗でした.(*´ω`*)

2012年9月22日土曜日

お久にAOJでショートコーディング

久しぶりにAOJでショートコーディングしました.
問題は20002408で,比較的簡単な問題・・・.
まだショートコーダーの標的になっていないこともあり,
この記事を書いている時点では一番短いみたい.
頑張ればまだまだ短くなりそう.( ・∀・)ノ

2012年8月8日水曜日

bashでスタック領域を解除?する方法

/etc/profile.dにroot権限でulimit.shを作成し
ulimit -s unlimited
と編集し再度ログイン.
ulimit -aで解除できているか確認できる.
もしかしたらchmod +xが必要かも.
cshでは
unlimit stacksize
らしい.
そしてこれはあんまりいい事ではなさそう・・・.

2012年8月5日日曜日

どうでもいいこと

[Desktop Entry]
Name=GoGui
Comment=GoGui
Exec=goguiのパス %f
Terminal=0
Type=Application
Categories=Application
を~/.local/share/applications/gogui.desktopに書いて保存
なんでコマンド指定できないんだっけか・・・

2012年5月23日水曜日

C++を勉強中・・・ orz

std::shared_ptr使っているときにthisポインタを扱いたいときは
std::enable_shared_from_this<クラス名>を継承して,
shared_from_this()を使用して取得する・・・であっているのかな・・・.

#include <iostream>
#include <memory>

class Student : public std::enable_shared_from_this<Student>
{
public:
    Student(std::string name, int first_score, int second_score)
        : name_(name), first_score_(first_score),
          second_score_(second_score) {}
    ~Student() { std::cout << "delete " << name_ << std::endl; }

    void printScore() {
        std::shared_ptr<Student> ptr = shared_from_this();
        std::cout << name_ << " : "
                  << first_score_ + second_score_ << std::endl;
    }
    std::shared_ptr<Student> getSharedPointer() {
        // これだとやばい・・・
        // return  std::shared_ptr<Student>(this);
        return  shared_from_this();
    }
private:
    std::string name_;
    int first_score_, second_score_;
};

int main()
{
    auto student = std::make_shared<Student>("Miyanaga", 5200, 24000);
    auto it = student->getSharedPointer();

    it->printScore();
    sleep(1);

    return 0;
}

2012年5月5日土曜日

Bonanzaが・・・

今週は電通大で第22回世界コンピュータ将棋選手権が開催されてます。
昨日は二次予選がありましたが、なんとBonanzaが敗退となってしまったようです・・・。
一発勝負は厳しいですね・・・。

開発者のインタビューでは学習の対象に探索する深さを入れてるとか
って話があり、そんなのもあるんだと思いました。無知ゴメン

強化学習で深さを考慮したのは知ってるけど、
それと似たようなものなのかな・・・?
(アピール文章見ればいいやないか orz 全然違った・・・へー・・・)

今日は決勝。
どんな棋譜が残るんでしょうか・・・。