Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import random
- from collections import deque
- completedTotal = 0 #всего обслужено клиентов
- leavedTotal = 0 #всего ушло клиентов
- queueTimeTotal = 0.0 #общее время в очереди
- simulationCount = 100 #число симуляций
- firstTypeIncomeTime = [8.0, 3.0] #частота появления клиентов первого типа; 8 +/- 3
- secondTypeIncomeTime = [10.0, 5.0] #частота появления клиентов второго типа
- firstTypeWorkTime = [28.0, 6.0] #стрижка по времени
- secondTypeWorkTime = [28.0 + 10.0, 6.0 + 2.0] #стрижка + бритье по времени
- masterCount = 4 #число мастеров
- chairCount = 3 #число стульев для ожидания
- WorkTimeTotal = [0.0 for x in xrange(masterCount)] #сколько проработал каждый мастер
- timelineMax = 8.0 * 60.0 #рабочий день
- def getRandomTime(timeTuple):
- return random.gauss (timeTuple[0], timeTuple[1])
- #находит время до следующего события (когда одна из переменных времени станет 0)
- def findNextEvent(nextFirstType, nextSecondType, workPlaces):
- greaterZero = list()
- for x in xrange(masterCount):
- if workPlaces[x] > 0:
- greaterZero.append(workPlaces[x])
- if len(greaterZero) > 0:
- return min(nextFirstType, nextSecondType, min(greaterZero))
- else:
- return min(nextFirstType, nextSecondType)
- #функция, прабавляющая ко всем переменным -timeDelta времени
- #т.к. timeDelta равна минимальному времени до следующего события, то одна, или несколько, переменных станет 0
- def updateTime(nextFirstType, nextSecondType, isChairBusy, timeline, timeDelta):
- nextFirstType -= timeDelta
- nextSecondType -= timeDelta
- if len(isChairBusy) > 0:
- for x in range(len(isChairBusy)):
- isChairBusy[x] = (isChairBusy[x][0], isChairBusy[x][1] + timeDelta)
- timeline += timeDelta
- return (nextFirstType, nextSecondType, isChairBusy, timeline)
- #пришел новый посетитель типа type, он попадет в очередь, если есть место, иначе уйдет
- def newCustomer(someTypeIncomeTime, isChairBusy, type, leavedTotal):
- nextApproach = getRandomTime(someTypeIncomeTime)
- if len(isChairBusy) < chairCount: #есть ли свободное кресло ожидания
- isChairBusy.append((type, 0.0))
- else:
- leavedTotal += 1
- return (isChairBusy, nextApproach, leavedTotal)
- for i in xrange(simulationCount):
- nextFirstType = getRandomTime(firstTypeIncomeTime)
- nextSecondType = getRandomTime(secondTypeIncomeTime)
- isMasterBusy = [0.0 for x in range(masterCount)]
- isChairBusy = deque()
- timeline = 0.0
- while timeline < timelineMax:
- timeDelta = findNextEvent(nextFirstType, nextSecondType, isMasterBusy)
- for x in range(masterCount):
- isMasterBusy[x] -= timeDelta #отрицательные величины значат ожидание мастером
- for x in range(masterCount):
- if isMasterBusy[x] <= 0 and len(isChairBusy) > 0:
- clientType, waitingTime = isChairBusy.pop()
- nextWorkTime = 0
- if clientType == 1:
- nextWorkTime = getRandomTime(firstTypeWorkTime) #мастер начал работу по подстрижке
- elif clientType == 2:
- nextWorkTime = getRandomTime(secondTypeWorkTime) #мастер начал работу по подстрижке и бритью
- if nextWorkTime <= timelineMax - timeline: #если не успеваем обслужить клиента -- отправляем его домой
- isMasterBusy[x] = nextWorkTime
- WorkTimeTotal[x] += isMasterBusy[x] #если мастер начал работу, он ее закончит, поэтому сразу учтем это время в отработаном для статичтики
- completedTotal += 1
- queueTimeTotal += waitingTime
- else:
- leavedTotal += 1
- nextFirstType, nextSecondType, isChairBusy, timeline = updateTime(nextFirstType, nextSecondType, isChairBusy, timeline, timeDelta)
- if nextFirstType <= 0: #пришел новый посититель типа 1
- isChairBusy, nextFirstType, leavedTotal = newCustomer(firstTypeIncomeTime, isChairBusy, 1, leavedTotal)
- if nextSecondType <= 0: #пришел новый посетитель типа 2
- isChairBusy, nextSecondType, leavedTotal = newCustomer(secondTypeIncomeTime, isChairBusy, 2, leavedTotal)
- #парикмахерская закрылась
- for x in xrange(len(isChairBusy)): #ушедшие, после закрытия, клиенты
- leavedTotal += 1
- print "srednee chislo obsluzhennyh klientov"
- print completedTotal / simulationCount
- print "srednee chislo neobsluzhennyh klientov"
- print leavedTotal / simulationCount
- print "srednee vremya ozhidaniya v ocheredi"
- print str(queueTimeTotal / completedTotal) + " min"
- print "koehfficient zagruzki masterov"
- for x in xrange(len(WorkTimeTotal)):
- print "master #" + str(x) + ' ' + str(WorkTimeTotal[x] / (timelineMax * simulationCount) * 100) + '%'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement