RubyでA*アルゴリズムを使って最短経路を求めたい
RubyでA*アルゴリズムを書いているのですが、ゴールからの距離を求めるときに壁も通るようになってしまいます。
発生している問題・エラーメッセージ
関数「distance」の定義の仕方のせいで壁(通らない座標)を通る場合の距離になってしまいます...
result
1:kaku_route 2[[1, 13], [1, 12], [1, 11], [1, 10], [2, 10], [2, 11], [3, 11], [4, 11], [4, 10]]
**最短経路が求まりません...
該当のソースコード
Ruby
1 2def distance(point1, point2) 3 return (point1[0] - point2[0]).abs + (point1[1] - point2[1]).abs 4end 5def dijkstra(s,g,e) 6 p_all_v = [] 7 d_hash = {} 8 before = [] 9 best_east = [] 10 best_west = [] 11 best_north = [] 12 best_south = [] 13 best_point = [] 14 directions = [] 15 kaku_route = [] 16 best_history = [] 17 test_route = [] 18 player_east = [s[0]+1,s[1]] 19 if !(e.include?(player_east)) 20 directions.push(player_east) 21 end 22 player_west = [s[0]-1,s[1]] 23 if !(e.include?(player_west)) 24 directions.push(player_west) 25 end 26 player_north = [s[0],s[1]-1] 27 if !(e.include?(player_north)) 28 directions.push(player_north) 29 end 30 player_south = [s[0],s[1]+1] 31 if !(e.include?(player_south)) 32 directions.push(player_south) 33 end 34 directions.each do |d| 35 p_distance = distance(s, d) 36 d_distance = distance(g, d) 37 before.push(p_distance + d_distance) 38 #後から最小のコストの座標を求めた時に座標を取り出さなければならないため、ハッシュで代入しておく 39 d_hash[d] = before[-1] 40 end 41 before.sort! 42 best = before[0] 43 best_point = d_hash.invert[best] 44 best_history.push(best_point) 45 kaku_route.push(best_point) 46 before = [] 47 d_hash = {} 48 directions = [] 49 #目的地を見つけるまで繰り返す 50 until (best_point == g) 51 best_east = [best_point[0]+1, best_point[1]] 52 if !(e.include?(best_east)) && !(best_east == s) && !(best_history.include?(best_east)) 53 directions.push(best_east) 54 end 55 best_west = [best_point[0]-1, best_point[1]] 56 if !(e.include?(best_west)) && !(best_west == s) && !(best_history.include?(best_west)) 57 directions.push(best_west) 58 end 59 best_north = [best_point[0], best_point[1]-1] 60 if !(e.include?(best_north)) && !(best_north == s) && !(best_history.include?(best_north)) 61 directions.push(best_north) 62 end 63 best_south =[best_point[0], best_point[1]+1] 64 if !(e.include?(best_south)) && !(best_south == s) && !(best_history.include?(best_south)) 65 directions.push(best_south) 66 end 67 directions.each do |d| 68 test_route = kaku_route 69 test_route.push(d) 70 p_distance = test_route.length 71 d_distance = distance(g, d) 72 before.push(p_distance + d_distance) 73 #後から最小のコストの座標を求めた時に座標を取り出さなければならないため、ハッシュで代入しておく 74 d_hash[d] = before[-1] 75 test_route.delete(d) 76 end 77 #昇順にソートする 78 before.sort! 79 #最小のコストのものを選ぶ 80 best = before[0] 81 #最小コストの座標 82 best_point = d_hash.invert[best] 83 best_history.push(best_point) 84 #最小のコストの座標を毎回配列に挿入する 85 kaku_route.push(best_point) 86 87 before = [] 88 directions = [] 89 d_hash = {} 90 end 91 kaku_route.unshift(s) 92 p :kaku_route,kaku_route 93end 94 95#通らない座標 96except = [[3,10],[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13], [0,14], [1,0],[2,0],[3,0],[4,0],[0,4],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0], [14,0]] 97dijkstra([1,13],[4,10],except)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/02 00:39
2020/03/02 06:09 編集
2020/03/02 10:01
2020/03/02 23:19
2020/03/02 23:46
2020/03/20 13:11 編集
2020/03/20 09:03
2020/03/20 13:12 編集
2020/03/20 14:26 編集
2020/03/20 22:06 編集
2020/03/21 07:12
2020/03/22 01:18 編集
2021/01/05 08:21 編集