Sunfish version 1.0 アピール文書 1. 実装の概要 1.1 内部表現 - 配列とbitboardを両方使用 - 利き情報の差分計算 1.2 評価関数 - オリジナルの評価項目 - Bonanza Methodによる学習 1.3 探索 - BonanzaやCraftyを参考にした全幅ベースの探索とその並列化 - df-pnによる高速な詰み探索(ルート局面のみ) 2. 盤面の表現 Sunfishでは, れさぴょんなどと同様の配列による盤面の表現と共に, bitboardと利き情報を持っています. また, 常に双方の玉の位置を保持しています. 配列表現では盤上の駒を列挙する場合などに不利です. 一方で, bitboardがあらゆる側面で配列表現に勝るとも言えません. 両方を用いることで最適な実装にならないかと考えてもいますが, 現状では両方を更新しなければいけないコストの方が大きいようです. 3. 評価関数 Sunfishの局面に対する評価項目 - 駒割り - 各持ち駒の枚数 - 玉の位置 x 各持ち駒の枚数 - 玉との相対位置 x 駒の種類 - 玉の筋(/段) x 各駒の玉との相対位置 x 駒の種類 - 玉との相対位置 x 駒の種類 x 右(/左下/下/右下)に隣接する駒 - 玉との相対位置 x 香の自由度(移動可能なマスの数) - 玉との相対位置 x 角(/馬)の自由度 - 玉との相対位置 x 飛(/竜)の自由度 - 玉との相対位置 x 角(/馬)の左上(/右上/左下/右下)への自由度 - 玉との相対位置 x 飛(/竜)の上(/左/右/下)への自由度 - 玉との相対位置 x 香車の利き上の駒 - 玉との相対位置 x 角(/馬)の左上(/右上/左下/右下)への利き上の駒 - 玉との相対位置 x 飛(/竜)の上(/左/右/下)への利き上の駒 - 玉との相対位置 x 歩の2マス前の駒 - 玉の周囲8マスの自分の金銀の数 - 玉の周囲8マスの相手の金銀の数 - 玉の周囲24マスの自分の金銀の数 - 玉の周囲24マスの相手の金銀の数 - 玉の筋(/段) x 玉の周囲8マスの自分の金銀の数 - 玉の筋(/段) x 玉の周囲8マスの相手の金銀の数 - 玉の筋(/段) x 玉の周囲24マスの自分の金銀の数 - 玉の筋(/段) x 玉の周囲24マスの相手の金銀の数 - 玉の位置 x 各筋に自分が歩を打てるか - 玉の位置 x 各筋に相手が歩を打てるか - 玉に隣接する駒 x 玉との相対位置 x 駒の種類 - 2五(/4五/6五/8五)に桂が居るか x 玉の位置 x 持ち駒の歩の数 - 2五(/4五/6五/8五)に桂が居るか x 玉の位置 x 隣の筋に歩が利くか - 玉の周囲9マスの自分の利きの配置 - 玉の周囲9マスの相手の利きの配置 - 玉の筋(/段) x 玉の周囲9マスの自分の利きの配置 - 玉の筋(/段) x 玉の周囲9マスの相手の利きの配置 - 玉の位置 x 歩打ちで王手できるか - 玉からの方向 x ピンされている駒 - 玉の筋(/段) x 玉からの方向 x ピンされている駒 - 玉からの方向 x ピンされている駒 x 距離 - 玉の筋(/段) x 玉からの方向 x ピンされている駒 x 距離 - 玉との相対位置 x 桂馬の利き先(右/左)の駒 - 玉の周囲で移動可能なマスの数 - 玉の筋(/段) x 玉の周囲で移動可能なマスの数 - 玉の周囲8マスの利きの勝ち負け - 玉の位置 Sunfishでは棚瀬将棋流の方法で次数を落とし, スパースネス問題へ対処しています. 評価関数内でのアクセス回数を減らすために, これを次数の高い方に足し込んで使用しています. 4. 配列を用いた計算の高速化 盤面上の座標の差から方向への変換テーブルなど, あらかじめ計算した値を配列に保持しておいて 様々な計算を高速化しています。 もっとも, 他のプログラムでも同様の事は行われていますが, Sunfishでは特に多くのテーブルを持っています.