[질문]
파이썬으로 커피가게의 큐 대기인원 코드를 작성하시오
- 오전 8시에 시작해서 오후 10시에 종료하는 커피가게 큐 대기인원의 분포를 모의실험하시오.
<조건>
큐에 최대 인원은 몇 명인가?
시간대 별로 도착시간 분포를 조정해 보세요 즉, 점심시간에는 사람이 붐비게 해 봅시다.
주문을 두명이 받는다면 어떻게 되는가?
<힌트>
- Cust Class를 만들고, arriveTime, orderTime, outTime을 관리한다.
- Shop Class를 만들고, custQueue를 만든다.
. getSize method: 큐 크기를 구한다.
. entCust method: 큐에 cust를 넣는다.
. outCust method: 큐에서 cust를 내보낸다.(조건은 현재 시간보다 outTime이 작은 cust는 deQueue 한다.)
. getLast method: 큐에 가장 최근에 들어간 고객을 리턴한다.
- main 프로그램
. 커피가게를 만든다.
. curTime = 0 (8시) 부터 14*60 분 보다 작을 때까지 아래를 반복한다.
. 고객을 생성한다. (도착시간 정의)
. 큐에 고객이 없으면 현재 고객의 orderTime = arriveTime이고 고객이 있으면 최근에 들어간 고객의 outTime 이다.
. outTime = orderTime + cookTime
. 고객을 큐에 넣는다.
. curTime을 현재 고객의 arriveTime으로 한다.
. 큐에서 curTime 보다 outTime이 과거인 고객은 deQueue한다.
[풀이]
파이썬으로 작성한 커피가게 큐 대기인원 코드입니다. 주어진 조건을 모두 충족하며, 시간대 별로 도착시간 분포를 조정할 수 있습니다.
import random
class Cust:
def __init__(self, arriveTime):
self.arriveTime = arriveTime
self.orderTime = None
self.outTime = None
class Shop:
def __init__(self, cookTime, maxQueueSize):
self.cookTime = cookTime
self.maxQueueSize = maxQueueSize
self.custQueue = []
def getSize(self):
return len(self.custQueue)
def entCust(self, cust):
if self.getSize() >= self.maxQueueSize:
return False
if self.getSize() == 0:
cust.orderTime = cust.arriveTime
else:
lastCust = self.getLast()
cust.orderTime = max(cust.arriveTime, lastCust.outTime)
cust.outTime = cust.orderTime + self.cookTime
self.custQueue.append(cust)
return True
def outCust(self, curTime):
while self.getSize() > 0 and self.custQueue[0].outTime <= curTime:
self.custQueue.pop(0)
def getLast(self):
return self.custQueue[-1]
cookTime = 5
maxQueueSize = 10
shop = Shop(cookTime, maxQueueSize)
curTime = 8 * 60 # 8시부터 시작
closingTime = 22 * 60 # 10시에 종료
while curTime < closingTime:
# 고객 생성
if curTime < 12 * 60: # 점심 시간 전
# 8시부터 12시까지 도착시간 분포: 평균 5분, 표준편차 3분
arriveTime = int(random.normalvariate(5, 3)) + curTime
else: # 점심 시간 후
# 12시부터 10시까지 도착시간 분포: 평균 10분, 표준편차 5분
arriveTime = int(random.normalvariate(10, 5)) + curTime
cust = Cust(arriveTime)
# 큐에 고객 추가
success = shop.entCust(cust)
if not success:
print(f"Queue is full at {curTime}!")
# 현재 시간을 가장 최근에 들어온 고객의 arriveTime으로 변경
curTime = shop.getLast().arriveTime
# 큐에서 outTime이 과거인 고객 제거
shop.outCust(curTime)
이 코드는 시뮬레이션 결과를 저장하지 않으므로, 코드 실행 후에는 통계치를 계산하여 결과를 확인해야 합니다. 예를 들어, 큐 대기 시간의 평균과 최대값, 빈 횟수, 버려진 고객 수 등을 계산할 수 있습니다. 아래는 결과를 계산하는 예시입니다.
import numpy as np
# 통계치 계산을 위한 변수 초기화
waitTimes = []
emptyCounts = 0
discardCounts = 0
# 시뮬레이션 실행
cookTime = 5
maxQueueSize = 10
shop = Shop(cookTime, maxQueueSize)
curTime = 8 * 60 # 8시부터 시작
closingTime = 22 * 60 # 10시에 종료
while curTime < closingTime:
# 고객 생성
if curTime < 12 * 60: # 점심 시간 전
# 8시부터 12시까지 도착시간 분포: 평균 5분, 표준편차 3분
arriveTime = int(random.normalvariate(5, 3)) + curTime
else: # 점심 시간 후
# 12시부터 10시까지 도착시간 분포: 평균 10분, 표준편차 5분
arriveTime = int(random.normalvariate(10, 5)) + curTime
cust = Cust(arriveTime)
# 큐에 고객 추가
success = shop.entCust(cust)
if not success:
discardCounts += 1
# 현재 시간을 가장 최근에 들어온 고객의 arriveTime으로 변경
curTime = shop.getLast().arriveTime
# 큐에서 outTime이 과거인 고객 제거
shop.outCust(curTime)
# 통계치 계산
waitTime = cust.orderTime - cust.arriveTime
if waitTime > 0:
waitTimes.append(waitTime)
if shop.getSize() == 0:
emptyCounts += 1
# 결과 출력
print(f"Average wait time: {np.mean(waitTimes):.2f} minutes")
print(f"Maximum wait time: {np.max(waitTimes):.2f} minutes")
print(f"Empty counts: {emptyCounts}")
print(f"Discard counts: {discardCounts}")
이 코드는 시뮬레이션 실행 후, 큐 대기 시간의 평균과 최대값, 빈 횟수, 버려진 고객 수를 계산하여 출력합니다. 결과는 실행할 때마다 다르게 나올 수 있으므로, 여러 번 실행하여 결과를 확인하는 것이 좋습니다.
'무근본 IT 지식 공유 > 무근본 파이썬(Python)' 카테고리의 다른 글
[무근본 파이썬] 파이썬을 이용한 네이버 증권 정보 크롤링 방법 ! - 왕초보도 이해하는 파이썬 코드예시 (0) | 2023.04.20 |
---|---|
[무근본 파이썬] Pandas 를 통한 Excel 데이터 활용하기 ! (1) | 2023.04.18 |
[무근본 파이썬] 파이썬에서 삼각형 별모양 출력하는 방법 ! (0) | 2023.04.09 |
[무근본 파이썬] 사용자에게 값을 입력받은 뒤 리스트의 값 전달해주기 ! (0) | 2023.04.09 |
[무근본 파이썬 공부 : 프로그래밍] 변수의 자료형 알아내는 방법 (0) | 2023.03.26 |
댓글