我正在尝试创建一个随机生成的图形,其中包含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的实施
感谢您的帮助
答案 0 :(得分:0)
我认为你使用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;
如果您需要为边添加权重,请将boolean值替换为double值或用于表示权重的任何值。