Skip to content

Repository files navigation

Structa

Version 1.0.3 (2026-08-23)

Structa は、将棋プルーフゲーム(PG)の検討を支援する CUI ツールです。
指定した目標局面・手数のもと、いくつかの枝刈り条件を用いて、到達可能な手順を総当たり探索します。

本ツールは発展途上であり、特に処理速度に課題があります。
手数が長めの問題の検討は非常に長時間となる恐れがあります。
検討時間の目安は 処理時間の参考情報 をご覧ください。

以下の機能は解を取りこぼす可能性があるため慎重に利用する必要がありますが、うまく活用すれば大幅に実行時間を短縮できる場合があります。

開始局面設定

実戦初形以外の局面を開始局面に指定できます。
例えば 21 手の PG において、最初の 6 手が確定していると判断できる場合、実戦初形から 6 手進めた局面を開始局面に指定し、残り 15 手の PG として検討することで、検討結果の信頼性をある程度保ちつつ、実行時間を短縮できます。

不動駒設定

不動駒(動くことも取られることもない駒)を指定できます。
探索時に不動駒を動かす/取る手を除外するため、実行時間を短縮できます。

動作環境

Windows 10
(Windows 11 でも動作すると思われますが未確認です)

探索型アルゴリズムのため、実行時間やメモリ使用量は問題設定に大きく依存します。

探索方法

基本的に Structa は、開始局面から合法手を順に指し、指定手数で目標局面に到達する手順を総当たりで探します。ただし、各中間局面で「目標局面の実現に最低でもあと何手必要か」を先手・後手別に見積もり、残りの着手機会を超える場合は、その局面から先を調べません(枝刈り)。

必要手数の見積もりでは、主に次の点を調べます。

  • 目標局面と現在局面の持駒枚数の差を、残り手数で埋められるか
  • 目標局面の各マスについて、盤上の対応する駒を移動・成で配置する場合と、持駒を打って配置する場合のどちらが早いか
  • 駒を打つ前に、その駒を取って持駒にする手が必要か
  • 現在も相手も所有しておらず、今後持駒にできない駒種ではないか
  • 不動駒、すでに目標位置にある駒、二歩などが、駒の移動・捕獲・打ちに与える制約

例えば目標局面の14の地点に先手の成香が必要なら、現在の14成香は0手として扱います。未配置の場合は、盤上の香・成香を14へ運ぶ手数と、香を入手して打ち、成って14へ運ぶ手数を比較します。このような見積もりを目標局面の全駒について組み合わせ、持駒の収支も考慮した必要手数の下限を求めます。

同一局面を再び調べる無駄を減らすため、解に到達しなかった局面と必要手数の計算結果は置換表に記録して再利用します。

また、11手以上の問題では、目標局面から合法な手を1~2手逆算した局面集合(終端フロンティア)を、規模に応じて自動的に構築します。開始局面側からの探索が終端フロンティアに達した時点で、記録した手順を実際に指して目標局面へ到達することを確認します。これにより最終1~2手分の探索を省略しますが、逆算した全候補を照合するため、解を取りこぼすことはありません。逆算局面が多すぎる場合は、逆算手数を減らすか、終端フロンティアを使わずに探索します。

ファイル構成

ダウンロードページで入手した ZIP ファイルを解凍し、同一フォルダ内に以下のファイルを配置してください。

  • Structa.exe
  • config.txt
  • problem.txt (ファイル名は config.txt にて設定可能)

処理実行後、同フォルダ内に結果ファイルが生成されます。

設定ファイル

文字コードはいずれも Shift_JIS です。
「=」の前後に半角スペースがあってもなくても構いません。

config.txt

# 問題入力ファイル
INPUT_FILE  = problem.txt

# 検討結果出力ファイル
OUTPUT_FILE = result.txt

# 出力モード(0:SIMPLE、1:MEDIUM、2:DETAIL)
OUTPUT_LEVEL = 1

# 開始局面出力(0:出力しない、1:実戦初形ではないときは出力、2:常に出力)
ST_POS_OUTPUT_MODE = 1

# 置換表メモリ上限(MB)
TT_MEMORY_MB = 256

