RubyでA*アルゴリズムを作りたいと思っています。
(下はasmさんの書いたコードにちょっと付け足しました。asmさんすみません...)
Ruby
1@water = [[2,4], [2,5]] 2class PriorityQueue 3 def initialize 4 @hash = Hash.new{|h,k| h[k] = [] } 5 end 6 def push(val, priority) 7 @hash[priority].push val 8 end 9 def min_key 10 @hash.select{|k,v| v.size != 0}.map(&:first).min 11 end 12 def pop 13 @hash[min_key].pop 14 end 15 def empty? 16 @hash.values.all?(&:empty?) 17 end 18end 19def distance(start, goal) 20 (start[0]-goal[0]).abs + (start[1]-goal[1]).abs 21end 22def a_star(start, goal, except) 23 directions = [[0,1],[0,-1],[1,0],[-1,0]] 24 que = PriorityQueue.new 25 que.push([start,[]], distance(start, goal)) 26 close = Set.new(start) 27 until que.empty? 28 now, route = que.pop 29 next_route = route + [now] 30 #付け足した部分 31 if @water.include?(now) 32 dist = next_route.size + 1 33 else 34 dist = next_route.size 35 end 36 return next_route if now == goal 37 dirs = directions.map{|dx,dy| [now[0] + dx, now[1] + dy] } 38 .select{|pos| !except.include?(pos) && close.add?(pos) } 39 dirs.each do |to| 40 que.push([to,next_route], dist + distance(to, goal)) 41 end 42 end 43end 44except = [[3,4], [1,2], [3,6]] 45p a_star([1,1], [3,5], except)
自分は初心者ですが自分なりに if @water.include?(now) のところを考えてみたんですがどのように書けばいいのか分かりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/06 08:25