Ubuntuで将棋ソフトelmo (2017/06/24)

第27回世界コンピュータ将棋選手権で優勝した将棋ソフトelmoをUbuntuで使いたい。

elmoは評価関数と定跡だけなので、この他に将棋エンジンと将棋ソフトGUIが必要となる。elmoを将棋エンジンに組み込み、その将棋エンジンを将棋ソフトGUIに登録するという手順を経る。

elmo開発者の瀧澤誠さんご自身が説明している導入方法では将棋エンジンとしてやねうら王、将棋ソフトGUIとして将棋所を使っている。そこで、ここでもそのようにする。ただ、将棋ソフトGUIは個人的にはShogiGUIが好みなので、そちらでのやり方も紹介する。

monoのインストール

Ubuntuで使うにはmonoが必要なのでインストールする。

①以下のコマンドを端末に入力して「Enter」キーを押す。

$ sudo apt-get install -y mono-complete

②「[sudo] **** のパスワード:」でパスワードを入力して「Enter」キーを押す。

やねうら王のダウンロード

①以下のアドレスをクリックする。

https://github.com/yaneurao/YaneuraOu/

②「Clone er download」をクリックする。

③「Clone with HTTPS」で「Download ZIP」をクリックする。

④「YaneuraOu-master.zip を開く」で「ファイルを保存する」を選択する。

⑤「OK」ボタンをクリックする。

elmoのダウンロード

①以下のアドレスをクリックする。

https://drive.google.com/file/d/0B0XpI3oPiCmFalVGclpIZjBmdGs

②「elmo.shogi.zip」で「ダウンロード」ボタンをクリックする。

③「Google ドライブではこのファイルのウィルス スキャンを実行することはできません。」で「ダウンロード」ボタンをクリックする。

④「elmo.shogi.zip を開く」で「ファイルを保存する」を選択する。

⑤「OK」ボタンをクリックする。

将棋所のダウンロード

①以下のアドレスをクリックする。

http://www.geocities.jp/shogidokoro/download.html

②「将棋所3.9.0をダウンロード」で「ダウンロード」リンクをクリックする。

③「Shogidokoro.zip を開く」で「ファイルを保存する」を選択する。

④「OK」ボタンをクリックする。

(参考)ShogiGUIのダウンロード

①以下のアドレスをクリックする。

http://shogigui.siganus.com/download.html

②「2017/6/21 ver 0.0.6.11」で「zip版」ボタンをクリックする。

③「ShogiGUIv0.0.6.11.zip を開く」で「ファイルを保存する」を選択する。

④「OK」ボタンをクリックする。

ダウンロードファイルの解凍

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ unzip -d ~/デスクトップ ~/ダウンロード/YaneuraOu-master.zip; \
unzip -d ~/デスクトップ ~/ダウンロード/elmo.shogi.zip; \
unzip -d ~/デスクトップ ~/ダウンロード/Shogidokoro.zip

○「ShogiGUIv0.0.6.11.zip」ファイルを解凍する場合は以下のコマンドを端末に入力して「Enter」キーを押す。

$ unzip -d ~/デスクトップ ~/ダウンロード/ShogiGUIv0.0.6.11.zip

