2018年06月17日

ソフトウェア"棋譜の管理"の活用 〜コンピュータ将棋棋譜への適用〜

※本記事の利用、またはリンク先により生じた損害に対する責任を負いません。自己の責任の上で使用して下さい。

棋譜の管理の画面.png
棋譜の管理 http://www.geocities.jp/saltedeggplant/
をコンピュータ将棋のレート計測で得られた膨大な棋譜に適用する方法についてご紹介します。
"棋譜の管理"は「対局日、棋戦名、対局者、手数、コメントの有無が一致すれば同じ棋譜と判定」という重複防止機能があるため
同じ日に多量の棋譜を生成するコンピュータ将棋の棋譜を管理するのには不向きな側面がありました。
そこで、棋譜の先頭行「開始日時」の日付をランダムに変更することでこの機能を回避する手法を発想しました。

【手順】
棋譜ファイル先頭行の「開始日時」を置換で任意の文字列へ変更する(元の計測日時、としている)
TExchangeを使用
→KIFの拡張子を追加登録する(必須)
→「バックアップを取らない」に設定する(推奨)
→棋譜を置いてあるフォルダを追加する
→「開始日時」を「元の計測日時」に置換する ※1つ目は確認ウインドが出てくるので「以降全てを置換する」を選択

バッチファイルを実行してランダムな日付を生成し、ファイルの先頭に「開始日時:YYYY/MM/DD」の行を追加する

棋譜の管理でフォルダごと読み取る

棋譜リスト上で右クリックして「統計処理」をクリックすると戦型の統計情報を見ることができます

【バッチファイルの中身】
-------------------------------------------------------------------------------------
@Echo Off
Set DIRPATH=.\
Set DIROPT=/B /S

For /F "usebackq tokens=*" %%i In ( `Dir %DIROPT% "%DIRPATH%*.KIF"` ) Do Call :Add1 "%%~i"

Echo 全てのファイルの変換が終了しました。
Echo.
Echo 何かキーを押すとウィンドウを終了します。
Echo.
Echo [END]
Pause>NUL
Exit /B 0

:Add1
Set CUTFILE=%~1
setlocal enabledelayedexpansion
set /a Y=1600+%RANDOM%*419/32768
setlocal enabledelayedexpansion
set /a M=1+%RANDOM%*9/32768
setlocal enabledelayedexpansion
set /a D=10+%RANDOM%*19/32768
echo 開始日時:%Y%/0%M%/%D%>tmp.txt
Echo [%CUTFILE%]ファイルの先頭1行にランダムに生成した「開始日時」行を追加し、
Echo [%CUTFILE%]に追記して上書き出力します。
For /F %%i In ("%CUTFILE%") Do copy /b tmp.txt+%CUTFILE% tmp.txt
Move /Y tmp.txt "%CUTFILE%"

Echo.

Exit /B

ここまで-------------------------------------------------------------------------------------
ど素人の私がOkwave https://okwave.jp/qa/q6496815.htmlを参考にして作りましたので内容についてのご指摘はご容赦下さい
※元の棋譜ファイルが強制的に上書きされるので必ずバックアップを取った上で実行してください
サブフォルダも検索する仕様になっているのでバッチファイルを実行する場所には十分注意して下さい
一応DLもできるようにしておきます
先頭行日付挿入.7z

棋譜の管理の機能によって得られた知見がよりよい将棋ソフトを作る開発者の皆様の手がかりとなれば幸いです


【ShogiGUIで連続対局をさせて棋譜を取る際に注意すべきこと】
・エンジン名に"()"(半角カッコ)を使うと対局者名に反映できない(記号以下が省略される)
・エンジン名に.(半角コロン)を入れると生成される棋譜ファイルにもコロンが入りバッチ処理が上手くできない
ファイル名を認識できずコマンドが不正扱いとなり棋譜ファイルがダミー日付だけになって壊れる
→その他にもアンダーバー以外の半角記号は上手く取り込めない原因となりうるので使わないようにすることを強く推奨


【実際実行した結果から得られた知見】
8000ほどのファイルで日付と手数がどちらも重複した例は0

【ランダムな日付のバリエーション】
1600〜2018/1〜9/10〜28
418*9*18=67716通り
さらに手数まで一致する可能性は極めて小さいと考えられる

【なぜ先頭行を削除せずに置換したのか?】
単純に実行スピードの問題です。バッチファイルによる先頭行削除は実行スピードが遅いという欠点がありました。
TExchangeによる置換の方がよほど高速です。
本記事で紹介した内容でなくても、元の先頭行を無効化できさえすればより高速な方法を選択するのは有力です。

【謝辞】
この場を借りて素晴らしいソフトウェア"棋譜の管理"を開発して下さったsaltedeggplantさんに謝意を表します

【免責事項】
※本記事の利用、またはリンク先により生じた損害に対する責任を負いません。自己の責任の上で使用して下さい。
※本稿記載のソフトウェアについての使用方法などの質問についてはお答えできません
※本稿への質問コメントにはお答えできかねます



1日1回のランキング投票です。もしよろしければクリックして頂けると嬉しいです↓
将棋 ブログランキングへ
posted by ロタ at 09:04| コンピュータ将棋、アプリについて | このブログの読者になる | 更新情報をチェックする