HyperStudyを利用した地球上の標高最高地点探索
この記事ではHyperStudyとPythonを連携して、地球上の標高最高地点の探索をする方法を記載します。
設計変数は緯度、経度として、目的関数は標高の最大化です。
標高を取得する関数をどうするか
標高の最大化をするためには、緯度、経度を引数としてその地点の標高が得られる関数を見つける必要があります。少し調べてみると、有償のサービスとしては、Google Elevation APIがあります。試すには有償のサービスは敷居が高いので、無償で使えるサービスを探してみると、Open-ElevationというAPIサービスがありました。こちらは寄付を募っていますが、無償での利用も可能なものでした。使い方については、こちらに記載があります通り、URLの特定の箇所に、緯度、経度を入力してアクセスすると、標高のデータがJSON形式で返答されるというものです。
このAPIをHyperStudyから利用できれば最適化探索をすることができます。そこで、pythonで、APIへアクセスする関数を記述しそのpythonスクリプトをPreference Fileに登録することで、HyperStudyで関数として呼び出せるようにします。これにより、HyperStudyでOpen-ElevationのAPIの利用が可能になります。この方法では登録されたpythonスクリプトがHyperStudyから関数として呼び出すことができますので、ほかにもいろいろな使い道がありそうです。
Pythonスクリプトの説明
標高を取得するためのpythonスクリプトの簡単な解説を記載します。
#APIでのやり取りで利用するrequestsモジュールと結果を処理するjsonモジュールを利用します。 import requests import json #関数を定義します。ここでは、緯度経度を指定すると、returnで標高が返ってくるように記載をしています。 def getElev(lat,lon): response = requests.get(f'https://api.open-elevation.com/api/v1/lookup?locations={lat:.6f},{lon:.6f}').json() return response['results'][0]['elevation']
Preference Fileへの記載
Preference Fileを下記のように記載します。
*BeginDefaults()
*BeginPlotDefaults()
*RegisterPythonFunction("getElev","./python_f.py",2)
*EndPlotDefaults()
*EndDefaults()
HyperStudyでのPreferences File利用の設定
Preferences Fileを使用するにチェック
Preferences Fileの設定
Preferences Fileの設定で、先に作成したPreferences Fileを選択します。
これにより、地球の標高の探索を実施できる環境が整いました。
HyperStudyでstudyを作成
モデル定義
Internal Mathを選択
入力変数の定義
緯度経度をそれぞれ望む範囲で指定。初期値も設定。今回の例では全球を範囲として、初期値を三島市役所近辺にしました。
出力応答の定義
下図のようにpythonで定義し、登録した関数を利用します。
結果
本件ではARSM, GRSM, GAの最適化アルゴリズムを試してみました。地球上の標高最高地点の探索結果は下記のようになりました。
アルゴリズム | 緯度(度) | 経度(度) | 標高(m) | 計算時間 |
ARSM | 32.803843 | 88.683524 | 5131 | 31秒 |
GRSM | 32.271017 | 85.406759 | 5353 | 1分10秒 |
GA | 34.344347 | 85.840275 | 6440 | 53分 |
google earthで確認すると下図のように、どのアルゴリズムでもデフォルト設定ではチベット高原までは近づくことができますが、ヒマラヤ山脈にまでたどり着くことはできませんでした。また、時間はかかりますが、GAは他のアルゴリズムよりも1000m以上標高の高い箇所を見つけることができました。
パラメータを変更することで結果がどのように変わるかというのも試してみると面白いかもしれません。こちらに→HyperStudyのアーカイブファイルのダウンロードリンクを記載してますので、ご興味のある方はお試しいただくことが可能です。