Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elixirで作る将棋ソフト

 Elixirで作る将棋ソフト

Kenta

May 19, 2024
Tweet

More Decks by Kenta

Other Decks in Programming

Transcript

  1. 将棋ソフトとは • ある局面における候補手の 評価値を解析するソフトウェア • 候補手:良さそうな手 • 評価値:手の良し悪しを表す値 • プロアマ問わず、研究や対局

    の振り返りで使われている • 2017年に当時の名人が将棋ソ フトに敗れ、その頃から広く使わ れるようになった • 今ではもう人間側が勝てません 2024/05/15 某イベント 2
  2. 大会に出たいけど… • ハードウェアが凄すぎる • 企業がクラスタを引っ提げて参加 • EPYC 7742 A100×8,9台 •

    非企業の開発者グループもそれに対抗 • Ryzen 3955WX + GeForce RTX 4090 * 9 • マシンがない人たちはクラウドで強いマシンを調達 • ソフトウェアが凄すぎる • 詳しくは以下を参照下さい • https://yaneuraou.yaneu.com/2024/05/07/wcsc34-summary/ • https://tadaoyamaoka.hatenablog.com/entry/2024/05/06/140552 • うーむ、勝負にならなそうだわい 2024/05/15 某イベント 4
  3. よくある将棋ソフトの設計 2024/05/15 某イベント 6 GUI エンジン 対局サーバ CSA protocol USI

    protocol 今回作るもの USI 探索部 評価関数 • エンジン:最善手を解析し、GUIに伝える • 探索部:局面のゲーム木を調べる • 評価関数:局面の評価値を算出 • 局面管理:局面の情報(盤面、持ち駒など)を管理 • USI:GUIとの通信 局面管理
  4. Elixirで実装してみたら面白そう • Elixir:高い並列性能をもつ関数型言語 • 例:1から1000000の値にfoo(), bar() の順番で関数を適用する [1] • 各値に対する処理は依存関係がない

    • よって全ての値に対する処理は並列に実行できる 2024/05/15 某イベント 7 1..1_000_000 |> Enum.map(&M.foo(&1)) |> Enum.map(&M.bar(&2)) [1] Susumu Yamazaki:“組込みに使うプログラミング言語について語ろう! Elixir (エリクサー) 編”, https://speakerdeck.com/zacky1972/zu-ip-minishi-upuroguraminguyan-yu- nituiteyu-rou-elixir-erikusa-bian?slide=25 • 既存のエンジンはC++やPythonで実装されている • 並列処理が得意なElixirでエンジンを実装したら、 よりハードウェアの性能を引き出せないだろうか? どのように並列化するかは よしなにしてくれるっぽい?
  5. 実装しました(一部だけ) • USIを実装し、必ず投了するエンジンを開発 • できること • 対局を開始できる • 投了できる •

    並列処理とはなんだったのか 2024/05/15 某イベント 8 エンジン USI 探索部 評価関数 局面管理 ☜対局が成立する!
  6. 初めてのElixir開発で困ったこと • Elixirの情報は他の言語と比べると少ない(気がする) • 初めは ChatGPT-3.5 にコードを書いてもらうつもりだったが、提示さ れたソースコードのコンパイルが通らないことが多々あった • 私のプロンプトスキルが低いだけかも

    • そんなことを考えていたらGPT-4が無料で使えるようになった。今度試して みます。 • 代わりにMicrosoft Copilotにお世話になりました • プロンプトに答えてくれるだけでなく、参考のURLも提示してくれたのがGood • 回答がとてもゆっくりなところがある 2024/05/15 某イベント 9