package main import ( "fmt" "math/rand" "time" ) //Virus represents simplified data of virus type Virus struct { Knowledge float64 //Knowledge means number between 0 - 1, 0 - not known, 1 - very well known Uniqueness float64 // Uniqueness means number between 0 - 1, 0 - not unique, 1 - unique } //Subnet represents simplified data of each subnet type Subnet struct { ID int Antivirus float64 //Antivirus means number between 0 - 1, 0 - not installed Updated float64 //Updated means number between 0 - 1, 0 - not updated, 1 - updated regularly ConnectedTo []int //ConnectedTo is an array of connected subnets IsInfected bool } //Entrydata represents topology of networks var entryData = []Subnet{ { ID: 0, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{1, 2}, }, { ID: 1, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{3, 4}, }, { ID: 2, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{5, 6}, }, { ID: 3, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{}, }, { ID: 4, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{}, }, { ID: 5, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{}, }, { ID: 6, Antivirus: getRandomNumber(), Updated: getRandomNumber(), ConnectedTo: []int{}, }, } var numberOfInfected = 0 //getRandomNumber returns random float in range 0-1 func getRandomNumber() float64 { s := rand.NewSource(time.Now().UnixNano()) newRand := rand.New(s) return newRand.Float64() } //getsInfected returns if node will be infected or not func getsInfected(node *Subnet, virus Virus) { nodeEndurance := node.Antivirus * node.Updated virusEndurance := (1 - virus.Knowledge) * virus.Uniqueness //if node endurance is lover than virus endurance, it means node is not protected enough and will be infected if nodeEndurance < virusEndurance { node.IsInfected = true } } func goThroughNet(index int, virus Virus) { node := &entryData[index] getsInfected(node, virus) if node.IsInfected { fmt.Println("Subnet ", node.ID, " gets infected.") numberOfInfected++ for _, nextID := range node.ConnectedTo { goThroughNet(nextID, virus) } } } func main() { var virus = Virus{ Knowledge: 0, Uniqueness: getRandomNumber(), } goThroughNet(0, virus) fmt.Println("Number of infected subnet: ", numberOfInfected) }
We use cookies to provide and improve our services. By using our site, you consent to our Cookies Policy. Accept Learn more