manos256 Δημοσ. 9 Ιουνίου 2015 Δημοσ. 9 Ιουνίου 2015 Καλημερα εχω το εξης προβλημα...Θελω να υλοποιησω τους αλγοριθμους dijkstra και bellman-ford αλλα για γραφους η οποιοι ειναι ηδη προκαθορισμενοι σε αρχεια txt για διαφορα πληθη κομβων...Το καθε txt δηλαδη δινει στοιχεια για το γραφο...Πιο συγκεκριμενα στη πρωτη γραμμη ο πρωτος αριθμος ειναι το πληθος των κομβων και ο δευτερος οι ακμές...Οι υπολοιπες γραμμες ειναι οσες οι ακμες και σου λενε αρχη και τελος καθε ακμης και το αντιστοιχο βαρος ...Στη τελευταια γραμμη σου λεει απο που θελω να ξεκινησω και που να φτασω...Το θεμα μου ειναι οτι εχω καταφερει να διαβασω το txt και να αποθηκευσω σε μεταβλητες το πληθος κομβων και ακμων, αρχη και τελος που θελω να φτασω και σε πινακα τα στοιχεια για καθε ακμη,αλλα αυτα τα δεδομενα δεν εχω την εμπειρια να τροποποιησω τους κωδικες που εχω βρει για να δουλευουν με αυτα τα στοιχεια... net10.txt
mad-proffessor Δημοσ. 9 Ιουνίου 2015 Δημοσ. 9 Ιουνίου 2015 Αφου διαβάσεις το αρχείο γραμμη προς γραμμή βάλε τα σε δυσδιάστατο πίνακα στη πρωτη διάσταση το κόμβο και στη δεύτερη σε κάθε κόμβο ένα στοιχείο το arc και ένα άλλο το cost?(βάρος). Για το input θα διατρέχεις το πίνακα σε μια επανάληψη τους κόμβους και σε άλλη απο κάτω το arc,cost. Αν η γλώσσα είναι c πρέπει να δεις λίγο απο δείκτες κτλ. Αν είναι κάποια αντικειμενοστραφής είναι απλούστερο.
manos256 Δημοσ. 10 Ιουνίου 2015 Μέλος Δημοσ. 10 Ιουνίου 2015 Αφου διαβάσεις το αρχείο γραμμη προς γραμμή βάλε τα σε δυσδιάστατο πίνακα στη πρωτη διάσταση το κόμβο και στη δεύτερη σε κάθε κόμβο ένα στοιχείο το arc και ένα άλλο το cost?(βάρος). Για το input θα διατρέχεις το πίνακα σε μια επανάληψη τους κόμβους και σε άλλη απο κάτω το arc,cost. Αν η γλώσσα είναι c πρέπει να δεις λίγο απο δείκτες κτλ. Αν είναι κάποια αντικειμενοστραφής είναι απλούστερο. Σε java θελω να το υλοποιησω απλα δεν εχω την εμπειρια να αντιστοιχω τις μεταβλητες που θα δημιουρησω απο το txt με τις μεταβλητες του αλγοριθμου dijkstra που εχω βρει στο internet
gon1332 Δημοσ. 10 Ιουνίου 2015 Δημοσ. 10 Ιουνίου 2015 Δώσε μία τον κώδικα που βρήκες. Ξέρεις να τον διαβάσεις; Γνωρίζεις τί κάνει ο αλγόριθμος;
manos256 Δημοσ. 10 Ιουνίου 2015 Μέλος Δημοσ. 10 Ιουνίου 2015 Εχω βρει υλοποιηση του αλγοριθμου dijkstra και προσπαθω να προσαρμοσω οταν διαβαζω το txt να περνει αυτα τα δεδομενα στο dijkstra αλλα δεν εχω πολυ εμπειρια σε java και τα χω μπερδεψει Site: dijkstra
gon1332 Δημοσ. 11 Ιουνίου 2015 Δημοσ. 11 Ιουνίου 2015 private static final Graph.Edge[] GRAPH = { new Graph.Edge("a", "b", 7), new Graph.Edge("a", "c", 9), new Graph.Edge("a", "f", 14), new Graph.Edge("b", "c", 10), new Graph.Edge("b", "d", 15), new Graph.Edge("c", "d", 11), new Graph.Edge("c", "f", 2), new Graph.Edge("d", "e", 6), new Graph.Edge("e", "f", 9), }; private static final String START = "a"; private static final String END = "e"; Στην ουσία πρέπει να εισάγεις τα δεδομένα του αρχείου, γραμμή γραμμή σε έναν πίνακα σαν τον παραπάνω. Απλά θα καλέσεις επαναληπτικά το διάβασμα γραμμής από το αρχείο και για κάθε γραμμή θα δημιουργείς μία νέα ακμή. Απλά τους αριθμούς να τους θεωρείς ονόματα και όχι αριθμούς. Ο constructor της Edge δέχεται String για τα ονόματα των κορυφών.
gon1332 Δημοσ. 11 Ιουνίου 2015 Δημοσ. 11 Ιουνίου 2015 Για τρέξε μία αυτόν τον κώδικα. /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ //package dijkstra; import java.io.*; import java.util.*; public class Dijkstra { private static final Graph.Edge[] GRAPH = { new Graph.Edge("a", "b", 7), new Graph.Edge("a", "c", 9), new Graph.Edge("a", "f", 14), new Graph.Edge("b", "c", 10), new Graph.Edge("b", "d", 15), new Graph.Edge("c", "d", 11), new Graph.Edge("c", "f", 2), new Graph.Edge("d", "e", 6), new Graph.Edge("e", "f", 9), }; private static final String START = "a"; private static final String END = "e"; public static void main(String[] args) { Graph g = new Graph(GRAPH); g.dijkstra(START); g.printPath(END); parser r = new parser(); r.openFile(args[0]); r.readFile(); r.closeFile(); //g.printAllPaths(); } } class parser { private Scanner x; public void openFile(String fname) { try { x = new Scanner(new File(fname)); } catch (Exception e) { System.out.println("den vre8hke arxeio"); } } public void readFile() { int start = 0; int end = 0; String a = x.next(); int komvoi = Integer.parseInt(a); String b = x.next(); int akmes = Integer.parseInt(; //while (x.hasNext()) { int array[][] = new int [akmes][3]; for (int i=0; i<akmes; i++) { for(int j=0; j<3; j++) { String c = x.next(); int c1 = Integer.parseInt(c); array [i][j] = c1; System.out.printf("%d ", c1); } System.out.printf("\n"); } //} System.out.printf("%s κόμβοι και %s ακμές\n", komvoi,akmes); } public void closeFile(){ x.close(); } } class Graph { private final Map<String, Vertex> graph; // mapping of vertex names to Vertex objects, built from a set of Edges /** One edge of the graph (only used by Graph constructor) */ public static class Edge { public final String v1, v2; public final int dist; public Edge(String v1, String v2, int dist) { this.v1 = v1; this.v2 = v2; this.dist = dist; } } /** One vertex of the graph, complete with mappings to neighbouring vertices */ public static class Vertex implements Comparable<Vertex> { public final String name; public int dist = Integer.MAX_VALUE; // MAX_VALUE assumed to be infinity public Vertex previous = null; public final Map<Vertex, Integer> neighbours = new HashMap<>(); public Vertex(String name) { this.name = name; } private void printPath() { if (this == this.previous) { System.out.printf("%s", this.name); } else if (this.previous == null) { System.out.printf("%s(unreached)", this.name); } else { System.out.printf(" the distance is %d ", this.dist); } } public int compareTo(Vertex other) { return Integer.compare(dist, other.dist); } } /** Builds a graph from a set of edges */ public Graph(Edge[] edges) { graph = new HashMap<>(edges.length); //one pass to find all vertices for (Edge e : edges) { if (!graph.containsKey(e.v1)) graph.put(e.v1, new Vertex(e.v1)); if (!graph.containsKey(e.v2)) graph.put(e.v2, new Vertex(e.v2)); } //another pass to set neighbouring vertices for (Edge e : edges) { graph.get(e.v1).neighbours.put(graph.get(e.v2), e.dist); //graph.get(e.v2).neighbours.put(graph.get(e.v1), e.dist); // also do this for an undirected graph } } /** Runs dijkstra using a specified source vertex */ public void dijkstra(String startName) { if (!graph.containsKey(startName)) { System.err.printf("Graph doesn't contain start vertex \"%s\"\n", startName); return; } final Vertex source = graph.get(startName); NavigableSet<Vertex> q = new TreeSet<>(); // set-up vertices for (Vertex v : graph.values()) { v.previous = v == source ? source : null; v.dist = v == source ? 0 : Integer.MAX_VALUE; q.add(v); } dijkstra(q); } /** Implementation of dijkstra's algorithm using a binary heap. */ private void dijkstra(final NavigableSet<Vertex> q) { Vertex u, v; while (!q.isEmpty()) { u = q.pollFirst(); // vertex with shortest distance (first iteration will return source) if (u.dist == Integer.MAX_VALUE) break; // we can ignore u (and any other remaining vertices) since they are unreachable //look at distances to each neighbour for (Map.Entry<Vertex, Integer> a : u.neighbours.entrySet()) { v = a.getKey(); //the neighbour in this iteration final int alternateDist = u.dist + a.getValue(); if (alternateDist < v.dist) { // shorter path to neighbour found q.remove(v); v.dist = alternateDist; v.previous = u; q.add(v); } } } } /** Prints a path from the source to the specified vertex */ public void printPath(String endName) { if (!graph.containsKey(endName)) { System.err.printf("Graph doesn't contain end vertex \"%s\"\n", endName); return; } graph.get(endName).printPath(); System.out.println(); } /** Prints the path from the source to every vertex (output order is not guaranteed) */ public void printAllPaths() { for (Vertex v : graph.values()) { v.printPath(); System.out.println(); } } } Άλλαξα λίγο την openfile και περισσότερο (ώστε να δουλεύει) την readfile. Συνέχισε από εδώ και πέρα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα