長文!ミリジャンのOverview!とAを探すワイズ/プログラムは止まらないと新・刊・宣・伝はなぜ今年も2つあるのか2019

ウィザード要素が強引すぎる。

皆様こんにちは。遡ること2年前、2017126日に910プロアドベントカレンダーの史上初の記事を書いた者、西葛西と申します。当時と比べて会員も増え20名を超える大所帯になり感慨深い反面、1期に1ターンしか回らなくなったのは寂しかったり。(なお多く回ってきたらきたで記事のネタに困る模様)

さて、今年は2017,2018と開催されていたアイマス×プロ野球コラボがありませんでした(来年こそはやってほしい)。んで、何を書くか考えましたが(ミリシタのコンボ数に強引に意味を見出すとか、パワプロのペナントをアイマスと同じ名前の選手のみで戦う(2番煎じ)とか、ネタ動画作って終わりとか)、個人的に今年の第4四半期に一番嵌ったのはこれかなあ……ということについて書きます。十分アイマスが絡んでいるので都合も良い。

 

ミリジャン」というゲームを皆様ご存じでしょうか。

Twitter等で検索からこの記事に飛んできたガチ勢の皆様はさておき、一般Pへの全体的な知名度はまだまだ低いのかなあと思いますのでダイマも兼ねて説明させて頂きます(ルール等に誤り等を見つけた方は筆者のTwitter(@WestKasaiKK)までお願い致します)

 

「ミリジャン」(正式名称「ミリジャン ~THEATER LIVE PROJECT~」)とは電子レンジさん(@denshirenjip)が開発された「アイドルマスター ミリオンライブ!」の二次創作ゲームです。「プロデューサーとしてアイドルを集めて最高のライブを創り上げるゲーム」という触れ込みですがなんのこっちゃだと思いますので真面目に説明します。既にご存じの方は下の方で「終わりですよ、終わり!」って叫びますのでそこまでスクロールして下さい。

名前の通り、基本的には麻雀をベースとしたシステムになっていますが、以下のように多くの相違点があり最早別ゲーです。

  • 牌には「ミリオンライブ!」に登場する765プロのアイドル52人、961プロの詩花、カメラマンの早坂そらの計54人が描かれている。牌の総数は54人×各3枚で計162(麻雀は34×4=136)
  • 山を積むときは3枚ずつ重ねる(牌が薄いので無問題)。54束できるので1人当たり13~14束並べることになる(配分は適当)(麻雀では2枚ずつ、計68束、1人当たり17束)
  • 東/南n局やn本場や半荘の概念がなく(n∈ℕ)、基本的に1局が1戦扱い。
  • 親はじゃんけんで決めることが多い(運営曰く決め方は何でもいいらしい)
  • 親から見て、手前の列の一番右から1(3)ずつ時計回りに取っていく。全員が4(12)ずつ取ったら親が次の束の上から1枚取ってゲーム開始。これ以降牌を引くときも同様にして1枚ずつ取っていく。
  • 上述の通り、完成形の牌の枚数は13(麻雀は14)
  • ゲーム開始前にそら以外の53人の中から各自「担当」を宣言する(後の得点計算に影響する)。担当はプレイヤー同士で重複しても構わない。
  • [多分最重要]麻雀では刻子or順子を4+対子を1組揃えることを目標とする(例外あり)が、ミリジャンでは13人の範囲でユニット(定義は後述)の組み合わせを完成させることを目標とする。(:自分の持ち牌が[,雪歩,あずさ,可奈,,未来,まつり,美也,紗代子,海美,奈緒,美奈子,のり子]の場合、[,雪歩,あずさ,可奈,]BIRTH[未来,まつり,美也]でタウラス、[紗代子,海美,奈緒,美奈子,のり子]で閃光☆HANABI団ができるため、これで完成となる)
  • 故に、構成ユニット数は1組~8組と幅広く、また同じユニット数でも(:3)人数の組み合わせは多い(:{5,5,3},{5,4,4},{6,4,3},{6,5,2}など)
  • 麻雀では刻子や順子等の組み合わせによってできる効果を役という(:3種の[1,2,3]を揃えたら三色同順)が、ミリジャンではユニットそのものを役と呼ぶ(:[未来,静香,]という組そのものが「シグナル」という役)ことが多い。というか麻雀における意味での役は無い。
  • 麻雀と同様にローテーションで牌を1枚引き1枚捨てることを繰り返すが、倫理上問題があるため「捨てる」という表現は使わず、麻雀における河を「控え室」と呼び、そこに牌を出す行為を「(控え室に)送る」という表現をする。
  • 76552人では1人でユニットを構成することはできないが、詩花のみ1人でユニット扱いとなる(その代わり当然765勢とユニットを組むことはできない)玲音の実装予定は今のところないらしい。
  • 早坂そらを使用する場合、麻雀には存在しないムーブをする。自分の手番で、まず牌を引く前にそらを使うことを宣言し、そらを控え室()に送り、その後控え室から好きな牌を1枚入手することができる。自分の控え室からも入手できる。
  • ユニットを揃えることが重要なので、ポン及びカンは存在しない。
  • 但しチーは存在する。麻雀同様に、自分の手牌であと1人いればユニットができるという状況であるときに、その牌が控え室に送られたら鳴く(チーする)ことができる。但し、3人以上のユニットでなければ鳴くことはできない。なお、この行為を高木社長の台詞から「ティン(と来た)」という(が、筆者は使っていない)
  • フリテンは存在しない。
  • リーチは存在しない。
  • 上がりのことを「ミリオンライブ」という。ツモ上がりもロン上がりも可能(但し詩花でロン上がりはできない)
  • 得点体系は乙女ストームでも分かるくらい至ってシンプル(後述)。また、得点体系は親と子で同一。
  • 持ち点の概念はなく、従って点棒も存在しない。複数局行う場合は、1局ごとに各プレイヤーが獲得した得点の総計で勝敗を競う。
  • 上がらなくても得点が貰える場合がある。ごく稀だが、場合によっては上がった人間より高得点になる場合、上がらない方が上がった場合より得点が高くなる場合がある。
  • 誰かに振り込んでも(自分の送った牌が誰かのロン上がりになっても)自分の得点に影響はない。
  • 流局は制度上はあるが、麻雀に比べ牌数や待ちの形が多くまた振り込むリスクも小さいため、めったにない(開発段階から現在に至るまで約半年で2回しか出ていないらしい)聴牌の有無による得点の変動はなく、全員が上がれなかったものとして得点を計算する。

