2011-01-01から1年間の記事一覧

USIプロトコルへの様々な疑問にお答えします

USIに文句を言うだけ言う http://d.hatena.ne.jp/merom686/20111217 まあ、USIプロトコルがいろいろアレであることは、いまさら言うまでもないことなのですが、なぜこんなプロトコルがコンピューター将棋の標準になっているかと言うと、将棋所という素晴らし…

指し手オーダリングのための高速ソート手法の提案(下書き)

めちゃんこすんごいろんぶんのしたがき著者 : LS3600 & ひよこ ■ 概要指し手のオーダリングを行なうために、生成した指し手に対して何らかの手法で点数をつけて、その点数によってソートしなければならない。これをオーダリングと呼ぶ。本提案は、このオーダ…

置換表に経路に依存する局面のスコアを書き込まない

将棋では連続王手の千日手は王手をしている側が負けです。だからと言って連続王手のループを見つけた時点で攻め方の負けと判断したのではGHI問題を引き起します。さて、いま、定跡を自動構築することを考えます。ここで言う定跡とはプロ棋士の棋譜の何手目ま…

「入玉指向の将棋プログラムの作成」の改善案

GPWSで発表された田中哲郎先生の「入玉指向の将棋プログラムの作成」について思うところがありまして、以下にだらだらと書いておきます。なお、本論文は以下のURLから読めるようです。https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action…

USIプロトコルのponderの仕様と稲庭対策のこと

昨日の記事に対して将棋所の作者様から直々にコメントをいただいたのでお答えします。 相手の正確な残り時間がわからないということですが、そもそも何のために知りたいのでしょうか。相手の残り時間を知って、それをどういうふうに使うのか、少し考えてみま…

USIプロトコルのponderhitについて

将棋所のponderについて http://d.hatena.ne.jp/hiyokoshogi/20111027/1319696413 私が思うに、ponderhitが送られてきたときに持ち時間情報が付与されていないのとかどうなんでしょう。自分の持ち時間はgo ponderのときに送られてきているのを保存しておけっ…

合法手じゃない合法手のこと

■ はじめにBonanzaの指し手生成/合法手判定は結構ややこしく、ややこしい原因は将棋用語にいくつかの用語が不足しているからなのですが、ここではその不足している用語を新たに定義しながら、自分自身のためのメモを書き残しておきます。自分用のメモですの…

3駒関係のパラメーターを計算式で割り出す実験

Bonanzaの3駒関係ですが、このパラメーターを棋譜から学習させたこと、すなわちボナメソがコンピューター将棋のブレークスルーであるように言われていますが、まあ、実際にもBonanzaに関してはその通りなのですが、私は、それより3駒関係という評価関数とい…

Bonanzaの駒の価値はどこに書かれているのか その5

それでは、make_moveでいつ駒割が変動するか考えてみましょう。 指し手を大別すると次の4つに分類されます。1. 駒を取らない、成らない移動 2. 駒を取らない、成る移動 3. 駒を取る、成らない移動 4. 駒を取る、成る移動 1.は駒割は変動しません。 2.は、成…

Bonanzaの駒の価値はどこに書かれているのか その4

p_value , p_value_ex , p_value_pmについて一通り説明が終わったところで、これらの変数がどう使われているかについて見ていきましょう。基本的には、盤面初期化(CSA形式のファイルを読み込んだときや、平手盤面で初期化したときなど)に、ini_game関数(debu…

Bonanzaの駒の価値はどこに書かれているのか その3

p_value,p_value_exの解説は終わりまして、今回はp_value_pmという配列についての解説です。だいたい、Cで書かれたプログラムというのは、型がどれもこれもintになっていたりして、型を見ても何をする変数なのかさっぱりわからないのが実情なんですよね。じ…

Bonanzaの駒の価値はどこに書かれているのか その2

p_valueに関しては、そこから派生する2つの配列があります。p_value_exとp_value_pmです。p_value_exは、p_valueの値を2倍したものです。歩を相手に取られたときには、p_value_ex[pawn]分だけ駒割のスコアが変動します。「自分の駒を失った損」+「相手がその…

Bonanzaの駒の価値はどこに書かれているのか その1

Bonanzaで駒割を計算するときの、駒の価値はどこに書かれているのかというのは、簡単なようで少しトリッキーです。今回はこの問題について説明します。 まず、駒自体の価値は、param.hでdefineされています。 #define DPawn 87 /* 174 */ #define DLance 232…

SEEの高速化について

私は最近何をしているかと言うと…正直、あまりコンピューター将棋の開発はやっていないのですが、まあビールを飲みながらテレビで野球観戦をするような程度の軽いノリでソースコードをいじくりまわして、ああだこうだ言いながら鑑賞(?)するのが趣味です。 最…

CSA形式のデータ書き出し部 解説

さて、今回からはCSAファイルの書き出し部について解説していきます。 と言っても、「CSAファイルの書き出し」の記事は誰も期待してませんよね。 CSAファイルの読み込みにしても、棋譜からの学習のときにCSAファイルを読み込むのにいる程度。 LAN対戦はUSIプ…

探索木のvalidatorを書こう!! その7

前回の問題の解答を。 配列、Board[sq]上に先手玉が二つあるとき、1)〜10)のどこに引っかかるでしょうか。 Bonanzaでは、玉のBitboardというのは存在しなくて(BB_HDKのように他の駒と合成されたBitboardは存在する)、先手玉の位置はSQ_BKINGという変数(実体…

探索木のvalidatorを書こう!! その6

今回はexam_bb(debug.cのなかに書かれている)を見ていきます。exam_bbのbbとはBitboardのことで、Bonanzaの保持しているBitboard盤面の正当性をチェックする関数です。 チェックしている項目は以下のものです。 1) 手番が0か1であること 2) 持ち駒の使ってい…

