やねうら王nanoの実行ファイルを公開しました

やねうら王nano V1.39がfloodgateでR2000を突破した。めでたい。そんなわけで、やねうら王nanoの開発はこれにて終了。やねうら王nanoの実行ファイル一式を公開する。

やねうら王nanoの思考エンジンのダウンロード

やねうら王のGitHubのexeフォルダから。
https://github.com/yaneurao/YaneuraOu/tree/master/exe

ファイルの配置方法などは
YaneuraOu-nano-readme.txt
を御覧ください。

やねうら王nanoとは?

やねうら王nanoとは、探索部が150行程度(コメント行除く)の極めてシンプルで読みやすいソースコードから成る、将棋の思考エンジンである。

やねうら王nanoの探索部のソースコード
https://github.com/yaneurao/YaneuraOu/blob/26593bc8d974fe5bed8e3b1cdf115378126c99d7/source/engine/nano-engine/nano_search.cpp

やねうら王nanoの開発方針

・並列探索をしない(1スレッド動作)
・αβ探索以外の枝刈り手法を極力使わない。
・CAPTURESを優先する以外の指し手オーダリングをしない。
・1手詰め判定を用いない。
・静止探索において置換表に書き出さない。
・静止探索ではRECAPTURESの指し手のみを生成。

このあと改造していくためのベースとなる教育的なコードを目指す。

やねうら王nanoの探索部の解説記事

気が向いたら書く。

次は?

次はやねうら王nano plusを開発に取り組む。こちらは探索部250行程度でR2500超えを目指す。

やねうら王nanoでは、極力フレームワーク側への依存を減らし、トータルで(用いていない部分をシュリンクすれば)1500行程度のソースコードから成る思考エンジンであったが、nano plusはいったんこの制約を取り払い、フレームワーク側の機能で使えるものは何でも使うという方針で開発する。その結果、やねうら王nanoの探索部とさほど変わらないソースコード量において、そこそこ強い思考エンジンが完成する。(はずである)


