Skip to content

Commit a24960a

Browse files
committed
Implement additional graph generators
1 parent 613d963 commit a24960a

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ Go-Network is a Go package for the creation, manipulation, and study of the stru
2121
- [Wheel graph]()
2222

2323
- Random graphs
24-
- Erdős-Rényi
24+
- [Barabasi-Albert]()
2525
- [Dense Random graph]()
26-
-
26+
- [Erdős-Rényi]()
27+
- [Watts-Strogatz]()
2728

2829
#### Supported graph sampling algorithms
2930
- [Random Node]()

model/generator_random.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,62 @@ func DenseGNMRandomGraph(numberOfNodes int, numberOfEdges int) (g *UndirectedGra
8585
}
8686
}
8787
}
88+
89+
func BarabasiAlbertRandomGraph(numberOfNodes int, numberOfEdges int) (g *UndirectedGraph) {
90+
g = &UndirectedGraph{}
91+
// generate a Barabasi-Albert graph
92+
for i := numberOfEdges / 2; i < numberOfNodes; i++ {
93+
for j := 0; j < numberOfEdges; j++ {
94+
neighbor := (i + j - numberOfEdges/2) % numberOfNodes
95+
g.AddEdge(Edge{
96+
Node1: Node(i),
97+
Node2: Node(neighbor),
98+
})
99+
}
100+
}
101+
102+
return g
103+
}
104+
105+
func WattsStrogatzRandomGraph(numberOfNodes int, nearestNeighboursCount int, edgeRewiringProbability float32) (g *UndirectedGraph) {
106+
g = &UndirectedGraph{}
107+
// generate a Watts Strogatz graph
108+
g.Nodes = make(map[Node]bool)
109+
g.Edges = make(map[Node][]Node)
110+
111+
// create nodes
112+
for i := 0; i < numberOfNodes; i++ {
113+
g.AddNode(Node(i))
114+
}
115+
116+
// create initial regular ring lattice
117+
for i := 0; i < numberOfNodes; i++ {
118+
for j := 1; j <= nearestNeighboursCount/2; j++ {
119+
neighbor := (i + j) % numberOfNodes
120+
g.AddEdge(Edge{
121+
Node1: Node(i),
122+
Node2: Node(neighbor),
123+
})
124+
}
125+
}
126+
127+
// rewire edges with probability
128+
for i := 0; i < numberOfNodes; i++ {
129+
for j := 1; j <= nearestNeighboursCount/2; j++ {
130+
if rand.Float32() < edgeRewiringProbability {
131+
neighbor := (i + j) % numberOfNodes
132+
newNeighbor := Node(rand.Intn(numberOfNodes))
133+
g.RemoveEdge(Edge{
134+
Node1: Node(i),
135+
Node2: Node(neighbor),
136+
})
137+
g.AddEdge(Edge{
138+
Node1: Node(i),
139+
Node2: newNeighbor,
140+
})
141+
}
142+
}
143+
}
144+
145+
return g
146+
}

0 commit comments

Comments
 (0)