【问题标题】:Generate Random Symmetric Weighted Adjacency Matrix生成随机对称加权邻接矩阵
【发布时间】:2016-12-02 20:12:16
【问题描述】:

我正在尝试通过使用成本邻接矩阵来测试 Prim 和 Kruskal 算法的实现。我正在根据图中的顶点数量和图中的边数量生成这些矩阵。它不必是连通图。

这是我目前所拥有的:

final static int infinity = 2000000000;
public static int[][] genAdjMat(int V, int E) {
    int[][] a = new int[V][V];
    int e = E;

    for(int i = 0; i < V; i++) {
        for(int j = i; j < V; j++) {
            if(i == j) {
                a[i][j] = 0;
            }
            else {
                if(Math.random() < 0.5 && e >= 0) {
                    int temp = (int)Math.ceil(Math.random()*e);
                    a[i][j] = temp;
                    a[j][i] = temp;
                    e--;        
                }
                else {
                    a[i][j] = infinity;
                    a[j][i] = infinity;
                }
            }
        }
    }
    return a;
}

现在,它生成一个对称数组,但它没有使用我指定的所有边。我无法弄清楚如何用完所有边缘,并且仍然将它们随机放置在整个矩阵中,同时保持对称性。

【问题讨论】:

  • 反过来做。初始化一个空矩阵并添加E随机边。
  • 哇,我觉得自己很愚蠢。这很简单,谢谢你给我另一种方法!

标签: java algorithm matrix adjacency-matrix


【解决方案1】:

我建议如下:

  1. 生成所有可能的无向边的列表(V * (V - 1) / 2 项)。

  2. 随机播放。

  3. 选择第一条E 边。

【讨论】:

  • 这是解决问题的好方法!我最终使用了我所拥有的修改版本,我首先用随机加权边缘填充图形,然后放入边缘缺失的无穷大!
【解决方案2】:

直截了当:只需独立生成边缘。

Random random = new Random();
Set<Map.Entry<Integer,Integer>> edges = Sets.newHashSet();
for (int i=0; i<e; i++) {
    do {
        int xCoordinate = random.nextInt(V);
        int yCoordinate = random.nextInt(V);
    } while(!edges.add(xCoordinate, yCoordinate)); 
}

现在使用边缘将它们放入矩阵中。

或者(在遍历矩阵时),使用以下概率函数:p(A[i,j] == 1) = (e - k) / (V^2 - (i * V + j))。其中k 是已分配的边数。关键是 - 概率小于 1,而剩余的条目数仍然高于您必须分配的边数,当您仍然必须分配的边数等于剩余时,这变为 1要迭代的条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2013-08-24
    • 2016-06-30
    • 2016-01-08
    • 2014-10-19
    • 2022-01-03
    相关资源
    最近更新 更多