queue_system 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1de39cc2ce439234049dd896fafcb7a0f9f85d6b9a413092dc27a173f2e0e78c
4
+ data.tar.gz: cd789c19ad0b6944c83949b3c77102251efb53ec73c5ff390be7d19a6552cb25
5
+ SHA512:
6
+ metadata.gz: 3f89799561d54daf3742fc0ef58afe07d4cad3c5c6fc1f9c5562ae334c3cf05526948f2abb697d5d80371d8c205f2fbb253f20de19d31afd82c3287d9be18a80
7
+ data.tar.gz: e1f54a01ca35782832cccfacb4976c4cde19835513983225c342b904d84f3a6bbe3169a1b477575d42e9b41ae70d4bf16ade2f4fcf2a9634843df309b32ead14
@@ -0,0 +1,19 @@
1
+ module QueueSystem
2
+ class Customer
3
+ attr_reader :id, :arrival_time, :service_time, :wait_time, :departure_time
4
+
5
+ def initialize(arrival_time)
6
+ @id = SecureRandom.uuid[0..7]
7
+ @arrival_time = arrival_time
8
+ @service_time = generate_service_time
9
+ @wait_time = 0
10
+ @departure_time = nil
11
+ end
12
+
13
+ private
14
+
15
+ def generate_service_time
16
+ rand(1..10)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,60 @@
1
+ module QueueSystem
2
+ class ServiceQueue
3
+ attr_reader :customers, :stats
4
+
5
+ def initialize
6
+ @customers = []
7
+ @current_time = 0
8
+ @stats = {
9
+ total_customers: 0,
10
+ avg_wait_time: 0,
11
+ avg_system_time: 0,
12
+ server_utilization: 0
13
+ }
14
+ end
15
+
16
+ def simulate(duration:, arrival_rate:)
17
+ server_busy_until = 0
18
+
19
+ while @current_time < duration
20
+ if rand < arrival_rate
21
+ customer = Customer.new(@current_time)
22
+ process_customer(customer, server_busy_until)
23
+ server_busy_until = calculate_server_busy_time(customer, server_busy_until)
24
+ @customers << customer
25
+ end
26
+
27
+ @current_time += 1
28
+ end
29
+
30
+ calculate_statistics(duration)
31
+ end
32
+
33
+ private
34
+
35
+ def process_customer(customer, server_busy_until)
36
+ customer.instance_variable_set(:@wait_time, [0, server_busy_until - customer.arrival_time].max)
37
+ service_start = [server_busy_until, customer.arrival_time].max
38
+ customer.instance_variable_set(:@departure_time, service_start + customer.service_time)
39
+ end
40
+
41
+ def calculate_server_busy_time(customer, current_busy_until)
42
+ [current_busy_until, customer.departure_time].max
43
+ end
44
+
45
+ def calculate_statistics(duration)
46
+ return if @customers.empty?
47
+
48
+ total_wait_time = @customers.sum(&:wait_time)
49
+ total_system_time = @customers.sum { |c| c.departure_time - c.arrival_time }
50
+ total_service_time = @customers.sum(&:service_time)
51
+
52
+ @stats = {
53
+ total_customers: @customers.size,
54
+ avg_wait_time: total_wait_time.to_f / @customers.size,
55
+ avg_system_time: total_system_time.to_f / @customers.size,
56
+ server_utilization: (total_service_time.to_f / duration) * 100
57
+ }
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,7 @@
1
+ require 'securerandom'
2
+ require_relative 'queue_system/customer'
3
+ require_relative 'queue_system/service_queue'
4
+
5
+ module QueueSystem
6
+ VERSION = '0.1.0'
7
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: queue_system
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Your Name
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-01-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Simulador de fila com estatísticas de atendimento
28
+ email:
29
+ - your.email@example.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/queue_system.rb
35
+ - lib/queue_system/customer.rb
36
+ - lib/queue_system/service_queue.rb
37
+ homepage: ''
38
+ licenses:
39
+ - MIT
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubygems_version: 3.4.10
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: Sistema de simulação de fila de atendimento
60
+ test_files: []