-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBank Simulater Waiting Project.py
132 lines (107 loc) · 3.76 KB
/
Bank Simulater Waiting Project.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# Create Data Stractures
class Node:
# Define Constractor Function
def __init__(self,data) -> int:
self.data = data
self.next = None
class LinkedQueue:
# Define Constractor Function
def __init__(self):
self.queue = None
# Define Enqueue Function (To Put New Element)
def enqueue(self,item):
newNode = Node(item)
# Check if queue is empty
if self.queue is None:
self.queue = newNode
# Queue not empty
else:
temp = self.queue
while temp.next:
temp = temp.next
temp.next = newNode
# Define Dequeue Function (To Delete First Element)
def dequeue(self):
if self.queue is not None:
temp = self.queue
self.queue = self.queue.next
temp = None
# To get Front Of Queue
def getFrontData(self):
data = self.queue.data
return data
class OrderedQueue(LinkedQueue):
# Define Constractor
def __init__(self):
self.queue = None
# Override Enqueue Function
def enqueue(self, item):
newNode = Node(item)
# if queue is empty
if self.queue is None:
self.queue = newNode
# if queue is not empty
else:
temp = self.queue
# if New Element > the first element in Queue
if item > temp.data:
# To point to correct position in Ordered Queue
while temp.next and item > temp.next.data:
temp = temp.next
# insert new item in the correct position
newNode.next = temp.next
temp.next = newNode
# if New Element <= the first element in Queue
else:
# insert new item in front
newNode.next = temp
self.queue = newNode
# Get Minimum Element in Ordared Queue
def getMini(self):
data = self.queue.data
return data
# Initilize 3 Queues
waitQ = LinkedQueue()
WaitAndServQ = LinkedQueue()
OrderedQ = OrderedQueue()
# Read Configuration File
file = "G:\\MeMe\\Programming\\data.ini" ### change Path in your pc
config = open(file,"r")
# take all data from file
lines = list(config.readlines())
numOfTellers = int(lines[0][11:-1])
counter = 0
# Build 3 LinkedQueues
for i in range(1,len(lines)):
# Take Arrival Time & Service Time line by line
arrival = int(lines[i][8:-12])
service = int(lines[i][19:-1])
# Check If tellers is NOT busy
if counter < numOfTellers:
waitQ.enqueue(0)
WaitAndServQ.enqueue(service)
OrderedQ.enqueue(arrival + service)
counter += 1
# Check If tellers is busy
else:
OldCustTime = OrderedQ.getMini()
# Check if old customer has NOT gone To new customer wait him
if OldCustTime > arrival:
wait = (OldCustTime - arrival) # Waiting Time
waitQ.enqueue(wait)
WaitAndServQ.enqueue(wait + service)
OrderedQ.enqueue(OldCustTime + service)
OrderedQ.dequeue()
# Check if old customer has gone To new customer take his position
else:
waitQ.enqueue(0)
WaitAndServQ.enqueue(service)
OrderedQ.enqueue(arrival + service)
OrderedQ.dequeue()
# Display Results
for _ in range(1,len(lines)):
print(f"wait: {waitQ.getFrontData()} waitandservice {WaitAndServQ.getFrontData()}")
waitQ.dequeue()
WaitAndServQ.dequeue()
# Close File
config.close()