contents memorandum はてな

目次とメモを置いとく場

『Java将棋のアルゴリズム――アルゴリズムの強化手法を探る[I・O BOOKS]』(池泰弘 工学社 2016//2007)

著者:池 泰弘[いけ・やすひろ](1971-) プログラマー。ITコンサルタント
シリーズ名:I/O BOOKS
備考:以下個人的なメモ。
  本書に至る改訂の履歴と、使用するプログラミング言語
 C++ 『コンピュータ将棋のアルゴリズムーー最強アルゴリズムの探求とプログラミング』(2005年)
 JavaJava将棋のアルゴリズムーーアルゴリズムの強化手法を探る』(2007年)
 JavaJava将棋のアルゴリズムーーアルゴリズムの強化手法を探る[改訂版]』(2016年)


���Ҿ�����Java������ ���르�ꥺ��[������]

 2012年、コンピュータとプロ棋士が対戦する「電王戦」がはじまりました。 そして2015年10月、情報処理学会がコンピュータ将棋の実力はトッププロ棋士に追い付いている(統計的に勝ち越す可能性が高い)という分析結果を出し、「コンピュータ将棋プロジェクト」の終了を宣言しました。 しかし、「コンピュータ将棋」の強さがプロ棋士を越えたからと言って、開発を辞めてしまう開発者はどれくらいいるのでしょうか。その程度のことで開発を辞める開発者は、おそらく誰もいないでしょう。
  *   
 このように、大きな動きの中にある今、「コンピュータ将棋」ですが、本書はそんな「コンピュータ将棋」のアルゴリズムを、一から解説しています。 本書では、使用言語としてJavaを使っていますが、アルゴリズムに絞って解説しているので、「C」や「C++」など他の言語にも応用することが可能です。 また、「将棋」のルールや駒の動かし方から説明しているので、「将棋」がよく分からない人でも手軽に読むことができます。 本書掲載の「将棋プログラム」もダウンロードできるので、プログラム制作の参考になるのはもちろん、「将棋プログラム」の実際の動きを見ながらアルゴリズムを学ぶことができます。
 ※本書は好評だった「Java将棋のアルゴリズム」に最新の情報を加筆し、現状に合わせてプログラムを一新しました。

【目次】
はじめに/改訂版にあたって [002-003]
CONTENTS [004-005]
ファイルのダウンロードについて [005]


1章 将棋のルール
1-1 将棋のルール 008
  将棋の基本ルール
  盤上の位置を表わす符号
  駒の名称と動き方
  禁手
  棋譜の表記法


2章 将棋のルールの実装
2-1 基本的な定数の定義 020
2-2 「局面」の表現方法 023
2-3 「位置」の表現方法 027
2-4 「手」の表現方法 028
2-5 局面での合法手の生成 029


3章 簡単なユーザー・インターフェイスと思考ルーチンの実装
3-1 インターフェイスと思考ルーチンの実装 054


4章 「局面の評価」の実装と「思考ルーチン」の改造 「将棋」のルールの実装
4-1 評価関数 064
4-2 駒の価値 065


5章 MinMaxとαβ法
5-1 先読みをする 072
5-2 MinMax法 073
5-3 αβ法とは 079
5-4 「MinMax」と「NegaMax」、「αβ」と「Negaαβ」 085


6章 実装の高速化
6-1 高速化の実際 090
    盤面の一次元配列化
    盤面を一手戻す関数の追加
    持ち駒の表現の配列化
    評価関数の差分計算
    玉の位置の保持
    局面の中で利きを管理する
    『ピン』の概念を導入する


7章 序盤定跡
7-1 定跡とは 110
7-2 定跡データの保持の方法 111
7-3 定跡通りに指すためのプログラム 112
7-4 定跡データを用意する方法 116
  PLC形式のデータ
  棋泉形式のデータ


8章 序盤の駒組み
8-1 序盤の考察 126
  実際のプログラミング


9章 中終盤の駒の価値の評価
9-1 中終盤での駒の評価 142
9-2 実際のプログラム 143


10章 指し手の評価と前向き枝刈り
10-1 指し手の評価 158
10-2 αβ法と組み合わせる 172
10-3 手法の評価 173


11章 ハッシュ法とハッシュ法を用いた高速化
11-1 ハッシュ法とは 178
11-2 将棋におけるハッシュの方法 179
11-3 乱数を用いたハッシュ表の生成 180
11-4 ハッシュ法を用いた高速化 185


12章 通信の実装
12-1 CSAプロトコル 196
12-2 CSAプロトコルの実装 196


13章 相手思考時間の利用
13-1 スレッドとは 208
13-2 通信や相手の入力などを待ちながら思考する 208


14章 「複数スレッド」での探索
14-1 並列化 214
14-2 変更を加えたプログラム 215


最終章 これからの課題とヒント
15-1 課題とヒント 230
15-2 展望 ~未来に向けて~ 234


索引 [237-239]






【抜き書き】
・ピンの処理高速化にまつわる複雑さ(p.108)。
 前著(※『コンピュータ将棋のアルゴリズム――最強アルゴリズムの探求とプログラミング』(2005年)の方を指す)と本書との内容の異動の理由を説明している。(本書にはサンプルコードがサイト上で公開されているとは書いていなかったので、)読者が、その処理を高速に動かすためのアルゴリズムを知るには、前著を古書で探し、C++言語を(すこし)学ぶ必要がある……ということになる。

 これを実装するには、利きを管理する必要がある。

 ・自分の玉に利きがある(王手をかけられている)場合には、王手を防ぐ手のみを生成する。
 ・自分の玉を動かす際には、敵の利きのないところにのみ動くようにする。

 これらの処理は、かなり複雑になるため、読者への課題としたい。なお、前著「コンピュータ将棋のアルゴリズム」では、最初から『ピン』や『利き』を意識したデータ構造となっており、高速ではあるが非常に分かりにくいものになっていたことを追記しておきたい。