多いな。だから別ゲーだと言ったろ。まだあるかもしれないです。

後回しにしたユニットの定義について説明します。

 

ユニットの定義について

役名はユニット名がある場合はそれ、ない場合は曲名を引用。

[ミリオンライブ!]

基本的に、楽曲の存在するユニット(LTP,LTS,LTH,LTD,LTF,MTG,MTW,TA,TB,TC,ミリラジ,ゲッサン,BCなど)のみが認められる。よく引き合いに出される例としてマイペースユニット=[まつり,朋花,美也]があるが、これは2019年12月現在楽曲がないので役にはならない。

ミリシタ内でのみ登場するユニット(「サンリズム・オーケストラ♪」「brave Harmony」「Starry Melody」のイベント時の5人ユニット、「きゅんっ!ヴァンパイアガール」の[伊織,育,桃子]など)も有効。

※楽曲があるのに認められない例外:ソロ(ソロ曲があっても駄目)、14人以上のユニット(物理的に無理)、ミリオンライブ!に登場しないアイドルが含まれるユニット(同)、LTD02~06における「Dreaming!」歌唱の10人ユニット(これは何故なのか地味に疑問)、「サンリズム・オーケストラ♪」「brave Harmony」「Starry Melody」の楽曲リリース当時の12人バージョン

※楽曲がないのに認められる例外: Fleurs(BNS)、PRINCESS/FAIRY/ANGEL STARSのASを除いた13人(地味に曲がない)、スコーピオの琴葉を含めた4人バージョン(これは認めないと暴動が起こる)、マイティセーラーズの百合子を含めた3人バージョン(担当的にはありがたい)

[765PRO ALLSTARS(アイドルマスター本家)]<筆者はあまり詳しくないのでつつかないで>

基本的に、ミリオンライブ!開始以降(=2013/2/27以降)にリリースされた楽曲の存在するユニット(MASTER ARTIST 3, PLATINUM MASTER, MASTER PRIMAL, STELLA MASTER, FotW, VtB, eDeN, ビジョナリーなど)のみが認められる。

※楽曲があるのに認められない例外:ソロ(同上)、ミリオンライブ!に登場しないアイドルが含まれるユニット(同上)

※ミリオン開始以降の楽曲がないのに認められる例外:SprouT,花鳥風月,わんつ→ているず(以上漫画版ざわわん)、メリー=[春香,千早,美希,真,やよい](ミリシタ実装)、竜宮小町(律子を含めた4人バージョンでも可)(知名度が高いため?)

[961]

詩花(唯一の1人ユニット)

[共通]

ライブ等で歌唱した時のメンバー等は考慮されない(してたら大変なことになる)。

新曲/新ユニットができて役が増える場合、その楽曲が公開された時点で役として認定される。(例:Sherry ‘n Cherry=[このみ,莉緒]は2019/11/15の生配信で楽曲のMV公開が終了した直後に役実装の通達が運営からなされた)(故に、毎月1つは役が増える)

 

例外に漏れがあるかもです。

次に、同じく後回しにした得点計算について。

 

得点体系について

n∈ℕ (1≦n≦13), k∈{0,1}, t∈{0,1} とする。

上がった場合k=0、上がれなかった場合k=1とする。

完成しているn人ユニット1つにつき、そのユニットがティン(チー)してできたユニットであるかロン上がりの際に当たり牌を含むユニットである場合t=1,そうでない場合t=0として、max{1000,2000(n-k-t-1)}点を加算する。

更に、完成しているユニットのうちいずれかに担当が含まれる場合、2000点を加算する(何枚あっても加点は2000点一律)。

ユニットの組み方の違いによって複数の得点が考えられる場合、最も高いものを採用する。

 

日本一難しい書き方をした自信があります。乙女ストームに全く優しくない

要は「1人だったら1000点、n人だったら2000(n-1)点だよ!でも上がれなかったら全ユニット1人ずつマイナス、ティンしたら更に1人減った得点になるよ!でも1人より少なくなることはないよ!あと担当が1人でもいたら+2000点だよ!」くらいに捉えて頂ければOKです。

2つほど例を挙げましょう。

 

例1:担当は可奈とする。以下のような形で、最後の美也をロンで上がったとする。

[真,雪歩,あずさ,可奈,歩]BIRTH

[静香,百合子,昴]ウィルゴ(ティン)

[可奈,志保]メリー(※BCカバー)

[詩花]詩花

[エレナ,美也]Cleasky(ロン)

 

上がったのでk=0である。

BIRTHは5人で、ティンしていないので、n=5,t=0となり、max{1000,2000*(5-0-0-1)}=max{1000,8000}=8000より、8000点が加算される。

ウィルゴは3人で、ティンしているので、n=3,t=1となり、max{1000,2000*(3-0-1-1)}=max{1000,2000}=2000より、2000点が加算される。

同様に、メリーはmax{1000,2000*(2-0-0-1)}=2000点、

詩花はmax{1000,2000*(1-0-0-1)}=1000点(詩花は常に1000点)、

Cleaskyはロンなのでt=1となりmax{1000,2000*(2-0-1-1)}=1000点。

更に、BIRTHとメリーに担当の可奈が含まれているので、2000点を加算する(枚数は考慮されない)。

よって、得点は8000+2000+2000+1000+1000+2000=16000点となる。

 

例2:担当は百合子とする。以下のような形で、他のプレイヤーの上がり又は流局により上がれなかったとする。

[春香,千早,貴音,律子]BRAVE STAR

[可奈,志保,星梨花,海美]Clover(ティン)

[翼,可憐,茜]りるきゃん(ティン)

ユニット不成立→[百合子]

 

上がれなかったのでk=1である。

BRAVE STARは4人で、ティンしていないので、n=4,t=0となり、max{1000,2000*(4-1-0-1)}=max{1000,4000}=4000より、4000点が加算される。

Cloverは4人で、ティンしているので、n=4,t=1となり、max{1000,2000*(4-1-1-1)}=max{1000,2000}=2000より、2000点が加算される。

同様に、りるきゃんはmax{1000,2000*(3-1-1-1)}=1000点。

また、担当の百合子がいるが、できているユニットに絡んでいないので担当ボーナスは無し。

よって、得点は4000+2000+1000=7000点となる。

 

上がれなくてもいいとこまで行けばそこそこの点が貰えることが分かりますね。

 

ルールの説明、

終わりですよ!終わり!

 

長かったですね。まあ実際に触ってないどころか図示すらなく文字だけの説明を見せられてもというところではないかと思いますが。

私が初めてこのミリジャンを遊ばせて頂いたのは9月23日、即ちミリオン6thSSA公演の翌日に新宿の一角にあるお店にお邪魔して6時間ほどぶっ続けでプレイさせて頂いた時のことです。その時の最初の結果がこちら↓。

[琴葉,恵美]でトライスタービジョンのエレナ待ちでいたところに未来を引いたので[未来,琴葉]でSTAR ELEMENTSの可奈待ちに切り替えたところ送った恵美が他の方に当たってしまうという典型的な振り込みをしてしまいました。でもミリジャンでは正直さほど問題ではありません。なお担当は例の如く最初から今までずっと可奈でやってます。

そして2局目、ついにミリオンライブを頂きました↓。(※得点制度が現在と異なっています)

 さてこれ、ツモ上がりでツモ牌は一番右の静香(だったはず)ですが、[未来,春香,千早]で聴牌している場合、上がり方(引いたら上がりになる牌の種類)は何通りあるでしょう?(これら以外の牌と河は考慮しないものとします)

正解は(赤枠内伏せ字)

[まず未来と春香でハルカナミライを作る場合、千早ともう1人で2人組を作ることになりますが、上述のアライブファクター=[千早,静香]に加え、CRIMSON LOVERS=[春香,千早]、inferno SQUARING=[千早,雪歩]、花鳥風月=[千早,貴音]の計4通りがあります。次にはるちはでCRIMSON LOVERSを作る場合、未来を含む2人組はハルカナミライ=[春香,未来]とGO MY WAY!!(ゲッサンカバー)=[未来,静香]の2通りがありますが、どちらも上と被ってしまうため、答えは{静香,春香,雪歩,貴音}の4通りです。]

ちなみに[春香,千早,静香]だと[{千早,未来,ジュリア}の3]通り、[春香,未来,静香]だと[同様に{千早,未来,ジュリア}の3]通り、[千早,未来,静香]だと[最初の例と同様に{静香,春香,雪歩,貴音}の4]通りです。麻雀だと国士無双13面待ちとかいう頭おかしいの以外では多くても3面待ち程度でしょうが、ミリジャンでは5面待ちくらいは余裕で実戦に登場します。そして大抵の場合全部の待ちには気付かないです。待ちの多様さがお分かり頂けたでしょうか。

また、やはり{3,3,3,3,2}で固定されている麻雀と違ってユニット人数の組み合わせが多数あることが一番の特色なのではないかと思います。例えば残り7牌で[ロコ,歩,桃子,星梨花,環,ひなた]の場合、昴を引いてJPPBか杏奈を引いてピコプラか、という考え方になりますが、仮にこのどちらかを引いても、人数が足りないためもう片方の待ちは崩さなければなりません。ここの人数計算ができてないと大変なことになります(プレイ済みの方は誰しも経験があることでしょう)。

 

麻雀とは別ゲーと散々言ってますが、中毒性は麻雀に十分通ずるところがあると思います。だからこそ氷点下の時期の札幌オフ会に20人以上集まったり、クルーズと日程被ってるはずの金沢オフ会に開催2ヶ月以上前の現時点で参加確定者+興味ありで既に40名以上いたりするのです(金沢では対戦宜しくお願い致します)(ぜひ七尾市にもWelcome!!)。また、公式供給で毎月役が増えるのも個人的には好きです(生配信を観る楽しみがまた増えた)。現物を購入できる時に購入しなかったことを強く後悔しています。

難点としては、牌に絵と背景色(Pr/Fa/Anの属性を示す)以外の情報がなく、ミリマスを知らない人は牌を引いてもそれが未来なのか静香なのか翼なのか分からず逐一調べる必要があるということ、そして役の一覧表があるとはいえ役の量が膨大で(現在約160種類)、数字みたいな法則性がある訳でもなく複雑であること、即ち総じて初心者向けではないということなのかなあと思います。初心者どころか中級者以上でもかなりミリマスそしてASにある程度精通してないと慣れないうちはプレイが結構大変です。私もAS役に関してはミリジャンを始めてから知ったものが大半です。

そこで当方ではこれらの問題点を解決した「カードミリジャン」というものを開発中でございます。そのうち試作品ができたら公開します。正直、他にやることが多過ぎて完成いつになるんだって感じですが。

また、ミリジャンやってみたいけど現物持ってないし持ってる知人もいないしオフ会にも行けないよっていう方には、YSR(@YSRKEN)さんが作成された「ヒトリジャン」がお勧めです↓。

hitori-jong.firebaseapp.com

 

お待たせ致しました。ここから本題です(前置きが6000字)。

 

最早何故その発想にたどり着いたのかはもう忘れてしまったのですが、このミリジャンに関して、プレイヤーの立場から最適な立ち回り(どこで鳴くか、どの牌を送るか)を判断して実行するCOMを作りたいと思ったので作ってみました。基本的にPythonを使って開発していますが初心者of初心者なのでガバがくっそ多いです。ご了承下さい。

段階がいくつか必要なので順に説明していきます。

Step1 持ち牌でどのユニットができるか調べる

例えば[,雪歩,あずさ,可奈,,未来,まつり,美也,紗代子,海美,奈緒,美奈子,梨花]という持ち牌の場合、①どのユニットが既にできているでしょうか。②どのユニットが「あと1人」の状態になっているでしょうか。(20191212日現在)

①答え[BIRTH、タウラス、Dreaming!(BCカバー)Smiling CrescentMelody in ScapeBeat the World!!!、ダブルエース、Do-Dai(BCカバー)LEMONADEの計9ユニット]

②答え[閃光☆HANABI団、瞳の中のシリウスCloverSTAR ELEMENTS、ミリラジ、ONLY MY NOTE(BCカバー)MUSIC(BCカバー)、デュエット16(省略、以下の画像を参照)の計23ユニット]

①が全部分かるだけでも十分凄いですが②まで完璧に分かる人は流石に居ないと思います(居たら相当なミリジャンキー)。これを解くプログラムを書きます。

といってもまだ簡単で、全ユニットのリストを作り、上から順に何人いるかを調べていって、結果をソートするだけです(ソートの計算量がO(n^2)になってるのは許して)

上述の持ち牌を入力させて実際に動かしたところ、以下のような出力を得ました。

f:id:production910:20191212165214p:plain

ユニット検索結果(下にまだまだ続く)

見方は大体分かると思うので割愛しますが、これらは①ユニットの不足人数が少ない順、②ユニットの総人数が多い順、③ユニットに予め割り振られた番号の昇順 に並んでいます。③については番号の振り方は適当です(一応LTPLTHLTD→……みたいにしてます)。この並び順は見やすいだけでなく後のStep2で非常に重要になってきます。

これがあるだけでもユニットの見落としがなくなるので実戦ではかなり強力だと思いますが(特に他のユニットとの関連が薄い45人ユニットは本当に見落としがち)、特に中盤以降はこの中から誰を残せばいいの?ってなることが多いと思います。そこで一番大事な次の段階です。

Step2 どの牌を送るのが最適か調べる

まずそもそも「最適な送り牌」の答えは一つじゃありません。例えば、2面待ちになるが上がるとどちらでも14000点になる場合と、1面待ちになるが上がると16000点になる場合の2つが考えられる場合、点数を取るか上がる確率を取るかで意見が分かれるかと思います。また、その送り牌のどちらかが担当である場合、そっちを送る方はごく少数かと思われます。AIに自主的に学習させられるならいいですが今はまだそのレベルに達していないので、ここでは、役の違いによる点差と上がりの有無による点差では後者の方が大きい傾向があることから、「点数は無視してとにかく上がりに近付く選択肢を取る」ということを行動の大原則としました。(勘のいい方ならお分かりかもしれませんがこの時点で「担当」の制度が意味を成さなくなってしまいましたね)

ここでは「A*探索」(エースター探索)と呼ばれるアルゴリズムを使います。一般的な話はWikipedia等を読んで頂くとして、A*探索で重要な概念として「ヒューリスティック」と呼ばれるものがあります(hと略されます)。これは簡単に言えば「現在地からゴールへの距離」のことであり、ミリジャンにおいては「現状から上がりまでに最低限交換しなければならない牌の枚数」と考えることができます。私がオフ会等でプログラムを走らせてて「エイチイコール5かよなげえなあ」とか言ってるのはこれのことを指してます。ミリジャンではたぶんhの範囲は0h8だと思います(最大値が自信ない)。なお、本記事においては便宜上、ヒューリスティック」を原義とは若干異なる使い方をしています。ご了承下さい。

例として[,雪歩,あずさ,可奈,,未来,まつり,美也,紗代子,海美,奈緒,美奈子,梨花]の例では、例えば星梨花とのり子を入れ替えればBIRTHとタウラスとHANABI団ができるので上がりです。この場合、h=1となります。

しかしながら、上がり方は1通りではありません。上記の例で、のり子⇔星梨花 以外に上がりになる交換は何通りあるでしょうか。

正解は[やよい⇔奈緒、志保⇔奈緒、可奈⇔奈緒、詩花⇔奈緒、やよい⇔紗代子、志保⇔紗代子、可奈⇔紗代子、詩花⇔紗代子、亜利沙⇔可奈、美奈子⇔可奈 の10通り(詳細は2つ下の画像を参照)]です。こんなん分かる訳がない。

ということで、とりあえずこれらの組を全部調べてしまわなければなりません。ここで新しく、hと対になる概念としてgというもの(特に名前はないらしい)を導入します。これはヒューリスティックとは逆に「スタートから現在地までの距離」を示します。ここで「は?スタート=現在地じゃないの?」と思った方は多いと思いますので以下の探索木の図を交えて説明したいと思います。

f:id:production910:20191212165629p:plain

ユニット探索の探索木のごく一部

左上の13人いるところがスタート地点です。ここから、なるべく不足人数が少なくなるようにユニットを取り除いていくことを考えます(ユニットを取り除く過程が黒矢印)。各地点での余りの人数がhに等しくなります。初期状態ではh=13です。また、gはここでは不足人数の総数を示し、初期状態ではg=0です。

まず、13人の状態で、Step1でやった検索を行います。すると先頭に来るのは欠員のない5人ユニットのBIRTHです。この5人を取り除きます。ここでh=8になり、欠員はいなかったのでg=0のままです。

次に、残りの8人で同様にStep1の検索を行うと、タウラスが先頭に来るので、その3人を取り除きます。h=5,g=0になります。

さてここでHANABI団いけよと思うかもしれませんが、ここでStep1での原則が効いてきます。「①ユニットの不足人数が少ない」方が優先です。従って、紗代子と美奈子が両方いるため、Melody in Scapeを取り除きます。h=3,g=0になります。

残った[海美,奈緒,梨花]で更に検索を行い、欠員のいないDo-Dai(BCカバー)を取り除きます。h=1,g=0になり、奈緒だけが残ります。

さて、奈緒1人ユニットは当然できません。ここで検索を行うと、欠員1で総人数1の詩花が唯一の検索結果になります(残り人数を超過するユニットは検索対象外)。ここで詩花を交代要員(緑字で示します)として加えると、h=1はそのままで、g=1になります。