探索木のvalidatorを書こう!! その5

少し話が脱線してしまいました。 だいたいにして、大学の輪講や、勉強会なんかでは1時間ぐらいでやっちゃうようなことをこのブログでは10回ぐらいに細切れに分けてお送りしております。スローペースすぎてすみません。 毎日10分〜15分程度、こうやって少しず…

駒はsignedがいいのかunsignedがいいのか

Bonanzaでは駒を表現する型はs8(singed char)になっています。 さて、問題です。私のように設計した場合、 -(int)UToCap(move) に相当する部分はどう書けるでしょうか?なるべく速いコードを求みます!http://d.hatena.ne.jp/LS3600/20111001 私が書いたコー…

モンテカルロは公平なシミュレーションではないという話

a) 500手以内に4760局、1000手以内に7294局が終局。(今回の結果) b) 500手以内に5789局、1000手以内に8075局が終局。(前回の結果) 終局数が10%程度減りました。明らかに終局しにくくなっています。 終わらないんです 〜 ランダムプレイヤーは賢くなかった(ひ…

探索木のvalidatorを書こう!! その4

あと、is_move_validのソースコード上で // fromが81未満 == 盤面内の駒の移動 if ( from < nsquare ) { // 動かす駒 piece_move = (int)I2PieceMove(move); if ( turn ) { // 後手ならば // 移動元のところにあるのは後手の駒でなければならない if ( BOARD…

終わるんです 〜 ランダムプレイヤーは何故賢いのか

なんか最近、コンピューター将棋界にはモンテカルロブームが到来しているらしいので、モンテカルロ型の探索についてつらつらと書いてみます。 まず、ランダムプレイヤーを実装するとします。ここで言うランダムプレイヤーとは、合法なすべての指し手を生成し…

探索木のvalidatorを書こう!! その3

is_move_validを見ていて思い出したのですが、以前も少し書いたようにCSA読み込み中で合法手かどうかをテストするためにすべての指し手を生成してそのなかの指し手に含まれるかをチェックしているのですが、あの部分、速度的な観点からは、この is_move_vali…

探索木のvalidatorを書こう!! その2

Bonanzaで実装されている主要なvalidatorは次の3つと言えるでしょう。 // valid.c int is_move_valid( tree_t * restrict __ptree__, unsigned int move, int turn ); int exam_tree( const tree_t * restrict ptree ); // debug.c int exam_bb( const tree_…

探索木のvalidatorを書こう!! その1

Bonanzaのコードに致命的なバグが少ないのは、探索木のvalidatorがあることが理由に挙げられると思います。ここで言うvalidatorとは、正当性(状態が正しいかどうか)をチェックする関数のことです。 探索木で言えば、 ・敵陣の1段目に成っていない歩・香が無…

Bonanzaのadd_behind_attacksは結構無駄

さて、昨日の問題の答えですが、平岡さん(id:hiraoka64)から昨日のコメント欄に解答がありました。詳しくは昨日のコメント欄を見ていただきたく…。 また、他の駒(桂・角・飛)の王手生成についても同様です。さらに言えば昨日のケースではp[0]だけが問題であ…

Bonanzaの王手になる指し手生成のバグについて

で、その後は香車の移動先が敵陣かどうかを判定せずに、 香車の成りの手を生成しています。 FLAG_PROMOが成りを表しています。Bonanzaの王手生成(buoyance) http://d.hatena.ne.jp/hiraoka64/20110923/1316747966 そういや、私もそれBonanza 4.12のときに気…

Bonanza型の評価関数の限界について

Bonanza以前の評価関数は挟撃形ならば挟撃する側はプラス何点というような評価をしていたわけですが、Bonanzaで導入された3駒関係(KPP)は、それを内包していました。 これと同様に、4〜6駒関係は自動的に重要なさまざまな概念を内包しているということは言え…

Bonanzaは何故入玉模様の将棋が弱いのか?

Bonanzaの評価関数はプロ棋士の棋譜から学習させていて、入玉模様の棋譜は絶対数が少ないため、入玉模様の将棋は正しく学習できていないというのが定説であります。 しかし、単に教示データが少ないという理由だけであれば、手でドーピングするなり、制約条…

懸案の局面

優秀なコンピューター将棋開発者には、自分が作っているコンピューター将棋が正しく評価できない懸案の局面というのがいくつも頭のなかにありまして、まあ、私はいま気になっているのは次の局面のみなのですが、そういう意味では私は「優秀なコンピューター…