こんばんは。
今回は、ブラックボックスとなりがちな輸送時間についての定量的な計算方法を解説します。
0. 輸送時間の仕組み(結論)
結論から申し上げると、輸送時間は、下記の計算式によって導けることがわかりました。
(輸送時間[min]) =(0.15×(マンハッタン距離)^2+50)/(輸送速度[%])…①
とはいえ、初見では何のことかさっぱりわからないかと存じますので、順を追って説明していきます。
1. 輸送速度
まず、輸送についてです。
基本的な輸送速度については、表 1に示したのでご参照ください。
優待状態の場合は、店舗形態、レベルにかかわらず輸送速度が50%加算される仕様になっております。
例えば、運送屋(輸送特化),レベル9,優待ありですと、
150%+50%=200%
が輸送速度となります。
表 1店舗ごとの輸送速度[%]一覧
ちなみに、
輸送特化: 運び屋、便利屋、運送屋
輸送特化以外: その他基本店舗、ファクトリー
と分類しています。
2. マンハッタン距離
続いては、距離について説明していきます。
自分の座標が(x1,y1), 相手の座標が(x2,y2)だとしましょう。
距離といえば、通常はユークリッド距離
d=√((x2-x1)^2+(y2-y1)^2)
がおなじみです。私も始めはこの距離を前提に計算していたのですが、輸送時間との関係性を導くことはできませんでした。
その後、有志の方の検証により、近距離の店舗との輸送時間の関係が明らかになりました。
その結果、SO2で使われている距離は、ユークリッド距離ではなくマンハッタン距離に従うことがわかりました。
マンハッタン距離とは、
d=|x2-x1|+|y2-y1|
であらわされます(||は絶対値)。
これは、x方向もしくはy方向どちらかに1マスずつ動く(斜め横断はできない)と考えたとき、最短距離で相手座標にたどり着く条件となります。
マンハッタンという都市が京都と同様に碁盤目状になっているようで、タクシーの移動距離などの計算に使われているようですね。
SO2でも、妖精さんは斜め横断ができないようです。
(余談)
採取範囲については、
屋外作業に関する考察 ①
で述べられておりますが、これはxの距離差とyの距離差のうち大きいほうを距離とする、というチェビシェフ距離を用いています。
d=max(|x2-x1|,|y2-y1|)
(進んだ問題)
店舗競合範囲に用いられる距離は、マンハッタン距離なのか、チェビシェフ距離なのかは気になるところですね。
輸送妖精→マンハッタン距離
作業妖精→チェビシェフ距離
販売妖精→?
3. 一般的な座標定義
さて、次に座標について説明します。
まず、自分の位置を把握しましょう。これはお店情報やステータスから確認できます。
上のように、街名(x,y)といった形で位置が表記されています。後ろの(x,y)というのが、街の中での座標を表しているのですが、図1の全体マップをご覧いただけるとわかりますように、それぞれの街にも原点座標が存在します。赤い枠のエリアが各街の場所になります。ここから原点の座標を導きだすことは困難ですが、実は公開されているAPIの街定義にて正確な値を知ることができます(マップのピクセルに対応しているらしいです)。
https://so2-docs.mutoys.com/common/api.html
この値を転記したものを表 2に示します。
私の例ですと、ルビー街(31,47)なので、全体の座標はこれにルビー街の原点座標(430,440)を足したものになります。すなわち、
(全体座標)=(31+430,47+440)= (461,487)
です。このような形で相手の座標も計算することができます。
図 1 MUTOYS島全体マップ
表 2 各街の原点座標
4. 輸送時間計算
それでは、0章で述べた①式について解説していきます。
(i)自店舗の輸送時間
まず、自店舗の輸送時間について考えていきましょう。
この場合、自店舗も相手店舗も同じ座標になるため、マンハッタン距離d=0となります。
これを①式に代入すると、
輸送時間[min]=50/(輸送速度[%])
となります。この結果から最短輸送時間は、輸送速度にのみ依存するということがわかります。
例として、輸送特化でない場合、
非優待では50/100=0.5分=30秒
同様に、優待状態では20秒となります。。
次に、お相手の座標をいくつか例にだして計算してみましょう。
(ii)同街での輸送時間計算
まず簡単のため、同じ街の方から計算してみましょう。
自分:ルビー街(31,47)
相手:ルビー街(10,8)
まず、マンハッタン距離は、同じ街同士なので、ローカル座標のみの差を見ればよく、
d=|31-10|+|47-8|= 60
となります。
また、私はマーケットレベル10なので、輸送速度は表1より、166%です。
この結果を0章で述べた式に代入すると、
輸送時間=(0.15*60^2×1.5+50)/166=3.554(min)
となります。余りの部分は切り捨てで表示されるため、表示時間は”3分”となります。
上の画像と一致しましたね。
(iii)街間での輸送時間計算
続いて、街間での輸送時間を計算しましょう。
今回は、全体の座標に直して計算します。
自分:ルビー街(31,47) =(31+430,47+440)= (461,487)
相手:レッド街(39,9)= (39+280,9+120)=(319,129)
よって、マンハッタン距離は、
d=|461-319|+|487-129|=142+358=500
輸送速度は(i)同じく166%なので、
輸送時間=(0.15*500^2+50)/166=226.2(min)
となります。
実際の値が3時間46分なので、こちらも一致することがわかります。
全体の座標を定義することで、マンハッタン距離を一般的に求め、①式を適用できることが明らかとなりました。
この結論を見ると衝撃的かもしれませんが、実は道は輸送時間に関係ないという結果となりました。道の役割は①集客能力 ②輸送時間短縮 の2つが可能性として挙げられておりましたが、この結果から②の輸送時間に関しては否定的となりました。
住民関連の検証は困難なため、道の効果については謎が深まるばかりですね。
(余談というか素朴な疑問ですが、輸送時間の算出に距離を2乗するのはなんででしょうかね。
昔私が考えたときは、妖精が距離の概念を持たないため、魔方陣のようなものを二次元的に広げていって、目的値の距離にたどり着くまで伸ばす、という仮説を立てていましたが、矛盾だらけでした。妥当な説明を思いついた方はコメントいただけるとうれしいです。)
5. 輸送時間計算シート
さて、前章ではめんどくさい計算をしてきましたが、これを踏まえた輸送時間計算シートを作成いたしました。
https://docs.google.com/spreadsheets/d/1YR8jQ5cdKrxFWR-30YSpotwgtAnSM2z-HP51PZQuHF8/edit#gid=801343269
(改装ループ研究所の組合スプシになっているため、ほかのシートがいろいろあります。“輸送時間計算シート”のタブからご使用ください。)
・使い方
① 上の段:プルダウンリストから、店舗形態、レベル、優待の有無を選択します。
② 自分の街をプルダウンで選択、店舗情報の(x座標,y座標)を入力
相手の座標も同様に入力する
③ 黄色のマーカーに結果が表示される
輸送経験値を稼ぎたい方などは、輸送時間の計算も重要な要素となるかと存じます。
本シートを活用していて引っ越しの一助となればうれしい限りです。
権限などは設定しておりませんので、ご気軽にお使いください。
もちろん、バグなどの恐れはありますので、もし不具合等ありましたら私にご連絡いただければ幸いです。
※181204 追記
輸送時間計算シートに秒数表示を追加しました。
近くの店舗との時間計算にもご利用いただけます。
分表示を同じく、小数点以下は切り捨てで表示しています。
※190428 追記
オパール街を追加しました。
超長距離の輸送時間計算をお楽しみください。
最後に
本記事はtwitterで有志の検証がおこなわれ、導かれた結論です。大分前に検証されてから埋もれてしまったため、形として残すために取り急ぎ記事としました。検証いただいた方には厚く感謝御礼申し上げます。
2018.11.06追記
この記事を投稿して1日経過し、赤街の方からフィードバックをいただきました。
ご指摘いただいたアドバイスを参考に修正したところ、前回投稿の時に問題として残った誤差をなくすことに成功しました。
この場で厚く感謝申し上げるとともに、記事を修正したことを報告します。
コメント
コメントにはログインが必要です