diff --git a/demos/AoModel.rb b/demos/AoModel.rb index 147283c679aaa2cea03b6d164477ada20fed8e0d..a7649e4f883dbf8af3542f85ca7b705363ac3427 100644 --- a/demos/AoModel.rb +++ b/demos/AoModel.rb @@ -1,26 +1,25 @@ #!/usr/bin/env ruby require 'rubygems' if RUBY_VERSION =~ /^1\.8/ -require 'simplekit' +require_relative '../lib/simplekit' # Demonstration model of Operational Availability (Ao). - class AoModel include SimpleKit # model state - attr_reader :numAvailableJeeps, - :numAvailableMechanics, - :maintenanceQLength, - :breakdownQLength + attr_reader :num_available_jeeps, + :num_available_mechanics, + :maintenance_q_length, + :breakdown_q_length # model parameters - attr_reader :maxJeeps, - :maxMaintainers, - :breakdownRate, - :maintenanceCycleInDays, - :repairRate, - :haltTime + attr_reader :max_jeeps, + :max_maintainers, + :breakdown_rate, + :maintenance_cycle_in_days, + :repair_rate, + :halt_time # Exponential random variate generator with specified rate. def exponential(rate) @@ -30,91 +29,90 @@ class AoModel # the actual model implementation... # Constructor initializes the model parameters. - def initialize(maxJeeps, maxMaintainers, breakdownRate, - maintenanceCycleInDays, meanRepairTime, haltTime) - @maxJeeps = maxJeeps - @maxMaintainers = maxMaintainers - @breakdownRate = breakdownRate - @maintenanceCycleInDays = maintenanceCycleInDays - @repairRate = 1.0 / meanRepairTime - @haltTime = haltTime + def initialize(max_jeeps, max_maintainers, breakdown_rate, + maintenance_cycle_in_days, mean_repair_time, halt_time) + @max_jeeps = max_jeeps + @max_maintainers = max_maintainers + @breakdown_rate = breakdown_rate + @maintenance_cycle_in_days = maintenance_cycle_in_days + @repair_rate = 1.0 / mean_repair_time + @halt_time = halt_time end # init method kickstarts a simplekit model. State variables are # set to initial values, and some preliminary events get scheduled def init - @numAvailableJeeps = @maxJeeps - @numAvailableMechanics = @maxMaintainers - @maintenanceQLength = 0 - @breakdownQLength = 0 - @numAvailableJeeps.times do |i| - breakdownTime = exponential(@breakdownRate) - if (breakdownTime <= @maintenanceCycleInDays) - schedule(:breakdown, breakdownTime) + @num_available_jeeps = @max_jeeps + @num_available_mechanics = @max_maintainers + @maintenance_q_length = 0 + @breakdown_q_length = 0 + @num_available_jeeps.times do + breakdown_time = exponential(@breakdown_rate) + if (breakdown_time <= @maintenance_cycle_in_days) + schedule(:breakdown, breakdown_time) else - schedule(:maintenance, @maintenanceCycleInDays) + schedule(:maintenance, @maintenance_cycle_in_days) end end - schedule(:halt, @haltTime) - STDOUT.puts "DailyAoReport" - schedule(:dailyReport, 0.0) + schedule(:halt, @halt_time) + STDOUT.puts 'DailyAoReport' + schedule(:daily_report, 0.0) end # Event methods follow... - def dailyReport - STDOUT.printf "%d\n", @numAvailableJeeps if model_time < @haltTime - schedule(:dailyReport, 8.0) + def daily_report + STDOUT.printf "%d\n", @num_available_jeeps if model_time < @halt_time + schedule(:daily_report, 8.0) end def breakdown - @breakdownQLength += 1 - @numAvailableJeeps -= 1 - schedule(:beginBreakdownService, 0.0) if (@numAvailableMechanics > 0) + @breakdown_q_length += 1 + @num_available_jeeps -= 1 + schedule(:begin_breakdown_service, 0.0) if @num_available_mechanics > 0 end def maintenance - @maintenanceQLength += 1 - @numAvailableJeeps -= 1 - schedule(:beginMaintenanceService, 0.0) if (@numAvailableMechanics > 0) + @maintenance_q_length += 1 + @num_available_jeeps -= 1 + schedule(:begin_maintenance_service, 0.0) if @num_available_mechanics > 0 end - def beginMaintenanceService - @maintenanceQLength -= 1 - @numAvailableMechanics -= 1 + def begin_maintenance_service + @maintenance_q_length -= 1 + @num_available_mechanics -= 1 if (rand <= 0.95) - schedule(:endService, (6.5 - rand) / 8.0) + schedule(:end_service, (6.5 - rand) / 8.0) else - schedule(:endService, exponential(@repairRate / 4.0)) + schedule(:end_service, exponential(@repair_rate / 4.0)) end end - def beginBreakdownService - @breakdownQLength -= 1 - @numAvailableMechanics -= 1 + def begin_breakdown_service + @breakdown_q_length -= 1 + @num_available_mechanics -= 1 if (rand <= 0.8) - schedule(:endService, exponential(@repairRate)) + schedule(:end_service, exponential(@repair_rate)) else - schedule(:endService, exponential(@repairRate / 4.0)) + schedule(:end_service, exponential(@repair_rate / 4.0)) end end - def endService - @numAvailableMechanics += 1 - @numAvailableJeeps += 1 - if (@maintenanceQLength > 0) - schedule(:beginMaintenanceService, 0.0) + def end_service + @num_available_mechanics += 1 + @num_available_jeeps += 1 + if @maintenance_q_length > 0 + schedule(:begin_maintenance_service, 0.0) else - schedule(:beginBreakdownService, 0.0) if (@breakdownQLength > 0) + schedule(:begin_breakdown_service, 0.0) if @breakdown_q_length > 0 end - breakdownTime = exponential(@breakdownRate) - if (breakdownTime <= @maintenanceCycleInDays) - schedule(:breakdown, breakdownTime) + breakdown_time = exponential(@breakdown_rate) + if (breakdown_time <= @maintenance_cycle_in_days) + schedule(:breakdown, breakdown_time) else - schedule(:maintenance, @maintenanceCycleInDays) + schedule(:maintenance, @maintenance_cycle_in_days) end end - end # Run model based on command-line arguments... @@ -126,14 +124,16 @@ if (ARGV.length != 6) STDERR.puts "\tMaintenance cycle length (int)" STDERR.puts "\tMean repair time (double)" STDERR.puts "\tNumber of days to run (int)" - STDERR.puts "\nExample: ruby #{File.basename($0)} 50 2 0.01 90 3.0 50\n" + prog_name = File.basename($PROGRAM_NAME) + STDERR.puts "\nExample: ruby #{prog_name} 50 2 0.01 90 3.0 50\n" else - maxJeeps = ARGV[0].to_i - maxMaintainers = ARGV[1].to_i - breakdownRate = ARGV[2].to_f - maintenanceCycleInDays = ARGV[3].to_i - meanRepairTime = ARGV[4].to_f - haltTimeInDays = ARGV[5].to_i - AoModel.new(maxJeeps, maxMaintainers, breakdownRate, - maintenanceCycleInDays, meanRepairTime, 8.0 * haltTimeInDays).run + max_jeeps = ARGV[0].to_i + max_maintainers = ARGV[1].to_i + breakdown_rate = ARGV[2].to_f + maintenance_cycle_in_days = ARGV[3].to_i + mean_repair_time = ARGV[4].to_f + halt_time_in_days = ARGV[5].to_i + AoModel.new(max_jeeps, max_maintainers, breakdown_rate, + maintenance_cycle_in_days, mean_repair_time, + 8.0 * halt_time_in_days).run end