Die values berechnen sich aus den costs, nicht aus den values.
Code:
costs = current_node.cost + node.speed_factor
value = costs + distance * MINIMAL_SPEED_FACTOR
Wichtig auch: Ob der Knoten bereits besucht wurde, musst du schon testen. Sonst guckst du dir hinterher einen benachbarten Knoten an und fügst den Knoten doppelt in die open_list ein. Was nicht passieren kann ist, dass ein Knoten sowohl offen als auch teurer ist als der aktuelle Knoten. (Im Prinzip kannst du das also auch so abändern, dass du das Attribut OPEN ganz weglässt und durch cost == 0 ersetzt).

Code:
# Annahme: Kosten von noch nicht besuchten Knoten sind immer 0!!!
if node.costs == 0
  node.cost = current_node.cost + node.speed_factor
  node.value = node.cost + distance * MINIMAL_SPEED_FACTOR
  node.predecessor = current_node
  open_nodes.push(node)
end