Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημερα εχω το εξης προβλημα...Θελω να υλοποιησω τους αλγοριθμους dijkstra και bellman-ford αλλα για γραφους η οποιοι ειναι ηδη προκαθορισμενοι σε αρχεια txt για διαφορα πληθη κομβων...Το καθε txt δηλαδη δινει στοιχεια για το γραφο...Πιο συγκεκριμενα στη πρωτη γραμμη ο πρωτος αριθμος ειναι το πληθος των κομβων και ο δευτερος οι ακμές...Οι υπολοιπες γραμμες ειναι οσες οι ακμες και σου λενε αρχη και τελος καθε ακμης και το αντιστοιχο βαρος ...Στη τελευταια γραμμη σου λεει απο που θελω να ξεκινησω και που να φτασω...Το θεμα μου ειναι οτι εχω καταφερει να διαβασω το txt και να αποθηκευσω σε μεταβλητες το πληθος κομβων και ακμων, αρχη και τελος που θελω να φτασω και σε πινακα τα στοιχεια για καθε ακμη,αλλα αυτα τα δεδομενα δεν εχω την εμπειρια να τροποποιησω τους κωδικες που εχω βρει για να δουλευουν με αυτα τα στοιχεια...

net10.txt

Δημοσ.

Αφου διαβάσεις το αρχείο γραμμη προς γραμμή βάλε τα σε δυσδιάστατο πίνακα στη πρωτη διάσταση το κόμβο και στη δεύτερη σε κάθε κόμβο ένα στοιχείο το arc και ένα άλλο το cost?(βάρος). Για το input θα διατρέχεις το πίνακα σε μια επανάληψη τους κόμβους και σε άλλη απο κάτω  το arc,cost. Αν η γλώσσα είναι c πρέπει να δεις λίγο απο δείκτες κτλ. Αν είναι κάποια αντικειμενοστραφής είναι  απλούστερο.

Δημοσ.

Αφου διαβάσεις το αρχείο γραμμη προς γραμμή βάλε τα σε δυσδιάστατο πίνακα στη πρωτη διάσταση το κόμβο και στη δεύτερη σε κάθε κόμβο ένα στοιχείο το arc και ένα άλλο το cost?(βάρος). Για το input θα διατρέχεις το πίνακα σε μια επανάληψη τους κόμβους και σε άλλη απο κάτω  το arc,cost. Αν η γλώσσα είναι c πρέπει να δεις λίγο απο δείκτες κτλ. Αν είναι κάποια αντικειμενοστραφής είναι  απλούστερο.

Σε java θελω να το υλοποιησω απλα δεν εχω την εμπειρια να αντιστοιχω τις μεταβλητες που θα δημιουρησω απο το txt με τις μεταβλητες του αλγοριθμου dijkstra που εχω βρει στο internet

Δημοσ.

Δώσε μία τον κώδικα που βρήκες. Ξέρεις να τον διαβάσεις; Γνωρίζεις τί κάνει ο αλγόριθμος;

Δημοσ.

Εχω βρει υλοποιηση του αλγοριθμου dijkstra και προσπαθω να προσαρμοσω οταν διαβαζω το txt να περνει αυτα τα δεδομενα στο dijkstra αλλα δεν εχω πολυ εμπειρια σε java και τα χω μπερδεψει Link.png Site: 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";

Στην ουσία πρέπει να εισάγεις τα δεδομένα του αρχείου, γραμμή γραμμή

σε έναν πίνακα σαν τον παραπάνω. Απλά θα καλέσεις επαναληπτικά το

διάβασμα γραμμής από το αρχείο και για κάθε γραμμή θα δημιουργείς μία

νέα ακμή. Απλά τους αριθμούς να τους θεωρείς ονόματα και όχι αριθμούς.

Ο constructor της Edge δέχεται String για τα ονόματα των κορυφών.

Δημοσ.

Για τρέξε μία αυτόν τον κώδικα.

 

 

/*
 * 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.

Συνέχισε από εδώ και πέρα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...