Skip to content
Snippets Groups Projects
Commit 16779950 authored by pjs's avatar pjs
Browse files

code cleanup on AoModel

parent 4d452ee5
No related branches found
No related tags found
No related merge requests found
#!/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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment