const INTERVAL_CUSTOMERS = 12.00 // Generate new customers roughly every x minites const SERVICE_TIME = 12.0 const MIN_PATIENCE = 1 // Min. customer patience const MAX_PATIENCE = 3 // Max. customer patience // random generator for the arrival interval - expovariate distribution var arrivalGen *godes.ExpDistr = godes.NewExpDistr() // random generator for the patience time time - uniform distribution var patienceGen *godes.UniformDistr = godes.NewUniformDistr() // random generator for the service time - expovariate distribution var serviceGen *godes.ExpDistr = godes.NewExpDistr() // true when Counter var counterAvailable *godes.BooleanControl = godes.NewBooleanControl() type Customer struct { *godes.Runner name int } func (customer *Customer) Run() { arrivalTime := godes.GetSystemTime() patience := patienceGen.Get(MIN_PATIENCE, MAX_PATIENCE) fmt.Printf(" %6.3f Customer %v : Here I am My patience=%6.3f \n", godes.GetSystemTime(), customer.name, patience) counterAvailable.WaitAndTimeout(true, patience) if !counterAvailable.GetState() { fmt.Printf(" %6.3f Customer %v : RENEGED after %6.3f \n", godes.GetSystemTime(), customer.name, godes.GetSystemTime()-arrivalTime)
const PT_SIGMA = 2.0 // Sigma of processing time const MTTF = 300.0 // Mean time to failure in minutes const REPAIR_TIME = 30.0 // Time it takes to repair a machine in minutes const REPAIR_TIME_SIGMA = 1.0 // Sigma of repair time const NUM_MACHINES = 10 const SHUT_DOWN_TIME = 4 * 7 * 24 * 60 // random generator for the processing time - normal distribution var processingGen *godes.NormalDistr = godes.NewNormalDistr() // random generator for the time until the next failure for a machine - exponential distribution var breaksGen *godes.ExpDistr = godes.NewExpDistr() // true when repairman is available for carrying a repair var repairManAvailableSwt *godes.BooleanControl = godes.NewBooleanControl() type Machine struct { *godes.Runner partsCount int number int } func (machine *Machine) Run() { for { godes.Advance(processingGen.Get(PT_MEAN, PT_SIGMA)) machine.partsCount = machine.partsCount + 1 if godes.GetSystemTime() > SHUT_DOWN_TIME { break } }
// Copyright 2013 Alex Goussiatiner. All rights reserved. // Use of this source code is governed by a MIT // license that can be found in the LICENSE file. package main import ( "fmt" "godes" ) // the arrival and service are two random number generators for the uniform distribution var arrival *godes.UniformDistr = godes.NewUniformDistr() var service *godes.UniformDistr = godes.NewUniformDistr() // true when waiter should act var waitersSwt *godes.BooleanControl = godes.NewBooleanControl() // FIFO Queue for the arrived var visitorArrivalQueue *godes.FIFOQueue = godes.NewFIFOQueue("arrivalQueue") // the Visitor is a Passive Object type Visitor struct { id int } // the Waiter is a Runner type Waiter struct { *godes.Runner id int }
// Copyright 2013 Alex Goussiatiner. All rights reserved. // Use of this source code is governed by a MIT // license that can be found in the LICENSE file. package main import ( "fmt" "godes" ) // the arrival and service are two random number generators for the uniform distribution var arrival *godes.UniformDistr = godes.NewUniformDistr() var service *godes.UniformDistr = godes.NewUniformDistr() // tableBusy is the boolean control variable than can be accessed and changed by number of Runners var tableBusy *godes.BooleanControl = godes.NewBooleanControl() // the Visitor is a Runner // any type of the Runner should be defined as struct // with the *godes.Runner as anonimous field type Visitor struct { *godes.Runner number int } var visitorsCount int = 0 func (vst Visitor) Run() { // Any runner should have the Run method fmt.Printf("%-6.3f \t Visitor %v arrives \n", godes.GetSystemTime(), vst.number) tableBusy.Wait(false) // this will wait till the tableBusy control becomes false tableBusy.Set(true) // sets the tableBusy control to true - the table is busy fmt.Printf("%-6.3f \t Visitor %v gets the table \n", godes.GetSystemTime(), vst.number)