2015-11-10 2 views
0

On m'a demandé de créer un programme Java, dans lequel j'accepte d'abord un nombre prédéfini de sommets, puis tous les arêtes qui existent dans le graphe sous la forme de paires de nombres. Mon code est supposé accepter les arêtes, créer le 'graphe' et colorier tous les sommets. Mon problème est avec la coloration. La méthode 'setColor' est supposée accepter le degré du graphe à chaque fois qu'il est appelé. La méthode getBiggestVertex est supposée renvoyer le vertex à colorier. Il est ensuite coloré. Pour une raison quelconque, quand j'affirme les couleurs des sommets, je reçois constamment 0 ou 1 ou -1.Java Graph Coloring program

Je ne parviens pas à comprendre pourquoi je reçois cette sortie, quelqu'un pourrait-il m'aider s'il vous plaît?

Merci

Graphique Classe:

import java.util.ArrayList; 
import java.util.Scanner; 


public class Graph { 
    ArrayList <Vertex> vertices = new ArrayList<Vertex>(); 
    public Graph(){ 
     Scanner sc = new Scanner(System.in); 
     int noOfVertices = sc.nextInt(); 

     for(int i = 0; i <noOfVertices; i++){ 
      addVertex(); 
     } 

     String input = sc.next(); 

     while(!input.equals("-1")){ 
      String vertex [] = input.split(","); 
      addEdge(vertices.get(Integer.parseInt(vertex[0])), vertices.get(Integer.parseInt(vertex[1]))); 
      input = sc.next(); 
     } 
     for(int i = 0; i<vertices.size(); i++){ 
      getBiggestVertex().setColor(vertices.size()); 
     } 
    } 

    public Vertex getBiggestVertex(){ 
     Vertex bVertex = new Vertex(-1); 
      for(int i = 0; i < vertices.size(); i++){ 
       Vertex v = vertices.get(i); 
       if(v.colour ==-1){ 
        if(v.getDegree() > bVertex.getDegree()){ 
         bVertex = v; 
        } else if(v.getDegree() == bVertex.getDegree()){ 
         if(v.vertexNumber < bVertex.vertexNumber){ 
          bVertex = v; 
         } 
        } else if(v.getDegree() < bVertex.getDegree()){ 

        } 
       } 
      } 
     return bVertex; 
    } 
    public void addVertex(){ 
     vertices.add(new Vertex(vertices.size())); 
    } 

    public Vertex getVertex(int index){ 
     return vertices.get(index); 
    } 

    public void addEdge(Vertex v1, Vertex v2){ 
     v1.addAdjacency(v2); 
     v2.addAdjacency(v1); 
    } 

} 

Vertex Classe:

import java.util.LinkedList; 


public class Vertex { 
    int vertexNumber, colour; 
    LinkedList <Vertex> adjacencies = new LinkedList<Vertex>(); 
    public Vertex(int vertexNum){ 
     vertexNumber = vertexNum; 
     colour = -1; 
    } 
    public void addAdjacency(Vertex v){ 
     adjacencies.add(v); 
    } 
    public boolean isAdjacent(Vertex v){ 
     boolean adj = false; 
     for(int i = 0; i < adjacencies.size(); i++){ 
      if(adjacencies.get(i) == v){ 
       adj = true; 
      } 
     } 
     return adj; 
    } 
    public int getDegree(){ 
     return adjacencies.size(); 
    } 
    public void setColor(int degree){ 
     int [] used = new int[degree]; 
     for(int i = 0; i < adjacencies.size(); i++){ 
      int c = adjacencies.get(i).colour; 
      System.out.println("Color of " + i + " = " + c); 
      used[c+1] = 1; 

     } 
     int unusedColor = 0; 
     while(used[unusedColor] == 1){ 
      unusedColor ++; 
     } 
     colour = unusedColor; 
    } 
} 

Répondre

0

Je suppose que -1 représente une couleur de sommet pas encore défini.

Il y a plusieurs problèmes avec votre code, dont la plupart centre autour setColor méthode:

Lors de la vérification des couleurs des sommets adjacents, la gamme de codes de couleur est décalée de 1 à servir des indices dans le tableau de marqueurs d'utilisation used. Cependant, après avoir visité tous les voisins, la première couleur que vous testez est 0. Ce processus colore un sommet qui n'a que des voisins non colorés avec 1. Si tous les voisins ont été colorés, la couleur attribuée sera 0.

De plus en getBiggestVertex, la condition (v.vertexNumber < bVertex.vertexNumber) ne sera jamais le feu pour les sommets avec un degré sortant de 0 lorsque tous les autres sommets sans couleurs assignées ont degré sortant 0 (bVertex est initialisée avec le nombre de sommets minimum de -1 et ne seront jamais réaffectés).

Cela signifie en particulier que vous pouvez produire des chemins de sommets de la même couleur. Notamment le graphique suivant sera donné une coloration invalide:

4,5 
4,6 
4,7 
4,3 
3,8 
3,9 
3,2 
2,10 
2,1 
9,2 

résultats dans la coloration

c(1) = -1 
c(2) = 1 
c(3) = 1 
c(4) = 1 
c(5) = -1 
c(6) = -1 
c(7) = -1 
c(8) = -1 
c(9) = 0 
c(10) = -1 
c(11) = -1 

où le nœud 3 aurait besoin d'une nouvelle couleur 2 et -1 est une couleur invalide (qui peut être interprété ex poster comme valide, bien sûr).

Remédiez par le code

  • maintien adjacences bidirectionnel (si a,b implique que a est adjacente à b et vice versa)
  • écriture used[c] au lieu de used[c+1].

ou de vérifier également les couleurs des sommets des prédécesseurs.

En plus de l'attribution des couleurs imparfaite, tenez compte des suggestions suivantes pour améliorer votre code:

  • Le degré max est une propriété du graphique et devrait donc être une propriété de la classe graphique. Ainsi, vous n'avez pas besoin d'allouer le degré le plus défavorable du nombre actuel de sommets - 1 pour le tableau used dans setColor.

  • Le noeud (s) avec le plus haut degré dans le graphique n'a pas besoin d'être recalculée à partir de zéro à chaque utilisation, mais peut être une propriété de la classe graphique et

  • Prenant les conseils précédent une étape supplémentaire, vous pouvez trier les sommets du graphique en diminuant le degré avant le processus de coloration en stockant cette liste. Le devrait vous libérer des appels répétés à getBiggestVertex, vous visitez les nœuds dans le même ordre qu'ils apparaissent dans la liste.