ここでh=gとなりました。これはつまり「奈緒と詩花を入れ替えれば上がれる」ということなので、ここで探索結果の1通り目「詩花⇔奈緒」が見つかりました。このようにh=gとなったときがいわゆる探索のゴールに相当します。

そして、ここでh=1であるゴールが1つ見つかりました。つまり、今後ゴールは多数見つかる訳ですが、最短で上がることを考えると、h2となる解はこの解の下位互換なので意味がありません。よってこの値を記憶しておき、h2となる解を返さないようにします。

さて、ゴールに着いたので1手戻ります(戻る過程が赤矢印)。しかし[奈緒]のみでは詩花以外にどうしようもないので、もう1手戻って[海美,奈緒,梨花]の状態に戻ります。

さてここでこの地点での検索結果を思い出すと、Do-Daiの次に来ていたのは欠員1で総人数3のDreaming!(BCカバー)です。ということで、まず今いる海美と星梨花を取り除き、次に欠員である可奈を交代要員(緑字)として加えます。これで再びh=g=1になりますので、これもゴールです。探索結果の2通り目「可奈⇔奈緒」が見つかりました。

さて再び[海美,奈緒,梨花]に戻ります。次の検索結果は欠員1、総人数2Smiling Crescentです(デュエットの登場順は私の匙加減)。星梨花を取り除き美也を加えて、h=2,g=1になります。ここで、取り除ける残り人数は1人になりましたが、詩花を使うとh=g=2になってしまうため、この解は返すことができません。よって、解なしの結果で[海美,奈緒,梨花]の状態に戻ります。

同様にして、Understand? Understand!、マイティセーラーズ(2)、ビジョナリー(ゲッサンカバー)、ダブルエース、i(BCカバー)でも探索しますが、いずれも同様に解が出せないので戻ってきます。

次の検索結果は(人数が4人以上いればCloverだが飛ばして)欠員2、総人数3のキャンサーです。しかしここでもh=g=2と、h1を満たせません。そしてこれ以降は欠員2以上のユニットしか出てこないため、これ以上探索してもh1の解は出てきません。故に、[海美,奈緒,梨花]地点からの探索はここでようやく終了です。「詩花⇔奈緒、可奈⇔奈緒」の2つの解を持ち帰って、[紗代子,海美,奈緒,美奈子,梨花]地点に戻ります。ちなみに、返す解には誰と誰を交換するのかだけでなく、どのようなユニットを採用した結果そのゴールにたどり着いたかの情報も付随しています(: 「詩花⇔奈緒」には「Do-Daiで海美と星梨花」、「詩花で(null)」を取り除いたという情報も付随する)

さてこの地点での2番目の探索結果はダブルエースです。美奈子と奈緒を取り除き、[紗代子,海美,梨花]地点に向かいます。

ここでも海美と星梨花がいるため探索の過程は[海美,奈緒,梨花]地点と概ね同様です(詳しくは図参照)。「詩花⇔紗代子、可奈⇔紗代子」という似たような2つの解を持ち帰って、戻ります。

次が問題です。次のユニットはDo-Dai(BCカバー)です。取り除いて、[紗代子,奈緒,美奈子]地点に行く訳ですが、ここで探索を行うと、Melody in Scapeが先頭に来ます。取り除くと、[奈緒]地点。あれ?さっき来いひんかったここ?

このまま掘り進めると「詩花⇔奈緒」の解が再び帰ってきますが、この解はユニットの順番がちょっと入れ替わっただけで本質的に同じです。今回はここから詩花を取って帰るだけですが、これを認めてしまうと、同じ人数構成のユニットが複数考えられる時(:4)に、その階乗倍だけ解が増えてしまいます(:4!=24)。後の最適な送り牌の考察に影響するだけでなく、計算時間も増えるので良くありません。

ここで、各ユニットに前もって付番した意味が出てきます。Melody in ScapeDo-Daiより順番が先なので、既にDo-Daiを探索している場合はMelody in Scapeを探索しないようにする処理を行います。よって、ここはスルーします。

次にダブルエースが来ますが、同様に先にダブルエース→Do-Daiのケースを探索しているので、ここもスルーです。

次が夜に輝く星座のようにですが、同様にしてh=2になってしまうので不適です。この後も[紗代子,奈緒,美奈子]地点では解は出ず、戻ってきます。

次にようやくHANABI団が登場し、「のり子⇔星梨花」という5つ目の解を返します。

キリが無いのと画像の横幅がもう無いのでこの辺で打ち切りますが、このようにして全体に対して探索を行い、全ての牌交換の組み合わせの解を導きます。

その結果が以下の画像です(ユニットとアイドルらの間の番号は開発用なので読み飛ばして下さい)

f:id:production910:20191212165954p:plain

交換する牌の組み合わせとその時のユニットの組み合わせ一覧

ご覧の通り全部で11r……あれ、18通りありますね。

実は前述の重複処理では排除できない重複パターンがあります。これには大きく分けて2種類のパターンがあります。

1つはそもそも構成ユニットが違うパターンです。非常に分かりやすい例だと、[可奈,志保,海美,梨花]Cloverという1つのユニットとして見るか、メリー(BCカバー)+Do-Dai(BCカバー)という2つのユニットに分けて見るかで別の解扱いされてしまいます。

もう1つは交代要員の受け皿が違うパターンです。前述したはるちはみらしず多面待ちの亜種として、[春香,千早,未来,X]に対して春香⇔Xという交換を考える時、CRIMSON LOVERSの方を完成させたユニットの方としてハルカナミライを待ちのユニットとするか、その逆にするかで、これも別の解扱いになります。

これらは探索中に排除することは難しいです(後者は行けなくはなさそうだけど)。故に、上の画像には詩花⇔奈緒や可奈⇔紗代子が2通りずつあったりします。

より複雑な場合はこれらが複合することもあります。

ここで多面待ちの概念より、誰を切るのが一番上がりの可能性が高くなるのかを考えます。

今回の解を再掲すると、のり子⇔星梨花、やよい⇔奈緒、志保⇔奈緒、可奈⇔奈緒、詩花⇔奈緒、やよい⇔紗代子、志保⇔紗代子、可奈⇔紗代子、詩花⇔紗代子、亜利沙⇔可奈、美奈子⇔可奈の11通りな訳ですが、交代して入る側(左側)のアイドルはのり子、やよい、志保、可奈、詩花、亜利沙、美奈子の7人です。そして、これらのアイドルがツモやロンで転がり込んでくる確率を全て等しいと仮定します(しないと話が進まない)(h2の場合でも交代要員の組み合わせごとに確率は同様に確からしいとします)。すると、例えば奈緒を送った場合、これらの牌のうちやよい、志保、可奈、詩花のいずれかが来れば上がれるので、有効牌のいずれかが来た時に上がれる(条件付き)確率は4/7となります。同様に、紗代子を送った場合も4/7、可奈を送った場合は2/7、星梨花を送った場合は1/7となります。

そしてこれらを計算し出力した結果が以下のようになりま……

f:id:production910:20191212170118p:plain

送り牌の候補を示す結果になるはずだったもの

あれぇ?おかしいですね。結果が微妙に違う。

はい。これは私のプログラムのミスです。すいません。

正直、↑の文章書いてて「あっこれ計算式違うな……」と思いました。結論から言うと余計な除算処理が入って奈緒と紗代子の分の確率が小さくなっています。分母は合ってるのにね。直しときます。

そしてもう一つ欠点があります。それは、大体の場合、

計算にとってもとってもとーーーーーっても時間がかかるということです。

h=5とかだと1ターンごとに普通に5分以上かかったりします(これでも初期よりは削った方です)。人間戦では長考する人がいくら多くても5分あれば3巡はするので、まだ実戦投入は厳しそうです。

また、そらさんは役に絡めないので必ず上記の確率が100%になってしまうのですが、もちろん切らないようにしています(h=1の時を除く)

さてこの時点で、ただ牌を引いて送るだけの操作であれば、毎ターンこの計算を行って最も送るのが良いと思われる牌を控え室に送るのを4者で延々と繰り返す(ツモで上がったら終わり)ことで、一応ミリジャンのゲームとして成立します。

しかし、流石にティンとロンがなければゲームとして面白くありません。ということで次のステップです。

Step3 ティン、ロン、そらを実装する

前者2つはほぼ同じで、基本的にStep12の合わせ技です。

まず、とりあえずStep2を回してhの値を求めます。h=1ならロン、h2ならティンになる訳です。次に、Step1を回して、欠員1であるユニット(ロンは2人以上、ティンは3人以上のみ)をリストアップします。

ここからが大変です。Step1での欠員とStep2での交換要員が一致すればティンしてOK……と言いたいところですが、そのティンによってhが縮まらないと意味がありません。

例えば前述の例で、可奈⇔奈緒という交換例があったと思いますが、このとき持って来た可奈を入れるユニットはDreaming!です。この例の場合他に鳴き得るユニットがBIRTHしかない(しかも今回に関してはBIRTHで鳴いても無問題)なので例として良くないですが、例えば関係ない所に杏奈と莉緒がいた場合でも、カプリコーンで鳴いてはいけませんよという意味です。

更にティンの場合は、鳴いた後に誰かを送らなければいけない訳ですが、その鳴いた牌及びユニットに対応した牌を送る必要があります。上述の例で、のり子⇔星梨花というのがありますが、仮にのり子をHANABI団でティンしたとして、確率が高いからと言って奈緒や紗代子や可奈を送ったとしても意味が無いということです。のり子を持って来たなら手放すのは星梨花でなければいけないということですね。

