昨年のおさらい

色々と予想されていて楽しい時期ですね。

こちらは寝つきが悪く,胃が痛いです。

 

www.fgfan7.com

 

 

今年の展望の前に昨年の自戦おさらいをしておきます。

戦型選択で角換わりがどうとかそういう話の前振りですね。

 

番外編,前日リハ:

PAL先手,横歩取りの激しい変化:結果持将棋(笑)

 

一次予選:

1.こまあそび後手,後手中飛車,対向形

 

2.ねね将棋先手,横歩取り58玉

 

3.山田将棋後手,四間飛車の対向形

 

4.PAL先手,横歩取りで飛車を引く形

 

5.ArgoCorse_IcSyo後手,相掛かり

 

6.dlshogi先手,後手に横歩取らせる展開

 

7.S.S.E.後手,相掛かり

 

8.名人コブラ先手,初手78飛戦法

 

二次予選:

1.大将軍先手,角換わり

 

2.Novice後手,横歩取り58玉

 

3.妖怪惑星Qhapaq先手,後手角交換拒否から雁木

 

4.Apery後手,横歩取り58玉

 

5.ArgoCorse_IcSyo先手,後手に歩交換させての角交換

 

6.nozomi後手,後手角交換拒否から相雁木

 

7. the end of genesis T.N.K.evolution turbo type D後手,角換わり

 

8.名人コブラ先手,後手角交換拒否から33角22銀型

 

9.PAL後手,矢倉

 

決勝:

1.妖怪惑星Qhapaq後手,角換わり

 

2.HoneyWaffle先手,初手78飛対向形(後手穴熊

 

3.大合神クジラちゃん2後手,角換わり

 

4.名人コブラ先手,後手角交換拒否から33角22銀型

 

5.Apery後手,相掛かり

 

6.PAL先手,先手雁木から77金,後手矢倉

 

7.the end of genesis T.N.K.evolution turbo type D先手,角換わり

 

まぁ,相掛かったり,横歩取ったり取らせたり,角を換えたり換えなかったり,矢倉も雁木も居飛車穴熊もやってました。

対局数の割に多種多様でしたね。

ただ,飛車を自分から振る展開はなかったんですよね。その分,将棋倶楽部24で振りまくってます。

 

今年の展望はどんなもんですかね。最終日まで宿を予約しているので決勝日までは残りたいですね。(できれば経費埋めたいので賞金欲しいです)

戦型ですか?正直まだ迷ってる部分が多いので未定です。

去年も朝修正してたくらいですんで,今年も当日にならないとはっきり言えません。

 

今年も盤外戦術で黍団子は使うつもりです。(買い忘れなければ)

初日はシードされているので今年こそ川崎家を攻略する好機と捉えてます。 

選手権直前なのに指し手生成に戻る

 

ch.nicovideo.jp

きふわらべの中の人がコンピュータ将棋入門者向けにいい記事を書いている。かくいう私も彼の記事は以前からよく読んでいて結構ためになる。

 

合法手生成をライブラリ依存して作ると楽だけど,本職のプログラマは自分で書きたいのだろう。私も自作のものがある。

bleu48.hatenablog.com

 

基本ルーチンとして

1.各駒の動かし方

2.味方の駒があるところには行けない

3.長い効きがある駒でも駒を飛び越えることはできない(桂馬を除く)

これが基本.

それに加えて

4.行き場のない駒を作ってはならない

これは歩,香車,桂馬の3枚にのみ適用される.動けないところに打つ行為と敵陣で動けない状態になる不成は禁止されている.

 

次は王手である.

もっとも簡単な表現をすると

5.王手を放置する行為をしてはいけない

6.自玉が王手となる着手をしてはいけない(自殺手)

これらはまとめると「着手後に自玉に王手がかかってる状態を作ってはならない」となる.

私も最初はこの定義で作成していた.実際に動かした後の局面を生成した方がコードは短くなる.(但し遅い)

 

7.打ち歩詰め

歩を打って敵玉を詰めることは反則である.大概実装が面倒なので実際に打った時に負け(評価値マイナス∞)の判定にしてる.正確には歩を打った直後の合法手が無いと表現する.

 

8.千日手

千日手は同一局面が4度繰り返す行為であるが,そのとき連続王手であれば王手側が負けになる.連続王手でなければ引き分け.(プロ棋戦では指し直し)

これは実装が面倒なのでうちでは実は未実装である.同一局面判定をすればいいのだがエレガントな実装はZobrist Hashを使うらしいってのでそのうち実装するかもしれない.着手後の局面図が必要なのでこれも動かした後の局面が必要になる.

 

まぁ,だいたい以上が差し手生成なんだけど,打ち歩詰めと千日手は指し手生成で非合法手も入ったままにして動かした後で判定するのが主流である.もちろん,そうでもないソフトもあるかも.

 

で,高速化の際にはどうしているかというと.

1.駒の動かし方と2.味方の駒の配置をBitboardという配列をあらかじめ生成して論理演算で生成するのが速いようだ.3.長い効きについても同様に上手に扱う手法がある.

王手については別に専用ルーチンを持つ方が強いソフトができる.特に王手回避手は別に作成することを強く勧める.これらは探索を非常に優位に進めることができる.

 

王手回避手については以下の4択である

1.王が逃げる

2.王手をかけている駒を取る(王で取る場合も)

3.合い駒を打つ

4.盤面上の駒で合い駒をする(移動合い)

両王手(王手をかけている駒が複数)のときは1.しか成立しないので比較的簡単である.

王手の駒を王で取るケースを1に含める方がアルゴリズム上簡単な場合もあり,その際は2.王以外の駒で取ると定義する.

 

あまり考えずに作成すると重複生成されたり不足したりすることもあるのでデバッグ注意の案件である.また,究極には速度が要求されるので無駄なループや分岐を作らないように気を配る必要がある.興味がある人は一度遊んでみるといい課題かと思う.

 

自信がない人は,将棋の前に五目並べやオセロから入るといいと思う.

囲碁の世界一を目指すらしい

www.itmedia.co.jp

 

グロービス,山口さん、日本棋院,トリプルアイズの4者共同で世界一を目指すらしい。山口さん個人で既に2位とか3位とか4位とか何回も活躍されてますし,本文読む限り山口メンバーがセンターですね。

私が勝手に推察するに山口さんが他の囲碁ソフトと比べて劣る部分の筆頭は計算機リソースなのでこれで射程内は間違いないでしょう。そりゃ個人で開発してればGoogleやFecebookにはリソースで劣りますわな。ただ,これでリソースで追いつくかどうかは正直分からないレベルです。今後の活躍に注目ですね。

 

ところで,ついでのように続けますが私と山口さんは昨年の世界コンピュータ将棋選手権の前日リハーサルが初対面でした。私の右にRemi Coulom,左に山口さんって座席でした。初参加組テーブルだったのでしょう。ネタ的にRemiさんと練習試合をしたかったのですがセットアップに戸惑っていたので左の山口さんにお願いしました。

 

洒落たジャケットで真面目そうな顔をしていたのでちょっと恐縮しながらでしたが,快諾頂いて対戦。これが冗談のようなガチマッチでして,公式記録には当然載りませんが256手までの持将棋でした。ええ,他の練習試合は初期動作で切ったりで帰る人が多い中どちらからも切ろうと言い出さず設営組が片づけする遅くまで残っていたことを記憶しています。

その晩「あれ?うちのソフトやっぱそんなに強くないな。予選落ちするんじゃないかなぁ。」と夕飯を食べながら不安になっておりました。もしかしたら,山口さんも同じ心境だったのかもしれません。

 

まぁ,結果はうちと山口さんが初参加で一位二位でしたので練習試合での心配は杞憂に終わりました。っつーか,あの練習試合がそんなことになるとは思って無かったですよね。当人は囲碁がメインで将棋は初参加・偵察ですとのことでしたが,結構マジでしたね。私の中では楽しいネタのひとつです。

 

囲碁でのご活躍期待しております。って締めようかと思ったんだけど将棋の世界選手権も当然山口さん出てくるので「今年もよろしくお願いします」ですね。

もう,勝たせてくれないかな?

 

pytorch入門2

bleu48.hatenablog.com

 

前回の続き。

マシンを一台借りたので真っ新なインストール。

python3.7.3, Visual Studio 2019, Cuda 10.1, Pytorch 1.0 と順に入れた。

前回同様特に何のトラブルもない。

 

PS C:\work\torch\test> Measure-Command {py .\main.py}


TotalSeconds : 128.6786353
 

PS C:\work\torch\test> Measure-Command {py .\main.py --no-cuda}


TotalSeconds : 781.2377098

 

前回より遅いのが気になる。

10コアのCPUにQuadro P6000なんだが・・・

---

モデルが小さいときとか

とにかくシングルスレッドで高クロックな方が速いことが多いな.

竹部スペシャルの件

yaneuraou.yaneu.com

  

竹部先生がやねうら王チーム側についたので軽い煽りを入れたつもりが間髪入れず完全にお返しを喰らった感じになりました。横歩取り33角に対する同飛成ですが,同飛成らずまで生成している様子。

 

  

同飛不成も竹部先生の実践譜で存在する始末なので,選手権前に茶々を入れるつもりが手も足も出てない感じになってしまいました。

もうこうなったら対戦した時に先手だろうが後手だろうが横歩取り戦法に持ち込むしかないですね。やねうら王チームの一次予選勝ち上がりを祈ります。

 

ということで,負けっぱなしで悔しいので少しだけ捨て台詞吐いておきます。

現時点で「100テラショック定跡」なるものは41702局面分あります。そのうち我々が対戦用に用いている定跡局面と重複しているものは9998局面しかありませんでした。意外に少ないんだなぁという感じです。特に他意はないのですが,指し手の一致も確認してませんので特に意味が無い感じです。

ちなみに私の定跡で管理している局面数は582724局面です。ですが,もちろん全局面が対戦で現れることはありませんからご心配なく・・・

 

将棋の面白いところと気を付けるところ

生まれ育った街の三角形の公園には9×9の升が描かれたベニヤ板がベンチに釘で打ち付けられているようなところでした。小学生が下校する時間帯におっさんが集まって将棋をしているような昭和の風景を記憶しております。

まぁ,それほど上品な街でもないためおっさん同士の会話もざっくばらんなもので,子供の教育上色々問題があったように思います。その中でも幾つかは教育に良いこともあり,「持ち駒はきちんと見せる」「外野は口出ししない」などと将棋のマナーは教わりました。

 

将棋は言うまでもなく完全情報ゲームです。それ故,他の運要素などがあるゲームと異なり負けた場合の責任は全て当人にあり曖昧な言い訳要素がありません。小学生の子供でもそういうことは分かっているため,負けたときは相当悔しく泣き出す者がでる理由でもあります。もちろん,それ故学べば学ぶほど上達の余地がありますし,そのことは小学生でも分かります。

そして上達すれば小学生でも大人に勝てるのが面白いところです。

プロ入りする新人のエピソードで小学生で既に付近の大人を相手にしなかったなどと言われることは多々あります。

 

では,強くないと面白くないのでしょうか。また,勝たないと面白くないのでしょうか。

これも楽しみ方の問題ですね。私などは対戦相手がいないこともあって随分観る将として楽しんでおりますが,プロ・有段者に関わらず面白い将棋というものはあると感じます。

指導対局駒落ち戦ですら面白いものがあります。

 

例えばですが,駒落ち戦では上手は下手がそれなりにきちんと学んだ手を指してくると困るわけです。どこかで外す手を指す必要性が生じてくるのですが,それは厳密に咎められると悪手となります。つまり,下手が咎められないことを予測して変化を加えるのです。これはプロ棋戦でも行われる事象ですが,駒落ち戦では素人目にも露骨に行われます。どうしても下手がんばれの視点になりますね。

こういった上手の策略に自分の頭で考えてうまく対応ができると勝利になりますが,失敗するとその程度次第で負けになります。この策略の最大の妙手が,「詰めろ見逃し」です。ある程度の棋力になると詰みがあるかどうかは見えてくるのですが,下手の棋力を見切って詰めろを意図的に見逃す荒業になります。プロ棋士でこれを用いるのはファンサービスの厚い棋士のみと聞きます。「詰めろ見逃しの詰めろ」とか傍観者もドキドキしますね。(絶対傍観者は口出ししてはなりません)

 

ところで,昨今マナーの悪い人が出ているようです。新参者に対する教育ができていないんでしょうか。対局中に口出しする人の話を聞きます。さらに酷いことにスマホで検索を行って口出しする方までいるそうです。もう,論外ですね。

野球場のヤジのようになっては一番面白いところが台無しです。 草将棋でも静かに観戦しましょう。

  

あ,コンピュータ将棋ではヤジが聞こえませんので,開発者同士は対局中結構ざっくばらんに会話をします。互いの工夫点などの情報交換が勝敗云々より一番面白いと思っていますし,当初から私が参加する主目的と言っていいでしょう。

 

 

炎上案件への介入の仕方(20年前の方法論)

最近,コンピュータ将棋関連で知名度が上がってプロ棋士始め一部の方から「天才プログラマー」などと呼ばれることがあります。ここ20年プログラムを書くのは基本的に自分の研究のためのツールとしか考えておりませんでした。

 

が,そういえばプログラマーらしきことをしていた時期がありました。20年以上前の学生時代のことです。当初は様々な短期アルバイトを繋いでいた最中に呼ばれたのがIT系のベンチャーでした。比較的自由な雰囲気と情報系の学生達と馴染んで,気が付いたら持ち帰りでもいいからと請負仕事になり,そのうち炎上案件に呼ばれることが多くなりました。考えてみると給与も倍々に跳ね上がり結構評価されていたことになります。炎上案件への介入もすぐマネージャーポジションで入ることが多くなりました。現場の超一流コーダーの方よりコーディングが遅かったのも理由のひとつでしょう。学生の身分で当時バナナより重い携帯電話を持つようになったものです。

具体的には見様見真似と研究管理のノウハウの混ぜ合わせのテクニックで凌いでいたことになります。多少運がいい方なので上手に凌げていた感もありますが,何より職業意識が無かったのが一番のミソです。つまり,完成度や業務実績にプライドのかけらもありませんでした。随分あれなので記憶にある範囲で簡単にメモを残しておきます。

 

1.依頼の受け方

炎上案件はその炎上理由に寄りますが,普通じゃありません。普通に対処すると人災が降りかかる恐れがありますので逃げることを常に頭の隅に置いておきましょう。消防士が火災現場で死傷してはなりません。

まず,炎上理由を確認しましょう。多くは関係者の無計画・無能などが考えられますが意図的な放火の類もあります。問題解決が可能であるかどうかの判断が重要です。安全サイドで見積もりましょう。依頼主や関係者が信頼に値する人かどうかも重要です。大会社の部長さんでも首が緩々の方もおられます。

次に交渉です。私は当時の師匠から着手金として半金頂くのが介入条件であると教わりました。消火中に別の連鎖災害の可能性もあります。そもそも負債ですので前金なしでの介入はありえません。また,ゴールの設定です。炎上案件では通常のゴールに到達できないのは当然です。納期が遅れている場合も珍しくありません。メディアの前でデモンストレーションをする一週間前に呼ばれたこともあります。ゴールラインを下げましょう。「最悪発注元から訴訟に持ち込まれることがなければOK」とかのライン引きになります。延長戦は他に依頼するとか条件付けでの介入も火消しならではの捌きです。

前金で終わることや訴訟リスクも視野に入れて,冷静に判断して自分に得があればやっと依頼を受けるということになります。炎上案件ですので少々渋ったフリを入れて着手金を上げるのも交渉ですが,無傷で帰る方を優先して下さい。

 

2.現場介入

炎上案件は普通じゃない引継ぎです。特に現場は心身とも疲弊したエンジニアが死屍累々となっていることが考えられます。チーム構成などは事前に頭に入れて置き,必要であれば個別に呼び出して今後の身の振りを指示します。お勧めは食事に誘って愚痴を聞くことです。炎上の詳細が分かりますし,メンバーから外す際にも「よく頑張ったね。ちょっと休みなよ。」と言いやすくなります。多くの場合は一番まともな一人を残してちょっと休めと言うことになるでしょう。それは恐らく元リーダー格ポジションのはずです。(そうでない場合はそれが炎上理由のひとつです)

引継ぎが難しい案件もあります。多く現場が引継ぎを嫌う場合です。自分の仕事と思い入れがあるんでしょう。使えるスタッフであれば残って頂いた方が戦力になりますが,ここはドライに切りましょう。もちろん介入時に権限移譲を頂いておくのもお忘れなく。この際リスクの大きい通知は自分でやる必要はありません。雇用主の仕事です。

実際は全権委任くらいの感じで介入するのですが,現場では救世主風ではなく「大変な仕事押し付けられた感」を出して協調していきましょう。何せ当時私は学生ですw

 

3.超特急案件

引継ぎがうまくいけばあとは非炎上案件と同じです。異なる点があるとすれば時間的に特急仕事であることくらいです。必要であればヘルプを呼ぶオプションを着手交渉に入れておくべきです。同類の火消しにネットワークが必要になります。「今日から三日徹夜仕事になると思うけど頼める?」と言える知人が数人居れば安心です。

超特急案件をひとりで納めれば日当10万円台が見えてきますが,体を壊さないように注意しましょう。無事に帰るまでが炎上案件です。

蒼き伝説シュート!のワンシーンで久保キャプテンが1点劣勢の場面で奇跡の11人抜きで同点にしますが,そういったことをしてはいけません。

 

4.火元データベース

炎上案件に介入すると実績評価が勝手にされて他の炎上案件でも呼ばれるようになります。こちらも依頼主を評価しておきましょう。A社のB部長は金が渋いが信頼できるとか,C社のD課長は社内では評価低いが技術的な察しが良いとか,アレはダメとか二度と組まないとか記録に残しましょう。同類の火消し連中と共有するのが重要です。場合によれば全員で蹴るなど示し合わせが必要になることもあります。火消しが火災を大きくしてはなりません。

 

ざっくり書きましたが,炎上案件介入は江戸の火消しと似ています。基本的に火元を特定し拡大をしないように破壊し,再構築となります。長期的に関わるものとは異なると理解してください。