やねうら王nanoの実行ファイルを公開しました” への20件のコメント

  1. あらあらあら。
    屋根さんの基礎力でどんだけいろいろ踏破してるんですか。
    さすがです。
    普通にコンシューマ機で出しても売れるレベルじゃないですか?
    素人相手ならボコれるレベルのはずですよね。
    ナノプラスも期待してます。
    ラブプラス見たくきこえるので萌えキャラ出しましょう。そうしましょう。(え?

  2. >やねうら王nano V1.39がfloodgateでR2000を突破した。
    おめでとうございます。

    まあそういう訳で、少しばかり気になるのですが、、、、
    タヌキの森さんところとは、その後いかがなものでしょうか?

  3. すいません。
    (1)が途中で切れてしまったようですので、
    (1)の方だけ再送させて頂きます。

    (1)
    << ^香 □^玉 □ □ □ □^桂^香
    << □ □ □ □ と □ □ □ □
    << □^銀^桂^金 □ □ □^歩 □
    << □ □^歩^歩^歩 □^歩 □^歩
    << ^歩^歩 □ □ □ □ □ 歩 □
    << □ □ 歩 □ 銀 □^銀 □ 歩
    << 歩 歩 □ □ □ □ □ □ □
    << 香 金 金 □ □ □^龍 □ □
    << 玉 桂 □ □ 飛 □ □ □ 香
    << 先手 手駒 : 歩 金 , 後手 手駒 : 歩3 桂 銀 角2
    << 手番 = 先手
    < // 指し手を一手ずつ返すフェーズ
    > case BAD_CAPTURES:
    > case GOOD_QUIETS:
    > case BAD_QUIETS:
    > case ALL_EVASIONS:
    > case GOOD_RECAPTURES:
    > move = *currentMoves++;
    > // 置換表の指し手、killerと同じものは返してはならない。
    > if (move != ttMove
    > && move != killers[0]
    > && move != killers[1])
    > return move;
    > break;

    • 度々申し訳ございません。
      やはり(1)が途中が切れてしまいました…
      今度は切れた箇所だけ貼り付けます。

      << sfen l1k4nl/4+P4/1sng3p1/2ppp1p1p/pp5P1/2P1S1s1P/PP7/LGG3+r2/KN2R3L b PG3pns2b 77

      上記局面でnano plusが
       +Mate:1
       ▲8二金打
      と指したのですが、次に△8二同玉(71)と取られて形成を損ねました。
      また、評価値「+Mate:1」も正しくないように思います。
      このケースは、対局後に将棋所で「検討」を実行した際にも再現しました。

      おそらくですが、nano_plus_search.cppのnextMove()の以下の箇所が関係しているようで
      △8二同玉(71)がkillerに含まれるため後手の指し手生成対象から除外された結果、
      「+Mate:1」と判定されてしまったように思われます。

      試しにALL_EVASIONSの場合はkillerと一致しても指し手生成対象から除外しないように修正してみたところ
      上記現象は発生しなくなりました。
      (もしかすると別の不具合が発生してしまうのかもしれませんが…)

  4. 連載楽しく読ませて頂いております。
    nanoとnano plusを将棋所で対戦させてみましたところ
    nano plus Ver1.56がおかしな手を指すように見えることがありましたので、報告させて頂きます。

    (1)
    ^香 □^玉 □ □ □ □^桂^香
    □ □ □ □ と □ □ □ □
    □^銀^桂^金 □ □ □^歩 □
    □ □^歩^歩^歩 □^歩 □^歩
    ^歩^歩 □ □ □ □ □ 歩 □
    □ □ 歩 □ 銀 □^銀 □ 歩
    歩 歩 □ □ □ □ □ □ □
    香 金 金 □ □ □^龍 □ □
    玉 桂 □ □ 飛 □ □ □ 香
    先手 手駒 : 歩 金 , 後手 手駒 : 歩3 桂 銀 角2
    手番 = 先手
    sfen l1k4nl/4+P4/1sng3p1/2ppp1p1p/pp5P1/2P1S1s1P/PP7/LGG3+r2/KN2R3L b PG3pns2b 77

    上記局面でnano plusが
     +Mate:1
     ▲8二金打
    と指したのですが、次に△8二同玉(71)と取られて形成を損ねました。
    また、評価値「+Mate:1」も正しくないように思います。
    このケースは、対局後に将棋所で「検討」を実行した際にも再現しました。

    おそらくですが、nano_plus_search.cppのnextMove()の以下の箇所が関係しているようで
    △8二同玉(71)がkillerに含まれるため後手の指し手生成対象から除外された結果、
    「+Mate:1」と判定されてしまったように思われます。

    試しにALL_EVASIONSの場合はkillerと一致しても指し手生成対象から除外しないように修正してみたところ
    上記現象は発生しなくなりました。
    (もしかすると別の不具合が発生してしまうのかもしれませんが…)

    // 指し手を一手ずつ返すフェーズ
    case BAD_CAPTURES:
    case GOOD_QUIETS:
    case BAD_QUIETS:
    case ALL_EVASIONS:
    case GOOD_RECAPTURES:
    move = *currentMoves++;
    // 置換表の指し手、killerと同じものは返してはならない。
    if (move != ttMove
    && move != killers[0]
    && move != killers[1])
    return move;
    break;

    (2)
    ^香 □ □ □ □ □^玉^桂^香
    □^飛 □ □ □ □ □ □ □
    □ □^桂 □ □^銀^角^金 □
    □ □^歩 □^金^歩 □ □ □
    ^歩 □ □^歩 □ □^歩 □^歩
    □ □ 歩 □ □ 歩 □ □ □
    歩 歩 銀 金 □ □ 桂 □ □
    □ □ 金 角 □ 銀 □ □ □
    香 桂 玉 □ □ □ □ □ 香
    先手 手駒 : 歩2 銀 , 後手 手駒 : 歩6 飛
    手番 = 先手
    sfen l5knl/1r7/2n2sbg1/2p1gp3/p2p2p1p/2P2P3/PPSG2N2/2GB1S3/LNK5L b 2PS6pr 73

    上記局面でnano plusが
     +Mate:1
     ▲5七歩打△9七成(96)
    と指したのですが、次に△4九飛打と打たれて形成を損ねました。
    評価値「+Mate:1」も正しくないように思いますし(王手ですらない)、
    次の「△9七成(96)」も不明です。
    このケースは、対局後に将棋所で「検討」を実行した際には再現しませんでした。

    将棋所で何局か対戦させていると、似たようなケースが時々発生するのですが、いかがでしょうか?

    • nano-plusの指し手生成、書きかけだったのでまあ、そうですね。今朝その部分は修正して、GitHubのほうにコミットはまだしてなかったのでいまコミットしておきました。静止探索、色々調整したので前回のコミットからそこそこ強くなっている気がします。

  5. 教育的なコードありがとうございます。勉強させてもらってます。今さらなのですが、nanoのsearch関数のコードを見ていたら
    bool fullDepthSearch = (PV && moveCount == 1);
    とありましたが、PVではなくPvNodeではないでしょうか。PVのenumの値は1なので、必要以上にfullDepthSearchしてしまってるような。
    プログラミングの初心者なので間違っていたらごめんなさい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です