Initial commit
This commit is contained in:
commit
148cd266e3
10 changed files with 1261 additions and 0 deletions
108
model/model.go
Normal file
108
model/model.go
Normal file
|
@ -0,0 +1,108 @@
|
|||
package model
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
||||
type (
|
||||
Node struct {
|
||||
IR []int
|
||||
}
|
||||
ExperimentResult struct {
|
||||
ViolatedCounter int
|
||||
}
|
||||
)
|
||||
|
||||
func getRandomN(n, max, seed int, r *rand.Rand) []int {
|
||||
r.Seed(time.Now().UnixNano() + int64(seed))
|
||||
|
||||
if n > max/2 {
|
||||
return r.Perm(max)[:n]
|
||||
|
||||
} else {
|
||||
result := make([]int, 0, n)
|
||||
re := make(map[int]struct{}, max)
|
||||
|
||||
for len(result) < n {
|
||||
num := r.Intn(max)
|
||||
if _, ok := re[num]; !ok {
|
||||
result = append(result, num)
|
||||
re[num] = struct{}{}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
func ExecuteModelA(ircount, containers, badcount, choose int) *ExperimentResult {
|
||||
var (
|
||||
nodes = make([]Node, containers)
|
||||
badring = make(map[int]struct{})
|
||||
result = new(ExperimentResult)
|
||||
)
|
||||
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
for len(badring) < badcount {
|
||||
n := r.Intn(ircount)
|
||||
if _, ok := badring[n]; !ok {
|
||||
badring[n] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < ircount; i++ {
|
||||
if _, ok := badring[i]; ok {
|
||||
continue
|
||||
}
|
||||
rands := getRandomN(choose, containers, i+1, r)
|
||||
for _, host := range rands {
|
||||
nodes[host].IR = append(nodes[host].IR, i)
|
||||
}
|
||||
}
|
||||
|
||||
for _, node := range nodes {
|
||||
if len(node.IR) == 0 {
|
||||
result.ViolatedCounter++
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func ExecuteModelB(ircount, containers, badcount, choose int) *ExperimentResult {
|
||||
var (
|
||||
nodes = make([]Node, containers)
|
||||
badring = make(map[int]struct{})
|
||||
result = new(ExperimentResult)
|
||||
)
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
|
||||
for len(badring) < badcount {
|
||||
n := r.Intn(ircount)
|
||||
if _, ok := badring[n]; !ok {
|
||||
badring[n] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < ircount; i++ {
|
||||
if _, ok := badring[i]; ok {
|
||||
continue
|
||||
}
|
||||
ind := (i * choose) % containers
|
||||
for j := 0; j < choose; j++ {
|
||||
nodes[ind].IR = append(nodes[ind].IR, i)
|
||||
ind++
|
||||
if ind == containers {
|
||||
ind = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, node := range nodes {
|
||||
if len(node.IR) == 0 {
|
||||
result.ViolatedCounter++
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
52
model/model_test.go
Normal file
52
model/model_test.go
Normal file
|
@ -0,0 +1,52 @@
|
|||
package model
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGetRandom_A(t *testing.T) {
|
||||
src := rand.NewSource(0)
|
||||
t.Log(getRandomN(1, 10, 1, rand.New(src)))
|
||||
t.Log(getRandomN(1, 10, 1, rand.New(src)))
|
||||
t.Log(getRandomN(1, 10, 2, rand.New(src)))
|
||||
}
|
||||
|
||||
func TestExecuteModelA(t *testing.T) {
|
||||
var (
|
||||
avg float32
|
||||
nExperiments = 10000
|
||||
results = make([]*ExperimentResult, nExperiments)
|
||||
|
||||
totalNodes = 10
|
||||
tasks = 100
|
||||
badNodes = 3
|
||||
taskPoolSize = 33
|
||||
)
|
||||
for i := 0; i < nExperiments; i++ {
|
||||
results[i] = ExecuteModelA(totalNodes, tasks, badNodes, taskPoolSize)
|
||||
avg += float32(results[i].ViolatedCounter)
|
||||
}
|
||||
avg = avg / float32(nExperiments)
|
||||
fmt.Printf("(%d) V=%d N=%d/%d AvgFailedV = %f (%.2f%%)\n", nExperiments, tasks, totalNodes, badNodes, avg, avg/float32(tasks)*100.00)
|
||||
}
|
||||
|
||||
func TestExecuteModelB(t *testing.T) {
|
||||
var (
|
||||
avg float32
|
||||
nExperiments = 10000
|
||||
results = make([]*ExperimentResult, nExperiments)
|
||||
|
||||
totalNodes = 10
|
||||
tasks = 100
|
||||
badNodes = 3
|
||||
taskPoolSize = 33
|
||||
)
|
||||
for i := 0; i < nExperiments; i++ {
|
||||
results[i] = ExecuteModelB(totalNodes, tasks, badNodes, taskPoolSize)
|
||||
avg += float32(results[i].ViolatedCounter)
|
||||
}
|
||||
avg = avg / float32(nExperiments)
|
||||
fmt.Printf("(%d) V=%d N=%d/%d AvgFailedV = %f (%.2f%%)\n", nExperiments, tasks, totalNodes, badNodes, avg, avg/float32(tasks)*100.00)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue