【问题标题】:Random graph generation with probabilities具有概率的随机图生成
【发布时间】:2017-02-20 18:58:58
【问题描述】:

我正在尝试使用 5 个输入参数 n1、n2、p1、p2 和 p3 创建一个随机生成的图形,以及 生成表示为 G(n1, n2, p1, p2, p3) 的随机图,其中划分了 n1+n2 个顶点 分成两组 V1, V2 使得 |V1| = n1 和 |V2| = n2。

p1、p2 和 p3 是概率,因此在 0 到 1 的范围内。对于每一对 顶点 u, v ∈ V1,添加一条连接 u 和 v 的边,概率为 p1。对于每一对 1 顶点 u,v ∈ V2,添加一条连接 u 和 v 的边,概率为 p2。对于每一对 顶点 u ∈ V1 和 v ∈ V2,添加一条连接 u 和 v 的边,概率为 p3。

目前我正在制作一个随机图表

private static ArrayList<LinkedList<Integer>> RandomGraph(int n1, int n2, double p1, double p2, double p3) {
int V = n1 + n2;
int[] verticies = new int[V];
// Fills up the verticies array
for (int i = 0; i < V; i++) {
    verticies[i] = i;
}
// Shuffles the array
Random rand = new Random();
for (int i = 0; i < V; i++) {
    int pos = i + rand.nextInt(V - i);
    int temp = verticies[i];
    verticies[i] = verticies[pos];
    verticies[pos] = temp;
}
// System.out.println(Arrays.toString(verticies));
// V1
ArrayList<Edge> a = new ArrayList<>();
int i;
int j;
// for every pair so double for loop for each
for (i = 0; i < n1; i++) {
    for (j = i + 1; j <= rand.nextInt(n1 - i) + i; j++) {
        if(rand.nextDouble()<p1)
        {
            a.add(new Edge(verticies[i], verticies[j], p1));
            a.add(new Edge(verticies[j], verticies[i], p1));
        }
    }
}

// V2
for (j = n1 + 1; j < V; j++) {
    for (int k = j + 1; j <= rand.nextInt(V - k) + k; k++) {
        if(rand.nextDouble<p2)
        {
             a.add(new Edge(verticies[j], verticies[k], p2));
             a.add(new Edge(verticies[k], verticies[j], p2));
        }

    }
}
// V3
for (j = 0; j < n1; j++) {
    for (int k = n1 + 1; k < V; k++) {
        if(rand.nextDouble()<p3)
        {
        a.add(new Edge(verticies[j], verticies[k], p3));
        a.add(new Edge(verticies[k], verticies[j], p3));
        }
    }
}
ArrayList<LinkedList<Integer>> Alist = new ArrayList<>();
for (j = 0; j < V; j++) {
    Alist.add(new LinkedList<Integer>());
}
for (j = 0; j < a.size(); j++) {

    Alist.get(a.get(j).start).add(a.get(j).end);
}

return Alist;

}

但我不确定概率在哪里发挥作用。从我所看到的情况来看,它们在计算成本时会出现,但我不确定如何将其实现到图形生成中。

编辑:研究了鄂尔多斯-仁义模型,但在成本分析方面并没有真正的帮助?添加了ERM的实现

感谢您的帮助

【问题讨论】:

    标签: java graph graph-theory graph-traversal cost-management


    【解决方案1】:

    我认为使用 ER 模型你会走上正确的道路。比如:

    List<List<Integer>> adjacencyList = new ArrayList<>();
    for (ArrayList<Integer> list : adjacencyList) {
      list = new ArrayList<>();
    }
    
    Random random = new Random();
    // Randomly add edges for V1.
    for (int u = 0; u < n1; u++) {
      for (int v = u + 1; v < n1; v++) {
        if (random.nextDouble() < p1) {
          adjacencyList.get(u).add(v);
          adjacencyList.get(v).add(u);
        }
      }
    }
    
    // Randomly add edges for V2.
    for (int u = n1; u < n1 + n2; u++) {
      for (int v = u + 1; v < n1 + n2; v++) {
        if (random.nextDouble() < p2) {
          adjacencyList.get(u).add(v);
          adjacencyList.get(v).add(u);
        }
      }
    }
    
    // Randomly add edges between V1 and V2.
    for (int u = 0; u < n1; u++) {
      for (int v = n1; v < n1 + n2; v++) {
        if (random.nextDouble() < p3) {
          adjacencyList.get(u).add(v);
          adjacencyList.get(v).add(u);
        }
      }
    }
    

    如果图很小,最好将邻接表实现为邻接矩阵:

    boolean[][] adjacencyMatrix = new boolean[n1 + n2][n1 + n2];
    

    然后,如果两个顶点之间存在边,则将矩阵中的对应元素设置为true:

    adjacencyMatrix[u][v] = true;
    

    如果您需要为边缘添加权重,请将布尔值替换为双精度值或您用来表示权重的任何值。

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      相关资源
      最近更新 更多