# 並列プロセス数(0:物理コア数を自動使用、1:直列実行、2以上:指定数で並列実行)
PROCESSES = 0

INPUT_FILE、OUTPUT_FILE ともにファイル名のみ指定できます。パスの指定はできません。
OUTPUT_LEVEL で検討結果ファイルに出力する内容の粒度を変更できます。

  • SIMPLE (0):最低限の結果のみ
  • MEDIUM (1):上記に進捗・概要を含む
  • DETAIL (2):上記に枝刈りの統計情報を含む

ST_POS_OUTPUT_MODE で開始局面を出力するかどうかの設定ができます。

探索の過程で「この局面からは指定局面に到達できない」と確定した場合、その局面と残り手数を記録します。
後に同一局面が現れた際、残り手数が同じかそれ以下であれば、その先の探索を行わずに打ち切ります。
この記録用の領域(置換表)に使用するメモリの上限を、TT_MEMORY_MB で指定します。

PROCESSES で並列実行に使うプロセス数を指定します。
探索は初手ごとに独立しているため、初手を各プロセスに割り振って並列に検討します。
0 を指定すると物理コア数を自動で使います。1 を指定すると直列実行、2 以上を指定すると指定したプロセス数で並列実行します。
通常は0(自動)を推奨します。物理コア数を超える値を指定しても、処理が速くなるとは限らず、メモリ使用量やプロセス切替の負担が増える場合があります。
TT_MEMORY_MB は全体の上限として扱われ、各プロセスに等分されます(1 プロセスあたり最低 16MB)。

なお、並列実行時に Ctrl+C で中断した場合、再開用ファイルに記録されるのは「先頭から連続して検討が完了した初手の数」です。
完了順が前後するため、後ろの初手が終わっていても記録には含めません(再開時にやり直しになります)。

problem.txt

# 開始局面(無設定なら実戦初形)
START_SFEN  = 

# 指定局面
TARGET_SFEN = lnsgkgs+B1/1r7/ppppppnpp/6p2/9/2P6/PP1PPPPPP/7R1/LNSGKGSNL w LB 1

# 指定手数
MAX_DEPTH = 7

# 解数上限(1~10)
LIMIT = 3

# 何手までの手待ちを読むか(0~5)
MARGIN = 1

# 不動駒(開始局面にある動かない・取られない駒を半角数字2桁の位置で指定)
# 例 FIXED_PIECES = 13,19
FIXED_PIECES = 

開始局面と指定局面は SFEN で指定します。
SFEN は、V9.41以降の柿木将棋であれば ツールバーの編集>局面のコピー>SFEN形式局面 で取得できます。
Webフェアリー将棋盤でも SFEN をコピーできます。

START_SFEN に何も設定しなければ、実戦初形を開始局面として検討します。

LIMIT 個の解を見つけると処理を終了します。LIMIT の値は 1~10 を設定できます。

MARGIN 手までの手待ちを読みます。MARGIN の値は 0~5 を設定できます。
0を設定した場合は手待ちする手順を一切読まなくなります。問題設定に応じて値を設定してください。
例えば先手が角を捨て、後手の角を取ってそれを88に打ち直すような手順も手待ちになり得ます。想定解が検出されない場合、MARGIN の値を大きくすることをお試しください。

不動駒は、開始局面での位置を半角数字2桁で設定します。複数設定する場合は半角カンマで区切ります。
下記は、後手13歩と先手19香を不動駒に設定する場合の記述です(開始局面は実戦初形)。

FIXED_PIECES = 13,19

使い方

  1. config.txtproblem.txt を編集する
  2. Structa.exe を実行する(ダブルクリック等)
  3. 探索状況が黒いコンソールに表示されるので、終了を待つ
  4. 探索が終了すると結果が result.txt に出力される(追記)

実行中に Ctrl+C を押すと探索を中断します。

再開用ファイルを出力しますか?(Y/N)

と表示されるので、y と入力して Enter キーを押下すると、再開用ファイル(json)を出力して検討を終了します。
y 以外を入力して Enter キーを押下すれば、再開用ファイルを出力せずに検討を終了します。

問題入力ファイルのファイル名が problem.txt の場合、再開用ファイルのファイル名は problem_resume.json です。

