Skip to content

tascell/chess-solver

Repository files navigation

Chess Problem Solver

チェスの詰め問題(メイト問題)を解析するプログラムです。FEN形式で盤面を入力し、チェックメイトまでの手順を探索します。

ビルド

make              # 通常ビルド
make debug        # デバッグビルド
make cilk         # OpenCilk並列版ビルド
make clean        # クリーンアップ

OpenCilk版のビルド要件

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

OpenCilk並列版の実行

# 並列実行(デフォルト)
./chess-problem-solver-cilk -D 7

# 逐次実行モード(比較用)
./chess-problem-solver-cilk -D 7 -s

# ワーカー数を指定して実行
CILK_NWORKERS=8 ./chess-problem-solver-cilk -D 7

OpenCilk版のオプション

オプション 説明
-D N 探索深度を設定
-s 逐次実行モード(並列化なし)
-d デバッグモード

環境変数

変数 説明
CILK_NWORKERS 並列ワーカー数(デフォルト: 利用可能なコア数)

入力形式 (FEN)

FEN (Forsyth-Edwards Notation) 形式で盤面を入力します。

pkp5/p1p5/1R6/8/8/8/8/7K w - - 0 1

FEN形式の構成

  1. 盤面 - 8ランク(行)を / で区切って記述

    • 大文字 = 白駒、小文字 = 黒駒
    • K/k = キング, Q/q = クイーン, R/r = ルーク
    • B/b = ビショップ, N/n = ナイト, P/p = ポーン
    • 数字 = 空マスの数
  2. 手番 - w (白) または b (黒)

  3. キャスリング権 - 未使用(-

  4. アンパッサン - 未使用(-

  5. ハーフムーブ/フルムーブ - 未使用

出力例

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

generate-chess-md.sh

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);
    // 各手を独立して評価
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors