チェスの詰め問題(メイト問題)を解析するプログラムです。FEN形式で盤面を入力し、チェックメイトまでの手順を探索します。
make # 通常ビルド
make debug # デバッグビルド
make cilk # OpenCilk並列版ビルド
make clean # クリーンアップOpenCilk並列版をビルドするには、OpenCilk対応のclangが必要です。
# ライブラリパスの設定(必要に応じて)
export LD_LIBRARY_PATH=/opt/system/app/gcc/12.2.0_nvptx/lib64:$LD_LIBRARY_PATH
# ビルド
make cilk./chess-problem-solverプログラムを起動すると、FEN形式で盤面の入力を求められます。
| オプション | 説明 |
|---|---|
-d, --debug |
デバッグ情報を表示 |
-D N, --depth N |
探索深度を設定 (1-10, デフォルト: 3) |
-h, --help |
ヘルプを表示 |
# 1手詰めを探索
./chess-problem-solver --depth 1
# 3手詰めを探索(デフォルト)
./chess-problem-solver
# デバッグモードで5手詰めまで探索
./chess-problem-solver -d --depth 5# 並列実行(デフォルト)
./chess-problem-solver-cilk -D 7
# 逐次実行モード(比較用)
./chess-problem-solver-cilk -D 7 -s
# ワーカー数を指定して実行
CILK_NWORKERS=8 ./chess-problem-solver-cilk -D 7| オプション | 説明 |
|---|---|
-D N |
探索深度を設定 |
-s |
逐次実行モード(並列化なし) |
-d |
デバッグモード |
| 変数 | 説明 |
|---|---|
CILK_NWORKERS |
並列ワーカー数(デフォルト: 利用可能なコア数) |
FEN (Forsyth-Edwards Notation) 形式で盤面を入力します。
pkp5/p1p5/1R6/8/8/8/8/7K w - - 0 1
-
盤面 - 8ランク(行)を
/で区切って記述- 大文字 = 白駒、小文字 = 黒駒
K/k= キング,Q/q= クイーン,R/r= ルークB/b= ビショップ,N/n= ナイト,P/p= ポーン- 数字 = 空マスの数
-
手番 -
w(白) またはb(黒) -
キャスリング権 - 未使用(
-) -
アンパッサン - 未使用(
-) -
ハーフムーブ/フルムーブ - 未使用
FEN記法で盤面を入力してください: 0 1 2 3 4 5 6 7
---------------
0|p k p . . . . .
1|p . p . . . . .
2|. R . . . . . .
3|. . . . . . . .
4|. . . . . . . .
5|. . . . . . . .
6|. . . . . . . .
7|. . . . . . . K
---------------
白のターンです。
========================================
詰め手順 (1手詰め)
========================================
1. 白: b6 -> b5 [(2,1)->(3,1)] #
========================================
sample-problems.fen にサンプル問題が含まれています:
# ファイルから1行ずつ実行
cat sample-problems.fen | grep -v "^#" | grep -v "^$" | while read fen; do
echo "$fen" | ./chess-problem-solver --depth 3
done| 問題 | FEN |
|---|---|
| 1手詰め (ナイト) | 1n1k4/1Q2p3/4p1B1/6N1/8/8/8/3K4 w - - 0 1 |
| 1手詰め (バックランク) | r1b1kb1r/5ppp/8/6B1/B7/8/5PPP/3R3K w - - 0 1 |
| 3手詰め | nk6/1p1q4/p7/P3R3/8/6B1/8/1K6 w - - 0 1 |
FEN記法のテキストファイルから、詰め問題のMarkdownドキュメントを一括生成するスクリプトです。
./generate-chess-md.sh input.fen [output.md] [depth]| 引数 | 説明 |
|---|---|
input.fen |
FEN記法を1行ずつ記載したテキストファイル(必須) |
output.md |
出力するMarkdownファイル(省略時: input.md) |
depth |
探索深度(省略時: 5) |
# 基本的な使用法
./generate-chess-md.sh sample-problems.fen
# 出力ファイルと深度を指定
./generate-chess-md.sh sample-problems.fen output.md 3# コメント行(#で始まる)
1n1k4/1Q2p3/4p1B1/6N1/8/8/8/3K4 w - - 0 1
# 空行は無視される
r1b1kb1r/5ppp/8/6B1/B7/8/5PPP/3R3K w - - 0 1
生成されるMarkdownには以下が含まれます:
- 各問題のFEN記法
- 盤面の図
- 詰め手順(見つかった場合)
chess-problem-solver.c- メインソースコードchess-problem-solver-cilk.c- OpenCilk並列版ソースコードMakefile- ビルド設定sample-problems.fen- サンプル問題generate-chess-md.sh- 問題をMarkdown形式で出力するスクリプトdo-test.sh- 計算ノードでの性能テストスクリプト
計算ノードで並列性能をテストするには do-test.sh を使用します。
# tssrunを使って計算ノードで実行
./do-test.shテスト結果は log-chess-test.txt に保存されます。
OpenCilk版では、探索の最上位レベルで cilk_for を使用して手の評価を並列化しています。各スレッドは独立したボード状態のコピーを持ち、競合なく探索を行います。
cilk_for (int i = 0; i < numMoves; i++) {
BoardState localState;
copyBoardToState(&localState);
// 各手を独立して評価
}