elmoをやねうら王に設置

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ cp ~/デスクトップ/elmo.shogi/eval/*.bin ~/デスクトップ/YaneuraOu-master/exe/eval; \
cp ~/デスクトップ/elmo.shogi/book/yaneura_format/standard_book.db ~/デスクトップ/YaneuraOu-master/exe/book; \
cp -r ~/デスクトップ/YaneuraOu-master/exe/eval ~/デスクトップ/YaneuraOu-master/exe/2017Early; \
cp -r ~/デスクトップ/YaneuraOu-master/exe/book ~/デスクトップ/YaneuraOu-master/exe/2017Early

やねうら王のコンパイル

やねうら王にあるexeファイルはUbuntuでは実行できないようである。そこでソースファイルをコンパイルする。

やねうら王開発者のやねうらおさんによると「make avx2」でコンパイルすればよいらしい。だが、私の環境でははうまくいかなかった。そこで「make sse42」とした。

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ cd ~/デスクトップ/YaneuraOu-master/source; \
make sse42; \
cp ~/デスクトップ/YaneuraOu-master/source/YaneuraOu-by-gcc ~/デスクトップ/YaneuraOu-master/exe/2017Early

やねうら王(elmo)を将棋所に登録

①以下のコマンドを端末に入力して「Enter」キーを押す。

$ mono ~/デスクトップ/Shogidokoro/Shogidokoro.exe

将棋所を起動するときはこのコマンドを使う。

②将棋所のメニューバーで「対局」をクリックする。

③「エンジン管理...」をクリックする。

④「エンジン管理」で「追加...」ボタンをクリックする。

⑤「エンジン選択」で「~/デスクトップ/YaneuraOu-master/exe/2017Early」フォルダーに移動する。

⑥「YaneuraOu-by-gcc」ファイルをクリックする。

⑦「Open」ボタンをクリックする。

⑧「確認」で「OK」ボタンをクリックする。

登録はここまでで、以下は設定である。

⑨「エンジン管理」に戻って「エンジン設定...」ボタンをクリックする。

⑩「エンジン設定」で「Threads」を「16」に設定する。

推奨の設定ではCPUコア数の2倍とあり、私のPCは8コアなので、上のように設定した。

⑪「Hash」を「16」に設定する。

⑫「NetworkDelay」を「0」に設定する。

⑬「NetworkDelay2」を「0」に設定する。

⑭「MinimumThinkingTime」を「1000」に設定する。

⑮「BookMoves」を「200」に設定する。

⑯「BookDepthLimit」を「0」に設定する。

⑰「OK」ボタンをクリックする。

⑱「エンジン管理」に戻って「閉じる」ボタンをクリックする。

(参考)やねうら王(elmo)をShogiGUIに登録

①以下のコマンドを端末に入力して「Enter」キーを押す。

$ mono ~/デスクトップ/ShogiGUIv0.0.6.11/ShogiGUI.exe

ShogiGUIを起動するときはこのコマンドを使う。

②ShogiGUIのメニューバーで「ツール」をクリックする。

③「エンジン設定」をクリックする。

④「エンジン一覧」で「追加」ボタンをクリックする。

⑤「Open」で「~/デスクトップ/YaneuraOu-master/exe/2017Early」フォルダーに移動する。

⑥「Files of type:」で「すべてのファイル」を選択する。

⑦「YaneuraOu-by-gcc」ファイルをクリックする。

⑧「Open」ボタンをクリックする。

⑨「エンジン設定」の「BookDepthLimit」を「0」に設定する。

⑩「BookMoves」を「200」に設定する。

⑪「Hash」を「16」に設定する。

⑫「MinimumThinkingTime」を「1000」に設定する。

⑬「NetworkDelay」を「0」に設定する。

⑭「NetworkDelay2」を「0」に設定する。

⑮「Threads」を「16」に設定する。

推奨の設定ではCPUコア数の2倍とあり、私のPCは8コアなので、上のように設定した。

⑯「OK」ボタンをクリックする。

⑰「エンジン一覧」に戻って「OK」ボタンをクリックする。

参考ページ

コンピュータ将棋ソフト「elmo」導入方法

やねうら王2016MidのLinux/Mac対応について

ubuntuにelmoを入れて戦う

Pandas入門 (2017/05/30)

Pandasで私自身がよく使うものに限って簡単に説明する。

この記事は内容を随時追加する。

Pandasのインポート

import pandas as pd

DataFrame

a = pd.DataFrame([[1, 2], [3, 4], [5, 6]])
b = pd.DataFrame([[1, 2], [3, 4], [5, 6]], index=['row1', 'row2', 'row3'], columns=['col1', 'col2'])
print(a)
print(b)

   0  1
0  1  2
1  3  4
2  5  6
      col1  col2
row1     1     2
row2     3     4
row3     5     6

DataFrameの要素へのアクセス

a = pd.DataFrame([[1, 2], [3, 4], [5, 6]])
print(a)
print(a.iloc[1, 1])

   0  1
0  1  2
1  3  4
2  5  6
4

Python標準ライブラリ入門 (2017/05/30)

Pythonの標準ライブラリで私自身がよく使うものに限って簡単に説明する。

この記事は内容を随時追加する。

datetime

datetimeのインポート

from datetime import datetime
from datetime import timedelta

str型をdatetime型に変換

a = '2017.01.01 00:00'
print(a)
print(datetime.strptime(a, '%Y.%m.%d %H:%M'))

2017.01.01 00:00
2017-01-01 00:00:00

datetime型をstr型に変換

a = datetime.strptime('2017.01.01 00:00', '%Y.%m.%d %H:%M')
print(a)
print(a.strftime('%Y.%m.%d %H:%M'))

2017-01-01 00:00:00
2017.01.01 00:00

日付の加算・減算

a = datetime.strptime('2017.01.01 00:00', '%Y.%m.%d %H:%M')
b = timedelta(minutes=5)
print(a)
print(b)
print(a + b)
print(a - b)

2017-01-01 00:00:00
0:05:00
2017-01-01 00:05:00
2016-12-31 23:55:00

NumPy入門 (2017/05/30)

NumPyで私自身がよく使うものに限って簡単に説明する。

この記事は内容を随時追加する。

NumPyのインポート

import numpy as np

配列

a = np.array([1, 2, 3])
print(a)

[1 2 3]

連続した整数の生成

a = np.arange(-5, 5)
b = np.arange(-5, 5, 2)
print(a)
print(b)

[-5 -4 -3 -2 -1  0  1  2  3  4]
[-5 -3 -1  1  3]

非数値

a = np.nan
print(a)

nan

非数値の確認

a = np.array([np.nan, 1])
print(a)
print(np.isnan(a))

[ nan   1.]
[ True False]

切り上げ

a = 1.2
print(a)
print(np.ceil(a))

1.2
2.0

切り捨て

a = 1.8
print(a)
print(np.floor(a))

1.8
1.0

四捨五入

a = 1.234
b = 9.876
print(a)
print(b)
print(np.round(a))
print(np.round(b))
print(np.round(a, 2))
print(np.round(b, 2))

1.234
9.876
1.0
10.0
1.23
9.88

要素へのアクセス

a = np.arange(-5, 5)
print(a)
print(a[2])

[-5 -4 -3 -2 -1  0  1  2  3  4]
-3

要素の検索

a = np.arange(1, 10)
print(a)
print(a[a==5])
print(a[a>5])
print(a[(a>3) & (a<8)])
print(a[(a<3) | (a>8)])

[1 2 3 4 5 6 7 8 9]
[5]
[6 7 8 9]
[4 5 6 7]
[1 2 9]

配列の型変換

a = np.array([1, 2, 3])
print(a)
print(a.astype(float))

[1 2 3]
[ 1.  2.  3.]

Pythonで素数を生成 (2017/05/28)

しょうらいのゆめ: りーまんよそうをしょうめいする。

○以下のコマンドをIPythonコンソールに入力して実行する。

import numpy as np

def get_prime_number(n):
    natural_number = np.arange(n) + 1.0
    natural_number[0] = np.nan
    for i in range(1, int(np.floor(n/2))):
        natural_number[(natural_number!=natural_number[i])
        & (natural_number%natural_number[i]==0)] = np.nan
    prime_number = natural_number[~np.isnan(natural_number)]
    prime_number = prime_number.astype(int)
    return prime_number

prime_number = get_prime_number(1000)
print(prime_number)

[  2   3   5 ..., 983 991 997]