再開

problem.txt の検討を実行する際、フォルダ内に problem_resume.json があれば、探索を始める前に

再開用ファイル「problem_resume.json」があります。検討を再開しますか?(Y/N)

と表示されます。y と入力して Enter キーを押下すると、中断した続きから検討を行います。
y 以外を入力して Enter キーを押下した場合は、再開用ファイルを無視して最初から検討を行います。

中断・再開では、不詰局面を記憶した置換表や総ノードなどの統計情報は引き継ぎません。置換表は再開時に作り直します。
また、初手Aの検討が終わって初手Bの検討の途中で中断した場合、再開時は初手Bを最初から検討します。
したがって、中断・再開を行うと総検討時間が長くなります
例えば、2時間で検討が終わる問題を1時間だけ検討して中断し、後で残りを検討した場合、「1時間 + 1時間」とはならずに、「1時間 + 1時間30分」のようになります。
検討時間が超長時間になる場合のみ、中断・再開をご利用いただくことをおすすめします。

進捗表示

探索中、以下のように進捗を表示します。

[2026-02-08 16:34:33] 25% 探索済(検出解数:0)

この表示は、合法な初手のうち 25% について、その初手から始まるすべての手順の探索が完了していることを意味します。
ただし、各初手ごとに探索に要する時間は異なるため、全体の探索時間の 25% が経過したことを示すものではありません。

処理時間の参考情報

本ソフトウェアを私のPCで実行した際の処理時間です。
CPU / メモリ / OS などの実行環境により結果は大きく変わります。あくまで参考値としてご参照ください。

また、現在の Structa の特性上、目標局面の盤上に手数計算の手掛かりが残っている場合は比較的短時間で検討できます。痕跡が消えている箇所が多い場合や、作意で1つの駒が何度も動く場合、検討時間が長時間になりやすいです。

実行環境

  • Structa:Version 1.0.3
  • OS:Windows 10 22H2 64bit
  • CPU:Intel Core i5-8250U(4コア / 8スレッド、最大 1.80 GHz)
  • メモリ:8GB
  • 並列実行:4プロセス
  • 置換表設定:TT_MEMORY_MB = 512

処理時間

番号 作品情報 手数 不動駒設定 検討時間
1 高坂研/Problem Paradise/2017年4月/ツイン a) 9 なし 4秒
2 高坂研/Problem Paradise/2017年4月/ツイン b) 9 なし 4秒
3 Proof Tachioka/Problem Paradise/2020年7月 10 なし 3秒
4 竹野龍騎/Web Fairy Paradise/2008年8月 10 なし 1秒
5-1 松さか子/詰将棋パラダイス/1999年9月 11 なし 57秒
5-2 松さか子/詰将棋パラダイス/1999年9月 11 18枚 3秒
6 神本多聞/詰将棋パラダイス/2020年8月 11 なし 6秒
7 高坂研/Problem Paradise/2017年4月 12 なし 1秒
8 宮内章良/詰将棋パラダイス/2012年3月 12 18枚 2分34秒
9 藤原俊雅/詰将棋パラダイス/2020年2月 14 なし 11分28秒
10 藤原勝博/詰将棋パラダイス/2025年8月 15 なし 51秒
11 橋本哲/Problem Paradise/2025年4月 21 なし 4時間12分40秒

不動駒設定

5-2. 11香、13歩、17歩、19香、21桂、23歩、27歩、29桂、31銀、39銀、41金、49金、51玉、59玉、61金、69金、71銀、79銀
8. 11香、13歩、17歩、19香、21桂、23歩、27歩、28飛、29桂、73歩、81桂、82飛、83歩、87歩、89桂、91香、93歩、97歩