これらの処理を間違えると、最悪hが増えます(一度やらかしました)

なお、今回は「なるべく最短で上がる」という行動理念の下、ティン/ロンできてhが縮まる時は必ず鳴くような仕様にしています。このようにして「が来たらどのユニットで鳴くか」のリストを作成し、その牌が落っこちて来たら拾う仕様にしています。

そらさんに関しては、使い方の流儀は皆さんバラバラだと思うのですが、今回に関しては(1枚持ちの場合)h=2の時に使う」ということにしています。理由としては、hが小さくなるほど狙いの牌をツモりにくくなるということ、引き延ばすほど牌の選択肢が増えてより有効な牌を持って帰りやすくなるということが挙げられます。こちらはシンプルに、Step2の後半で矢印の右側を集計したのとは逆に左側を集計し、控え室にある牌の中で重複を除いて一番多いのを持って来ています(送る牌がそらさん自身なので考慮する必要がない)。因みに、いつの間にかh1になっていた場合は普通に切ります。また、2枚持っている場合はh=33枚持っている場合はh=4の時から使い始めることになります。

これで概ね準備ができました。

Step4 コンピュータ対戦

後はこれらの思考を持ったCOM4つ並べて、牌をランダムで配布するようなシステムを作ることで、実際にCOM同士で対戦させることができます。やってみた結果が以下です(担当はCOM1=未来、COM2=静香、COM3=翼、COM4=春香)。なお、開発用に、各々の持ち牌、hの値と組み合わせ数(hが複数表示されているところはhが更新されたという合図)聴牌時の待ちの一覧を表示しています。また、ツモ牌は持ち牌一覧の一番右側の牌にあたります。

f:id:production910:20191212171016p:plain

ゲーム開始。早速COM4がアクアリウスを鳴くと、COM1もFotWで交戦。COM2がh=5とやや不利か。

f:id:production910:20191212171131p:plain

中盤戦。COM1が早くもTSVで聴牌。待ちプリやカプリコーンが鳴かれる。

f:id:production910:20191212171153p:plain

COM3が志保、COM4が海美で聴牌するもCOM1が琴葉をツモりミリオンライブ。

この対戦に15分くらいかかってることがネックですが、曲がりなりにも対戦という形はできました。更に、このうち1人を人間に置き換えて、対人のインタフェースを実装すれば、人間VS COMもできます(まだやってませんが)

まあ既に述べましたようにまだまだ不具合はありますし、この記事を書いてる途中にも修正点や改善点がいくつも浮上してるので今後直していきたいですね(やっぱりアウトプットすることは大事)

何よりも計算時間が問題です。YSRさんが仰っていた「1ターン10秒」というハードルはなかなかに高いですが、実用を考慮するとそれは越えなきゃいけないハードルなのかなと思っています。

 

では最後に宣伝でもして終わりましょうか(ここまで13000字以上ちゃんと読んだ人いるのかな……)

京都大学鉄道研究会ではコミックマーケット97の4日目(12月31日)に西地区お30bにて『京都大学鉄道研究会雑誌 葵 2019』を頒布します。今年のテーマは「関西の直通運転」です。複数の鉄道会社間を跨いで運転する「直通運転」の関西地方における事例を掘り下げ、それらがどのような影響を利用客に与えているか、また将来新たに行われる予定の直通運転についてどう変わるのかなどについてまとめた約100ページの本になっております。他にも俺が編集部長だった2018年度版をはじめ『葵』のバックナンバー、更には会員の写真を用いて作成したカレンダーも頒布いたします。最終日は皆様是非宜しくお願い致します。今回も一斉点検にコールは入るのか。

2018年度版の題字が橙色なのは意図的ですが今年のがNo.375(=美奈子)で題字が青色なのは私は全く関与しておりません。

いや910の宣伝をしろよ!!!

今年は受かったんだから!!!

910productionではC97の3日目(12月30日)に南地区タ44bにおいて参加致します。今回もSSと絵を多数収めた合同誌を頒布する予定です。私も永吉昴メインのSSを寄稿させて頂く予定です(どうやら多分きっと。執筆時点でまだ書き切ってない)。これでの仙台編、紗代子の神戸編、琴葉SSA(東京)編、の福岡編と6th4部作が完結する見込みです。何とか今年中に畳めてよかった。

とにかく今年も1年間色んな人に出会って色んな体験をさせて頂いたのは本当に感謝しています。来年も宜しくお願い致します。それでは。

最後までちゃんと読んでくれた人に良きクリスマスプレゼント(無料分でフェス限SSR)が届きますように。

[本記事に関する文責は全て西葛西に帰属します。本記事の内容に関して、ミリジャン運営様などの他者様にお問い合わせ等されることのないようにお願い致します。]

西葛西

twitter.com