Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.40 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import random
  5. from collections import deque
  6.  
  7. completedTotal = 0 #всего обслужено клиентов
  8. leavedTotal = 0 #всего ушло клиентов
  9. queueTimeTotal = 0.0 #общее время в очереди
  10. simulationCount = 100 #число симуляций
  11.  
  12. firstTypeIncomeTime = [8.0, 3.0] #частота появления клиентов первого типа; 8 +/- 3
  13. secondTypeIncomeTime = [10.0, 5.0] #частота появления клиентов второго типа
  14.  
  15. firstTypeWorkTime = [28.0, 6.0] #стрижка по времени
  16. secondTypeWorkTime = [28.0 + 10.0, 6.0 + 2.0] #стрижка + бритье по времени
  17.  
  18. masterCount = 4 #число мастеров
  19. chairCount = 3 #число стульев для ожидания
  20.  
  21. WorkTimeTotal = [0.0 for x in xrange(masterCount)] #сколько проработал каждый мастер
  22.  
  23. timelineMax = 8.0 * 60.0 #рабочий день
  24.  
  25. def getRandomTime(timeTuple):
  26. return random.gauss (timeTuple[0], timeTuple[1])
  27.  
  28. #находит время до следующего события (когда одна из переменных времени станет 0)
  29. def findNextEvent(nextFirstType, nextSecondType, workPlaces):
  30. greaterZero = list()
  31. for x in xrange(masterCount):
  32. if workPlaces[x] > 0:
  33. greaterZero.append(workPlaces[x])
  34. if len(greaterZero) > 0:
  35. return min(nextFirstType, nextSecondType, min(greaterZero))
  36. else:
  37. return min(nextFirstType, nextSecondType)
  38.  
  39. #функция, прабавляющая ко всем переменным -timeDelta времени
  40. #т.к. timeDelta равна минимальному времени до следующего события, то одна, или несколько, переменных станет 0
  41. def updateTime(nextFirstType, nextSecondType, isChairBusy, timeline, timeDelta):
  42. nextFirstType -= timeDelta
  43. nextSecondType -= timeDelta
  44. if len(isChairBusy) > 0:
  45. for x in range(len(isChairBusy)):
  46. isChairBusy[x] = (isChairBusy[x][0], isChairBusy[x][1] + timeDelta)
  47. timeline += timeDelta
  48. return (nextFirstType, nextSecondType, isChairBusy, timeline)
  49.  
  50. #пришел новый посетитель типа type, он попадет в очередь, если есть место, иначе уйдет
  51. def newCustomer(someTypeIncomeTime, isChairBusy, type, leavedTotal):
  52. nextApproach = getRandomTime(someTypeIncomeTime)
  53. if len(isChairBusy) < chairCount: #есть ли свободное кресло ожидания
  54. isChairBusy.append((type, 0.0))
  55. else:
  56. leavedTotal += 1
  57. return (isChairBusy, nextApproach, leavedTotal)
  58.  
  59.  
  60. for i in xrange(simulationCount):
  61. nextFirstType = getRandomTime(firstTypeIncomeTime)
  62. nextSecondType = getRandomTime(secondTypeIncomeTime)
  63.  
  64. isMasterBusy = [0.0 for x in range(masterCount)]
  65. isChairBusy = deque()
  66.  
  67. timeline = 0.0
  68.  
  69. while timeline < timelineMax:
  70. timeDelta = findNextEvent(nextFirstType, nextSecondType, isMasterBusy)
  71.  
  72. for x in range(masterCount):
  73. isMasterBusy[x] -= timeDelta #отрицательные величины значат ожидание мастером
  74.  
  75. for x in range(masterCount):
  76. if isMasterBusy[x] <= 0 and len(isChairBusy) > 0:
  77. clientType, waitingTime = isChairBusy.pop()
  78. nextWorkTime = 0
  79. if clientType == 1:
  80. nextWorkTime = getRandomTime(firstTypeWorkTime) #мастер начал работу по подстрижке
  81. elif clientType == 2:
  82. nextWorkTime = getRandomTime(secondTypeWorkTime) #мастер начал работу по подстрижке и бритью
  83. if nextWorkTime <= timelineMax - timeline: #если не успеваем обслужить клиента -- отправляем его домой
  84. isMasterBusy[x] = nextWorkTime
  85. WorkTimeTotal[x] += isMasterBusy[x] #если мастер начал работу, он ее закончит, поэтому сразу учтем это время в отработаном для статичтики
  86. completedTotal += 1
  87. queueTimeTotal += waitingTime
  88. else:
  89. leavedTotal += 1
  90.  
  91. nextFirstType, nextSecondType, isChairBusy, timeline = updateTime(nextFirstType, nextSecondType, isChairBusy, timeline, timeDelta)
  92.  
  93. if nextFirstType <= 0: #пришел новый посититель типа 1
  94. isChairBusy, nextFirstType, leavedTotal = newCustomer(firstTypeIncomeTime, isChairBusy, 1, leavedTotal)
  95.  
  96. if nextSecondType <= 0: #пришел новый посетитель типа 2
  97. isChairBusy, nextSecondType, leavedTotal = newCustomer(secondTypeIncomeTime, isChairBusy, 2, leavedTotal)
  98.  
  99. #парикмахерская закрылась
  100.  
  101. for x in xrange(len(isChairBusy)): #ушедшие, после закрытия, клиенты
  102. leavedTotal += 1
  103.  
  104. print "srednee chislo obsluzhennyh klientov"
  105. print completedTotal / simulationCount
  106.  
  107. print "srednee chislo neobsluzhennyh klientov"
  108. print leavedTotal / simulationCount
  109.  
  110. print "srednee vremya ozhidaniya v ocheredi"
  111. print str(queueTimeTotal / completedTotal) + " min"
  112.  
  113. print "koehfficient zagruzki masterov"
  114. for x in xrange(len(WorkTimeTotal)):
  115. print "master #" + str(x) + ' ' + str(WorkTimeTotal[x] / (timelineMax * simulationCount) * 100) + '%'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement