7

これは学校のプロジェクト用です。私は膨大な量の問題に直面しており、理解できる解決策が見つからないようです。

   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) からの最短パスを見つけたい場合は、新しい行に移動して、行の隣接するパス

この例でダイクストラのアルゴリズムを実装するのを手伝ってくれる人はいますか? 本当にありがたいです。(私は配列が一番好きなようですが、マップとセットは少し混乱しますが、リストは扱いやすいですが、この時点であらゆる種類の解決策を検討したいと思っています)

[少なくとも、ネットから情報源を盗んでいるだけではありません。本当はこういうことを学びたいのですが… なかなか難しいです(>.<)]

あ、始点がAで終点がZ


ほとんどの人と同じように、アルゴリズムの概念が難しいとは思いません。コーディングを正しく行う方法がわかるだけです...助けてください。

サンプル コード -- 友人がこれを大いに助けてくれました (ただし、従うのが難しいと思われるデータ構造でいっぱいですが)、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)));
    }
}
4

2 に答える 2

9

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);
于 2009-06-01T07:59:23.457 に答える
0

Dijikstra のこの行列表現にまだ興味を持っている人がいるかどうかはわかりませんが、私は Actionscript で Dijikstra をコーディングすることを考えていたので、最初に Dijuikstra がどのように機能するかを独学しなければなりませんでした。それを行って、それをコーディングしようとしたときに、昨夜だけ、この投稿の上にあるようなマトリックスでノードとそこの距離を表すことができることに気付きました。私の理論では、最短経路を見つけることは非常に簡単なことです。私はまだ正しいことを確認するために実験中です。

マトリックスで。

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

行 "a" を見て (これが開始点であるため)、行の中で最小の 2 (b の下) の数字を選びます。そのため、パスを「a - b」と書き、コストは 2 にします。次に、b 行に移動し、b の右側にある最小の数を再度見つけます (既に b ノードにいるためです。これにより、2 下が得られます)。したがって、パスは「a - b - e」となり、合計コストは 4. i 次に、「e」行を見て、ルールは「e」列の後に表示される最小の数字を見つける必要があります。これにより、「z」が得られ、フル パスが「a - b - e - z」となり、合計コストが 8 になります。しかし、昨夜これを理解したばかりであることを思い出してください。 「e」行の別の可能性は、コスト 1 で d 列に移動することです。

したがって、これは、あなたが正しく言ったように、パスが「a - b - e - d -z」で、合計コストが 7 のより良いソリューションです。

これを Actionscript でコーディングする必要がありますが、Actionscript でコーディングするのは非常に簡単だと思います。残念ながら、私は Java の経験がありませんが、私の方法に同意するなら、Java でのコーディングは簡単なはずです。

ポール

于 2010-07-26T13:27:20.847 に答える