2009-06-01 3 views
6

Это для школьного проекта; Я сталкиваюсь с огромными проблемами, и я не могу найти понятного решения.Алгоритм Dijkstra для 2D-массива в Java

a b c d e z 
a - 2 3 - - - 
b 2 - - 5 2 - 
c 3 - - - 5 - 
d - 5 - - 1 2 
e - 2 5 1 - 4 
z - - - 2 4 - 

Это двухмерный массив. Поэтому, если вы хотите найти кратчайший путь, его из a, b, e, d, z = 7 и (a, b) = (b, a) - он приведет вас к новой строке для смежного соседнего ряда пути

Есть ли кто-нибудь, кто может помочь мне реализовать алгоритм Дейкстры для этого примера? Я бы очень признателен. (Кажется, мне нравятся массивы, карты и наборы немного путают меня, списки управляемы - хотя я готов заглянуть в любое решение на данный момент)

[По крайней мере, я не просто срываю источник из сети. Я на самом деле хочу узнать эти вещи ... Это просто очень трудно (>. <)]

О, начать точка А и конечная точка Z


Как и большинство людей, я не нахожу концепция алгоритма сложная - я просто вижу, чтобы получить право кодирования ... Помогите пожалуйста?

Пример кода - мне очень помог друг с другом (хотя он заполнен структурами данных, которые мне кажутся трудными) Я также попытался адаптировать код C++ из dreamincode.net/forums/blog/martyr2/ index.php? showentry = 578 в Java, но это не так хорошо ...

import java.util.*; 

public class Pathy{ 

    private static class pathyNode{ 
     public final String name; 
     public Map<pathyNode, Integer> adjacentNodes; 

     public pathyNode(String n){ 
      name = n; 
      adjacentNodes = new HashMap<pathyNode, Integer>(); 
     } 

    } 

    //instance variables 

    //constructors 

    //accessors 

    //methods 
    public static ArrayList<pathyNode> convert(int[][] inMatrix){ 
     ArrayList<pathyNode> nodeList = new ArrayList<pathyNode>(); 
     for(int i = 0; i < inMatrix.length; i++){ 
      nodeList.add(new pathyNode("" + i)); 
     } 
     for(int i = 0; i < inMatrix.length; i++){ 
      for(int j = 0; j < inMatrix[i].length; j++){ 
       if(inMatrix[i][j] != -1){ 
        nodeList.get(i).adjacentNodes.put(nodeList.get(j), 
          new Integer(inMatrix[i][j])); 
       } 
      } 
     } 
     return nodeList; 
    } 

    public static Map<pathyNode, Integer> Dijkstra(ArrayList<pathyNode> inGraph){ 
     Set<pathyNode> visited = new HashSet<pathyNode>(); 
     visited.add(inGraph.get(0)); 
     pathyNode source = inGraph.get(0); 
     Map answer = new TreeMap<pathyNode, Integer>(); 
     for(pathyNode node : inGraph){ 
      dijkstraHelper(visited, 0, source, node); 
      answer.put(node, dijkstraHelper(visited, 0, source, node)); 
     } 
     return answer; 
    } 

    private static int dijkstraHelper(Set<pathyNode> visited, int sum, pathyNode start, pathyNode destination){ 
     Map<pathyNode, Integer> adjacent = new HashMap<pathyNode, Integer>(); 

     for(pathyNode n : visited){ 
      for(pathyNode m: n.adjacentNodes.keySet()){ 
       if(adjacent.containsKey(m)){ 
        Integer temp = n.adjacentNodes.get(m); 
        if(temp < adjacent.get(m)){ 
         adjacent.put(m, temp); 
        } 
       } 
       else{ 
        adjacent.put(m, n.adjacentNodes.get(m)); 
       } 
      } 
     } 

     Map<pathyNode, Integer> adjacent2 = new HashMap<pathyNode, Integer>(); 
     Set<pathyNode> tempSet = adjacent.keySet(); 
     tempSet.removeAll(visited); 
     for(pathyNode n: tempSet){ 
      adjacent2.put(n, adjacent.get(n)); 
     } 
     adjacent = adjacent2; 
     Integer min = new Integer(java.lang.Integer.MAX_VALUE); 
     pathyNode minNode = null; 

     for(pathyNode n: adjacent.keySet()){ 
      Integer temp = adjacent.get(n); 
      if(temp < min){ 
       min = temp; 
       minNode = n; 
      } 
     } 
     visited.add(minNode); 
     sum += min.intValue(); 
     sum = dijkstraHelper(visited, sum, start, destination); 
     return sum; 
    } 

    //main 
    public static void main(String[] args){ 

     int[][] input = new int[][] { {-1, 2, 3, -1, -1, -1}, 
          {2, -1, -1, 5, 2, -1}, 
          {3, -1, -1, -1, 5, -1}, 
          {-1, 5, -1, -1, 1, 2}, 
          {-1, 2, 5, 1, -1, 4}, 
          {-1, -1, -1, 2, 4, -1}, 
         }; 
         //-1 represents an non-existant path 

     System.out.println(Dijkstra(convert(input))); 
    } 
} 

ответ

8

представления, что вы звоните 2D массива, является матрицей смежности представление графа и проблемы вы пытаясь решить, является примером проблемы с одним источником коротких путей. Алгоритм Дейкстры предназначен для решения этой проблемы. Это может быть полезно http://renaud.waldura.com/doc/java/dijkstra/. Загрузите код с сайта и прочитайте документацию. ред писать код, похожий на следующий

RoutesMap map = map = new DenseRoutesMap(5); 
    map.addDirectRoute(City.A, City.B, 2); 
    map.addDirectRoute(City.A, City.C, 3); 
    map.addDirectRoute(City.B, City.A, 2); 
    map.addDirectRoute(City.B, City.D, 5); 
    map.addDirectRoute(City.B, City.D, 2); 
    ... 
    DijkstraEngine engine = new DijkstraEngine(map); 
    int distance = engine.getShortestDistance(City.F); 
+0

К сожалению, этот сайт мне не очень помогает. Он не касается 2D-массивов, как мне это нужно ... Есть ли у кого-нибудь еще решение/предложение? – Stan

+0

Я обновил свой ответ и добавил образец кода. – Babar

+0

@Babar: Хороший способ подталкивать его в правильном направлении, не проливая все бобы. +1 –

0

не знаю, если кто-то еще заинтересован в этом матричном представлении Dijikstra, но я думал о кодировании Dijikstra в Actionscript и поэтому сначала пришлось учить себя, как Dijuikstra работал. Сделав это и пытаясь закодировать его, я понял только вчера вечером, что могу представить узлы и там расстояния в матрице, такие как у вас на вершине этой записи. Моя теория заключается в том, что поиск кратчайшего пути будет очень простым. Я все еще экспериментирую, чтобы исправить ситуацию.

В матрице;

abcdez а - 2 3 - - - б 2 - - 5 2 - C 3 - - - 5 - г - 5 - - 1 2 е - 2 5 1 - 4 г - - - 2 4 -

Я начинаю смотреть на строку «a» (так как это начальная точка) и выбираем наименьшее число в строке, равное 2 (под б). Поэтому я пишу путь как «a-b» по цене 2. Затем я перехожу к строке b и снова нахожу наименьшее число в ПРАВИЛЬНОМ b (так как мы уже на узле b. Это дает мне 2 «e». Таким образом, путь теперь «a-b-e» при общей стоимости 4. i Затем посмотрите на строку «e», и в правиле должно быть найдено наименьшее число, появляющееся после столбца «e». Это даст мне «z» и даст полный путь как «a-b-e-z» и общую стоимость 8. Однако, помните, я только что понял это вчера вечером, методология должна признать, что, глядя на строка «e» - это еще одна возможность - перейти в столбец d по цене 1.Затем посмотрите на строку d для наименьшего числа после строки d, которая даст мне строку «z» по цене 2.

Следовательно, это лучшее решение, когда путь «a - b - e - d -z "при общей стоимости 7, как вы правильно сказали.

OK Мне все еще нужно закодировать это в ActionScript, но мое чувство кишки состоит в том, что в ActionScript будет очень легко закодировать код. Боюсь, что у меня нет опыта на Java, но если вы согласны с моим методом, его нужно легко закодировать на Java.

Paul