マンハッタン距離が最小の座標を表示する際、気を付けるポイントは、
座標は一つとは限らないこと、効率のいい探索方法を知りたいです。
前提
4行5列からなる配列arrがあり(下記参照)、スタート地点は[2,3]の座標とした時、
[[1, 0], [1, 2], [1, 3], [2, 2], [2, 3], [2, 4], [3, 2],[3, 3], [3,4]]のリストの中に含まれていない座標で、
最短の座標を複数表示したい。
下記の配列の場合なら、 [0, 3]、[1, 4]、 [2, 1]がともに距離が2のため、表示したいです。
arr = np.array([[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4]], [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4]], [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4]], [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4]]]) # 対象となる座標を設定 target = [2, 3] # マンハッタン距離で一番近い座標を求める min_distance = float("inf") closest_point = None for i in range(4): for j in range(5): point = arr[i, j]#探索先のポイント これでは全探索? distance = abs(target[0] - point[0]) + abs(target[1] - point[1]) if distance < min_distance: if list(point) not in [[1, 0], [1, 2], [1, 3], [2, 2], [2, 3], [2, 4], [3, 2],[3, 3], [3,4]]: min_distance = distance closest_point = point # 結果を表示 print(closest_point)
試したこと
ただこれだと、複数個存在する場合に表示されないこと、そして左上から探索をかけるのが非効率だと思います。
そこでスタート地点[2,3]から上下左右に進み、隣マスも探索する方法があるのではと思ったのですが、
try exceptを使ったとしても、どのように書けばいいかわかりません。
chatGPTで調べてみたところ、ヒューステリック探索のうちの一つ、A*アルゴリズムですみたいなことが書いてあったのですが、これで検索をかけても、迷路の問題しか出てこず、もし便利な関数があったとしたらそちらも教えてほしいです。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー