[ DATT-A9D > データで遊ぶ > 府中のメソッド ]
PCゲーム「A列車で行こう9」で遊びながら学ぶ、Rのハローワールド。(最終更新:2024年10月10日)
サンプルデータ | 自動生成20200229号(x,y,z) |
---|---|
自動生成20200229号(256x256) |
その他の地形についてはこちらから。
おもなシナリオマップについてはこちら。
フォーラムの以下の記事で試行錯誤的に細切れに実行例を紹介していますので拾い読みしてください。
参考画像 | 銀座通り |
---|---|
銀座に残された唯一の鉄道踏切信号機 | |
木曽川橋梁 | |
貨物駅 | |
1番のりば | |
JR府中駅 | |
JR山手駅 | |
山手線(内回り)上野・池袋方面 | |
踏切りだ鳴らせ心の警報機 | |
全景11施工後 | |
上野恩賜公園 | |
JR上野駅 | |
東芝府中 | |
東武プロパティーズ | |
東武動物公園 |
効果音 | 82869109 |
---|---|
81772326 | |
96218035 | |
80154446 |
「A列車で行こう9」はゲームであるから、このようなイメージのもと、まずは思う存分に遊んでから、以下の「データを対象とした実験」に進む。「実験」と呼べるほど(化学や物理のような)厳格なものではないが、ゲームで遊んだ結果を一種の仮説とみなして、人手でゲームを遊んだときに出てくる結果をアルゴリズムでも出せないかともがくのである。人間のプレーヤーとしてはゲームの外側で上掲の参考画像のようなイメージ(表象・心像)というかたちの外部知識を持つ。「思う存分に遊ぶ」とは、人間のプレーヤーとしてベストを尽くす(多くの人がばらばらに遊んでも究極的には同じになっていく=誰もが「これがベスト」と判断して選び取ってゆく=一種の共通認識のようなものを獲得するまで遊ぶ)ことであり、でたらめに遊ぶということでも、ただ時間をかけさえすればよいというものでもなく、じぶんのこだわりにこだわるのも適当とはいえない。アルゴリズムによって人間のプレーヤーの行動をうまく模擬できれば、シナリオの自動提案やプレーのガイド機能、採点機能や、好みが似ているプレーヤーの推薦などに応用できる。
なお、CV(コンピューター・ビジョン)のデモンストレーションとして往年のレトロゲームを『AI(人工知能)』にプレーさせるものとは意味が異なることに注意。ゲームのデータをただの素材として使うのでなく、ゲームそのものの改善や進化につながる手法の開発(※企画やプログラミングという意味のゲームソフトの開発の手前の段階の要素技術の開発)を目指すつもりで臨もう。
k-means(k平均法)は非常に応用の広い基本的なアルゴリズム。多変量解析やデータサイエンスの技法の1つとして習う人もいれば、画像の減色処理のアルゴリズムとして知る人もいる。ゲーム「A列車で行こう9」でも、k-meansを使ってみよう。
「平地」を抽出 | TSVファイル |
||
---|---|---|---|
「平地」を分割 (k-means法) |
|||
▲k=3(21+1) | ▲k=5(22+1) | ||
▲k=9(23+1) | ▲k=17(24+1) | ||
「k=17」を使う ことにする & クラスター3個を除外 |
▲グラフィックソフトで重ねる (数字の位置がずれた) |
▲この実験より前に(人手で) ゲーム内で引いた路線網 (との対応を見比べる) |
▲この実験より前に(人手で) このマップにつけた町名 (との対応を見比べる) |
▲k=9 |
プレーの「分解能」
「A列車で行こう9」では、駅の建設には平らな土地が必要になる(※高架駅にする場合も土地が平らである必要がある)ことから、マップをどのように使っていくか(どのような路線網にするか)を考えるときは、主に「平地」を見ることになる。(※ある程度の面積がまとまって平らであるなら、標高が0mより高い「高台」も考慮に入れる。)
このときに、マップ全体の「平地」をどのような細かさ(※「分解能」ともいう)で見るかということが、「府中のメソッド」(クラスタリング)でいう「クラスター数」である。ここでは「地形の自動生成」の使用を前提とし、この機能で地形仮生成を実行するときに「地形の複雑度」というパラメータを指定するので、そこに依拠してクラスターの数を決められないかと考えた。
※「分解能」:顕微鏡や衛星写真と、それに類する各種計測器でいう言いかた。どのくらい小さな物体まで識別できますという「能力」をいう。
「地形の複雑度」は整数で指定する。アルゴリズムの説明は省くが、折り紙を折る回数のような意味合いの数字である。このことは「地形の複雑度」に5~9のような大きな数字を指定したときに顕著にわかると思う。せいぜい1~3が実用域だろう。この「地形の複雑度」は、3次元の地形データを上から平面的に見ての縦と横(xとy)それぞれに効くものである。(※高さ方向(z)に効かせるものは「起伏の複雑度」という別のパラメータになっている。)「地形の複雑度」に「2」を指定したとき、それは縦と横で、それぞれ折り紙を1回折るということになる。折った折り紙を広げてみると、縦と横の折り目によって「マス目」ができている。「地形の複雑度」が「2」のとき、縦と横がそれぞれ折り目を境にして2つに分かれ、平面として見れば4つに分かれているということになる。「地形の複雑度」が「2」のときのいわば分解能(※いわば「画素数」)は「4」になる。「地形の複雑度」を「3」にしたときは2回折って4つに分かれ、縦と横がそれぞれ4つだから、全体は16個のマス目になる。「4」にしたときは、いくつになるだろうか。(※「地形の複雑度」が「1」のときは0回折るととらえた。)
ただ、これでは細かすぎるという感覚があるのも事実だ。ここでは「地形の複雑度」から着想を得たが「地形の複雑度」そのものにはこだわらず、なんかそんな感じの折り紙を折ってから広げてできるマス目のような数えかたで「クラスター数」を決めたいと思った。
A4の紙を封筒に入れるときの折り方がある。「地形の複雑度」の数え方で数えてしまうと、「3つに折る」という状態を飛ばして数えてしまうことになる。そういうところを考えているうちに、「クラスター数」を「21(にのいちじょう)」「22(にのにじょう)」「23(にのさんじょう)」「24(にのよんじょう)」というふうに飛び飛びに考え、その途中の数は考えないという方策が出てきた。それでもなお、これではマップ全体を方眼紙のように区切ることになって不自然である。(そんなことでよければ何も計算せず方眼の罫を引けばいいのであって「クラスタリング」の出番はない。)ならば「クラスター数」を奇数にすればいい。奇数にしさえすればいいので、それぞれに「+1」することにした。この「+1」が気持ちわるいという人もいるかもしれないが、その場合は「府中は特別」「府中以外を数える」という
絶対府中宣言「府中がセカイの中心(※当社比)」といったことを表現した数字だと思ってもらうとよい。人数を数えるときに自分を数え忘れる人がいます。
- k=4:3DS版・Switch版ではゲーム自体に「地名」とその区割りを扱う機能がある
- k=5:Switch版(色がすさまじい)
- k=6:3DS版の発想をA9に持ち込んで「地区」の区割りの線を自分で引いている例
- k=11:Switch版(色がすさまじい2:こういう勉強をしてきた人が作っているので「色がすさまじい」とは思っていないだろうが、どう見ても色がすさまじい・色彩を美大で学んだ専門家に(専門家の責任で)やってもらわないといけない=そうでない人がじぶんでやるのはだめだという認識が必要)
- k=16:3DS版での「地域設定」に区割りの機能があるが、あまり複雑なことはできない
- メーカーとしてはいわゆる「マジカルナンバー7」(ミラーの法則)を意識しているはず:UI設計の基本なのでみんな習います
- k=1(?):3DS版を未経験だとマップを区割りするという発想自体がない(いわば大ゾーン方式:もちろん大ゾーンにも利点はあります)
- PS2「A列車で行こう2001」では「ステージ選択」というかたちで「大きなマップ」から注目するエリアを選ばせてプレーさせていた:A9のマップ1個を、A2001で選ぶステージの1つのような狭さとは思わず、ステージが10個ある大きなマップだと思ったほうが楽しめるだろう
- 観光用などの地図に表示する注目地点(POI)の数は30程度が限度(昭文社)という人間の認知機能の限界からも「クラスター数」は「k=17」まで考えればじゅうぶん(※1つのクラスターに複数の駅を許す場合の数え方で)ということにしておく
- ゲームのマップ上で直線の区割りをするだけでは硬直的すぎる:「平地」の点群をクラスタリングしていろいろな形に区割りできるのが「府中のメソッド」…と言いたいが、均等に分けるだけなのでこれはこれで硬直的⇒行列の特異値分解を使う「新札幌バウム」にお進みください
- 区割りの線という発想にとらわれすぎてもいけない:リアルな区割りの線を描くことが目的ではなく、だいたいこのへんというクラスターの重心を使う方法である(重心から離れるほど属するクラスターが曖昧)⇒区割りの線をそれらしくしたいときはボロノイ図を
先人の肩にだっこにおんぶk-means(k平均法)をそのまま使うことに主眼を置く:k-meansの発想に素直に従う(k-meansではできないことを深追いしない)- 大昔のBASICで、画面の中央に何かを表示したいとき、表示したいものの大きさと画面の幅から、自分で座標を計算する必要があった(「プロパティ」から「中央揃え」を選ぶだけというものではなかった):ひたすら平均を計算しまくるk-meansを見ていてちょっと思い出した
「最近隣法」 「ウォード法」 「最小全域木」 を見比べる |
|||
---|---|---|---|
▲最近隣法 (single) |
▲ウォード法 (ward.D2) |
▲最小全域木 (spantree) |
▲最小全域木 (コマンドでプロットするのは… 挫折した!) |
▲ボロノイ図 (…に、裏写りする油性ペン) |
このページの方法を考えたときよりも後に考えた方法を、このページで使った地形データに遡及適用してみます。
▲「ベクトル円海山」 | ▲「新札幌バウム」 |
統計数理研究所のミラーサイトから「R」を入手しよう 統計数理研究所とは |
ARX六角ボルト(68448) All Rights Reserved. ©2018-2024, tht.