2015-11-14 64 views
0

這是我的代碼來生成一個隨機圖形,其中每個頂點連接到其他6個頂點。問題是,當我運行它幾次(或有時第一次運行)時,似乎Random對象的函數無法找到一個隨機數來強制執行我所提出的限制。對於某些頂點編號,它適用於某些不...我不知道發生了什麼......我也可能會使用HashMap的方式有問題。任何想法出了什麼問題?隨機圖形發生器Java代碼錯誤

import java.util.List; 
import java.util.Random; 
import java.util.Scanner; 

public class Graph_Generator { 
public static void main(String args[]) { 
    Scanner sc = new Scanner(System.in); 
    for (int i=0;i<3; i++){ 
    System.out.println("Enter the number of vertex: "); 


    int number_vertex = sc.nextInt(); 
    GenerateG1(number_vertex); 


    } 
    sc.close(); 
} 

public static void GenerateG1(int num_vertex){ 

    try { 

     Random random = new Random(); 
     Random_Graph g6 = new Random_Graph(num_vertex); 
     int num_edges = 6, to, from; 

     for (int v = 0; v < num_vertex; v++) { 
      from = v; 
      System.out.println("v is : "+ v); 
      while (g6.getEdge(from).size() < num_edges) { 
       to = Math.abs(random.nextInt(num_vertex)); 

       while (to == from || (g6.isEdge(from, to)) || (g6.isEdge(to, from)) || (g6.getEdge(to).size() > (num_edges-1))) { 
        to = Math.abs(random.nextInt(num_vertex)); 

       } 

       g6.setEdge(to, from); 

      } 
     } 

     System.out 
       .println("THe Adjacency List Representation of the random graph is: "); 

     for (int i = 0; i < num_vertex; i++) { 
      System.out.print(i + " -> "); 
      List<Integer> edgeList = g6.getEdge(i); 
      if (edgeList.size() == 0) 
       System.out.print("null"); 
      else { 
       for (int j = 0;; j++) { 
        if (j != edgeList.size() - 1) 
         System.out.print(edgeList.get(j) + " -> "); 
        else { 
         System.out.print(edgeList.get(j)); 
         break; 
        } 
        } 
       } 
       System.out.println(); 
      } 
     } catch (Exception E) { 
      System.out.println("Something went wrong"); 
     } 
    } 

} 




     public class Random_Graph 
     { 
    private Map<Integer, List<Integer>> adjacencyList; 

    public Random_Graph(int v) 
    { 
     adjacencyList = new HashMap<Integer, List<Integer>>(); 
     for (int i = 0; i < v; i++) 
      adjacencyList.put(i, new LinkedList<Integer>()); 
    } 

    public void setEdge(int to, int from) 
    { 
     if (to >= adjacencyList.size() || from >= adjacencyList.size()) 
      System.out.println("The vertices does not exists"); 

     adjacencyList.get(to).add(from); 
     adjacencyList.get(from).add(to); 
    } 

    public List<Integer> getEdge(int to) 
    { 
     if (to > adjacencyList.size()) 
     { 
      System.out.println("The vertices does not exists"); 
      return null; 
     } 
     return adjacencyList.get(to); 
    } 

    public boolean isEdge(int from , int to) 
    { 
    return (adjacencyList.get(from).contains(to) || adjacencyList.get(to).contains(from)); 

    } 



} 

回答

0

問題出在您的生成算法的邏輯上。考慮下一種情況:num_vertex = 8,並且在生成期間,您的算法將0,1,2,3,4,5,6連接到完整圖中(每個頂點彼此具有邊),然後它繼續到最後一個頂點7,但是它不能連接任何其他頂點(因爲它們中的每一個已經有6個連接),所以它掛起。

+0

真的是真的!但我想不出任何其他的方式... – samira

+0

我只是明白,我面臨的是什麼樣的問題......我怎麼能保證呢? – samira

+0

我腦子裏有一個解決方案,如果你還需要它,我可以描述它,但它可能有點複雜。 – user3707125

0

您的方法並不總是找到解決方案。隨機生成這些圖的一種方法:

  1. 構建一個初始圖。一個簡單的方法是連接頂點n和頂點(n-3, n-2, n-1, n+1, n+2, n+3)
  2. 隨機選擇任意兩個斷開邊緣並交換配對 - 如果邊緣是(v1, v2), (v3, v4),則結果可以是(v1, v3), (v2, v4)(v1, v4), (v2, v3)。重複這一次,只要你喜歡。