본문 바로가기
  • _^**_
무근본 IT 지식 공유/무근본 파이썬(Python)

[무근본 파이썬] 파이썬 커피가게 큐 대기인원 코드

by 크리드로얄워터 2023. 4. 18.
반응형

[질문]

 

파이썬으로 커피가게의 큐 대기인원 코드를 작성하시오


- 오전 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}")

 

이 코드는 시뮬레이션 실행 후, 큐 대기 시간의 평균과 최대값, 빈 횟수, 버려진 고객 수를 계산하여 출력합니다. 결과는 실행할 때마다 다르게 나올 수 있으므로, 여러 번 실행하여 결과를 확인하는 것이 좋습니다.

반응형

댓글