SFEN一覧

  1. lnsgkgsnl/1r5b1/ppppp2pp/6p2/5p3/2PP5/PP2PPPPP/1B5R1/LNSGKGSNL w - 1
  2. lnsgkgsnl/1r5b1/ppppp2pp/6p2/3P1p3/2P6/PP2PPPPP/1B5R1/LNSGKGSNL w - 1
  3. lnsgkgsnl/1r7/pppp+Bp1pp/6p2/9/9/PP1P+bPPPP/7R1/LN1GKGSNL b P2ps 1
  4. ln1gkgsnl/7b1/pppp2ppp/4p2r1/7S1/2P4B1/PP1PPPPPP/7R1/LNSGKGSNL b P 1
  5. lnsgkgsnl/1r5b1/Ppppppppp/9/9/9/pPPPPPPPP/1B5R1/LNSGKGSNL w - 1
  6. lnggk+Bsnl/1r1sB4/pppppp1pp/6p2/9/2P6/PP1PPPPPP/7R1/LNSGKGSNL w - 1
  7. lnsg1gsnl/1r5k1/pppppp+bpp/6p2/9/2P6/PP1PPPPPP/1S5R1/LNGKBGSNL b - 1
  8. lnsgkg1nl/1r3s3/ppppppbpp/9/9/9/PP1PPPPPP/3SG2R1/1N2KGSNL b Pplb 1
  9. lns2gs+Bl/1kg5r/p1pppp1pp/6p2/9/2P6/PP1PPPPPP/7R1/LNSGKGSNL b PBn 1
  10. lnsg1gsnl/5k1b1/pppppp1pp/7+r1/8B/2P5K/PP1PPP1PP/7R1/LNSG1GSNL w 2p 1
  11. lnsg1gsnl/4r2b1/ppp1ppppp/3p5/9/LP7/1kPPPPPPP/R1b6/1NSGKGSNL w p 1

高度な使い方

Structa はコマンドライン引数を指定して実行することができます。

オプション 意味
-i FILE, --input FILE 入力ファイル名を指定(省略時は config.txt の INPUT_FILE を使用)
-o FILE, --output FILE 出力ファイル名を指定(省略時は config.txt の OUTPUT_FILE を使用)
--nowait 終了時に Enter キー入力を待たない

Structa.exe -i problem1.txt

入力ファイル:problem1.txt
出力ファイル:config.txt の OUTPUT_FILE
終了時の動作:Enter キーの入力を待つ

Structa.exe -i problem1.txt -o result1.txt -nowait

入力ファイル:problem1.txt
出力ファイル:result1.txt
終了時の動作:Enter キーの入力を待たずに終了する

今後の開発予定

  • 中断・再開機能(置換表、統計情報の引継)
  • 手数計算の精密化(どの駒がどの配置を実現するかの考慮)
  • 目標局面からの逆算手順が限られている場合の双方向探索

ライセンス・著作権

© 2026 Masataka Izumi
本ソフトウェアは、将棋プルーフゲームの検討を支援する目的で個人により制作されたツールです。

ライセンス: GNU General Public License v3.0 (GPLv3)

Structa は、GNU General Public License v3.0 (GPLv3) のもとで公開されています。
実行ファイル(Structa.exe)を含め、本ソフトウェアの再配布・改変・改変版の再配布は、
GPLv3 の条件に従う必要があります。

詳細は同梱の LICENSE ファイル、または GNU GPL v3 の原文をご確認ください。

免責事項

本ソフトウェアは「現状のまま(AS IS)」提供されており、
動作の正確性、完全性、有用性について、作者はいかなる保証も行いません。

本ソフトウェアの利用によって生じたいかなる損害についても、
作者は責任を負いません。利用は自己責任でお願いします。

使用ライブラリ

Structa は、以下のオープンソースライブラリを使用しています。

  • cshogi(GPLv3)
  • NumPy(BSD License)
  • psutil(BSD License)

cshogi が GPLv3 で提供されているため、本ソフトウェア全体も GPLv3 として公開されています。

実行ファイル

本ソフトウェアの実行ファイル(Structa.exe)は、PyInstaller を用いて生成されています。

アイコン

本ソフトウェアで使用しているアイコンは、以下を利用しています。

tesseract icon by Icons8

謝辞

高坂研さんより、将棋プルーフゲーム全作リストをご提供いただきました。Structa のテストに主に利用させていただきました。心より感謝申し上げます。

藤原俊雅さんには、本ツールを先行してご利用いただき使用感についてフィードバックいただきました。また、Structa の性能向上に役立つ手数計算のアイデアを多数ご教示いただきました。心より感謝申し上げます。

About

Shogi Proof Game Proofer

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages