Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从散列中生成路径?_Ruby On Rails_Ruby_Hash_Ruby On Rails 3.2_Hashmap - Fatal编程技术网

Ruby on rails 如何从散列中生成路径?

Ruby on rails 如何从散列中生成路径?,ruby-on-rails,ruby,hash,ruby-on-rails-3.2,hashmap,Ruby On Rails,Ruby,Hash,Ruby On Rails 3.2,Hashmap,我试图定位地图最短路径的路径(具有权重/距离的连接节点) 假设我有一个如下的散列: {"A"=>{"B"=>1, "E"=>1}, "B"=>{"A"=>1, "C"=>1, "F"=>1}, "C"=>{"B"=>1, "D"=>1, "G"=>1}, "D"=>{"C"=>1, "H"=>1}, "E"=>{"F"=>1, "A"=>1, "I"=>1}, "F"=>{"E"=&

我试图定位地图最短路径的路径(具有权重/距离的连接节点)

假设我有一个如下的散列:

{"A"=>{"B"=>1, "E"=>1}, "B"=>{"A"=>1, "C"=>1, "F"=>1}, "C"=>{"B"=>1, "D"=>1, "G"=>1}, "D"=>{"C"=>1, "H"=>1}, "E"=>{"F"=>1, "A"=>1, "I"=>1}, "F"=>{"E"=>1, "G"=>1, "B"=>1, "J"=>1}, "G"=>{"F"=>1, "H"=>1, "C"=>1, "K"=>1}, "H"=>{"G"=>1, "D"=>1, "L"=>1}, "I"=>{"J"=>1, "E"=>1, "M"=>1}, "J"=>{"I"=>1, "K"=>1, "F"=>1, "N"=>1}, "K"=>{"J"=>1, "L"=>1, "G"=>1, "O"=>1}, "L"=>{"K"=>1, "H"=>1, "P"=>1}, "M"=>{"N"=>1, "I"=>1}, "N"=>{"M"=>1, "O"=>1, "J"=>1}, "O"=>{"N"=>1, "P"=>1, "K"=>1}, "P"=>{"O"=>1, "L"=>1}} 
现在我想遍历并从这个散列中创建一个路径。例如:

从源A到目标:L

输出应该是:或者
A->E->I->J->K->L
或者
A->B->C->D->H->L

以下是我编写的函数:

def find_path(src, dst, init = [])
  path = [src]
  neighbors = self.neighbors(src)
  puts "src: #{src}"
  puts "dst: #{dst}"
  # puts "node: #{node}"
  puts "init: #{init}"
  puts "path: #{path}"
  puts "----\n"

  if neighbors.include?(dst)
    path.push(dst)
  else
    path.push(@nodes[src].keys.map{|k| k unless init.flatten.include? k }.reject(&:blank?).each{|key| self.find_path(key, dst, init << path) } )
  end
  return path
end
def find_path(src、dst、init=[])
路径=[src]
邻居=自我邻居(src)
放置“src:#{src}”
放置“dst:#{dst}”
#放置“节点:#{node}”
放入“init:#{init}”
放置“路径:#{path}”
放置“---\n”
如果是邻居。包括?(dst)
路径推送(dst)
其他的
path.push(@nodes[src].keys.map{k}k,除非init.flant.include?k}.reject(&:blank?).each{key | self.find_path(key,dst,init原始散列:

h = {"A"=>{"B"=>1, "E"=>1}, "B"=>{"A"=>1, "C"=>1, "F"=>1}, "C"=>{"B"=>1, "D"=>1, "G"=>1}, "D"=>{"C"=>1, "H"=>1}, "E"=>{"F"=>1, "A"=>1, "I"=>1}, "F"=>{"E"=>1, "G"=>1, "B"=>1, "J"=>1}, "G"=>{"F"=>1, "H"=>1, "C"=>1, "K"=>1}, "H"=>{"G"=>1, "D"=>1, "L"=>1}, "I"=>{"J"=>1, "E"=>1, "M"=>1}, "J"=>{"I"=>1, "K"=>1, "F"=>1, "N"=>1}, "K"=>{"J"=>1, "L"=>1, "G"=>1, "O"=>1}, "L"=>{"K"=>1, "H"=>1, "P"=>1}, "M"=>{"N"=>1, "I"=>1}, "N"=>{"M"=>1, "O"=>1, "J"=>1}, "O"=>{"N"=>1, "P"=>1, "K"=>1}, "P"=>{"O"=>1, "L"=>1}} 
转换原始哈希,因为其格式很糟糕:

h.keys.each{|k| h[k] = h[k].keys}
h.default = []
方法:

def find_path h, src, dst
  paths = [[src]]
  loop do
    paths = paths.flat_map do |path|
      h[path.last].map do |nekst|
        a = [*path, nekst]
        a.last == dst ? (return a) : a
      end
    end
  end
end
试一试:

find_path(h, "A", "L")
# => ["A", "B", "C", "D", "H", "L"]

请注意,如果没有解决方案,则循环可能会永远运行。您可能希望通过对长度添加限制来限制循环。

请解释一下您的算法,好吗?您能解释一下如何得到所需的答案吗?散列的用途是什么?以及这些数字的含义是什么(如果所有数字都是1,那么它们的含义是什么)?数字对我所寻找的答案没有任何意义。它们是两个节点之间的距离/权重。我想穿过连接这些节点的路径。下面的答案正是我所寻找的答案。我将在一小时内更新问题,并参考包含所有细节的gist。谢谢您的时间。:)我会尝试一下并更新这个问题。关于散列中的数字是什么意思,算法是什么,等等。谢谢你的时间。+1“转换原始散列,因为它的格式很糟糕:”